Javaを使って画像から文字を認識

こんにちは、アプリケーションエンジニアの星です。
最近、ディープラーニングについて勉強を始めています。
しかし、調べてみると数式が出てきたり・・となかなか手ごわいです。

もっと取っ付き易いものはないかな?と調べているうちに機械学習を利用した画像認識や文字認識に行き当たりました。

画像認識を紹介できればカッコよかったのですが、まだ把握できていないので、今回はJavaでの実装が簡単だった文字認識について紹介したいと思います。
(機械学習の話題を出しておいて恐縮ですが、機械学習要素は無いです)

Javaで文字認識を行うには「Tess4J」というライブラリを使用します。

導入方法

1. 取得
以下のサイトでライブラリをダウンロードします。
https://sourceforge.net/projects/tess4j/files/tess4j/3.3.1/
ダウンロードしたzipファイルを解答すると「Tess4J」フォルダがあるはずです。
「Tess4J」フォルダは後から参照を行うのでわかりやすい場所に配置してください。

2. ビルドパスの設定
「Tess4J」フォルダ内の「dist」フォルダと「lib」フォルダがあるのでその中のjarファイルすべてをビルドパスに追加してもらえればOKです。
3. ソースコード

public class OCRTest {
public static void main(String[] args) throws IOException, TesseractException {
//画像読み込み
File target = new File("C:\\temp\\moji.jpg");
BufferedImage image = ImageIO.read(target);

//解析
ITesseract tesseract = new Tesseract();
tesseract.setDatapath("C:\\Tess4J\\tessdata");
tesseract.setLanguage("eng");
List wordList = tesseract.getWords(image, TessPageIteratorLevel.RIL_BLOCK);
String str = tesseract.doOCR(image);
//結果出力
System.out.println(wordList);
System.out.println(str);
}
}
これだけで簡単な文字認識ができます

「”C:\temp\moji.jpg”」が文字認識の対象となる画像です。下図のペイントで手書きした画像になります。
文字を認識1 「”C:\Tess4J\tessdata”」は「Tess4J」フォルダ内の設定ファイルとなっています。「Tess4J」フォルダを配置したパスにあわせて設定してください。

4.実行結果
文字を認識1

[RISE
WlLL

[Confidence: 56.706688 Bounding box: 21 17 383 212]]
RISE
WlLL
うまく「RISEWILL」文字が認識されました!

RISEWILLのロゴでも試してみました。image2

[RISE

[Confidence: 87.269112 Bounding box: 1 4 81 29]]
RISE
「RISE」は読み取れていますが「WILL」は読み取れていません。
どうも色がグレイスケールじゃないとだめみたいです。

色をグレイスケールにして確認image3

[RISEéi/ILL

[Confidence: 57.493725 Bounding box: 1 4 162 29]]
RISEéi/ILL
さすがにWの文字はデザインされているため正常に認識できなかったですが、ほぼほぼ認識できています。

まとめ

以上、Javaによる文字認識でした。

「Tesseract-OCR」という「Tess4J」のC++版もあるのですが、そちらでは精度があまりよくないらしい記事を見たので難しいかもしれません。
ただ、「Tesseract-OCR」も「Tess4J」も機械学習によって認識の精度を高めることができるので、いろいろ試してみたいと思います。
株式会社ライズウィル

株式会社ライズウィル

〒103-0013
東京都中央区日本橋人形町2-15-1
フジタ人形町ビル7F
TEL : 03-4590-3200
FAX : 03-4590-3201
E-Mail : info@risewill.co.jp
URL : https://www.risewill.co.jp