今回はtesseracrt-ocr の認識率をあげるやめ、トレーニングを行ってみる。

前回はC++での開発に必要となるライブラリのみをダウンロードしたのだが、トレーニングを行うためにはツール類が必要となるため、セットアップからインストールし直すことにする。セットアップ tesseract-ocr-setup-3.02.02.exe が、前回と同じく以下のページからダウンロードできる。
https://code.google.com/p/tesseract-ocr/downloads/list

セットアップを実行すると、デフォルトでは「C:\Program Files (x86)\Tesseract-OCR」にインストールされる。インストール先は環境変数にも TESSDATA_PREFIX として登録される模様。このフォルダの中に tessdata フォルダも作られており、以後このフォルダのトレーニングデータが参照される。

また、トレーニングを行うとき、Boxファイルを修正する段階で使うツールをダウンロードしておく。同様のツールはいくつかあるようだが、今回は QT Box Editor を使う。以下からバイナリ版がダウンロードでき、ここでは 「qt-box-editor-1.08win32.zip — Win32 static build of QT Box Editor 1.08」 をダウンロードした。
https://github.com/zdenop/qt-box-editor/downloads

QT Box Editor は起動して、Editor > Settings から設定を行っておく。環境変数 TESSDATA_PREFIX の値と言語を設定する。
ocr7
および、Font & Colors から以下も設定しておく。
ocr8

トレーニングの手順としてはざっと以下のような感じかと思う。
1. 画像の作成
2. Boxファイル作成
3.トレーニングの実行 4.キャラクターセットの計算
5. font_propertiesファイル作成
6. クラスタリング
7. 生成されたファイルのリネーム
8.1ファイルにまとめる


1. 画像の作成
特定のフォントのテキストが含まれる画像を用意する。形式は何でもいいと思うが、QT Box Editor が読み込める形式として jpeg にしておく。また、後々のためにファイル名を [言語コード].[フォント名].exp[連番] のとしておく。例えば「jpn.mincho.exp0.jpg」など。

2. Boxファイル作成
以下のコマンドで画像ファイルからBoxファイルを作成する。
>tesseract jpn.mincho.exp0.jpg jpn.mincho.exp0 -l jpn batch.nochop makebox

また、QT Box Editorに画像をドロップすると、まだBoxファイルが作られていなければ、以下のダイアログが表示されるので、Yes で Boxファイルを作ってくれる。
ocr9

Boxファイルは、画像と同じフォルダに jpn.mincho.exp0.box という名前で作成される。単なるテキストファイルで、画像ファイルから読み取った文字と座標が列挙されている。以下はQT Box EditorでBoxファイルを開いたところだが、左側にそれらの情報が表示されている。QT Box Editorはこの文字と座標の修正を行うために使う。
ocr10

左側で文字を選択すると、右側の画像の対応する位置に赤い枠が表示される。ここでは「は」の左側だけが「乙」として認識されているので修正する必要がありそうだ。赤い文字は前後数文字分の読み取り結果で、画像の対応する位置の少し上に表示される。 ocr11

おかしいところを修正した。これでBoxファイルを上書き保存する。
ocr12

3.トレーニングの実行
以下のコマンドを実行し、ファイル jpn.mincho.exp0.tr を生成される。
>tesseract jpn.mincho.exp0.jpg jpn.mincho.exp0 nobatch box.train.stderr


4.キャラクターセットの計算
以下のコマンドを実行し、ファイル unicharset を生成される。
>unicharset_extractor jpn.mincho.exp0.box


5. font_propertiesファイル作成
ファイル名 font_properties でファイルを作成する。内容は以下。
mincho 0 0 0 0 0


6. クラスタリング
次のコマンドを実行し、以下の4ファイルを作成する。
・shapetable
・inttemp
・pffmtable
・jpn.unicharset
>mftraining -F font_properties -U unicharset -O jpn.unicharset jpn.mincho.exp0.tr


続けて、次のコマンドを実行し、以下のファイルを作成する。
・normproto
>cntraining jpn.mincho.exp0.tr


7. 生成されたファイルのリネーム
>ren inttemp     jpn.inttemp
>ren shapetable  jpn.shapetable
>ren pffmtable   jpn.pffmtable
>ren normproto   jpn.normproto


8.1ファイルにまとめる
次のコマンドを実行し、jpn.traineddata を生成する。
>combine_tessdata jpn.


生成されたファイルがトレーニングデータとなる。jpn.traineddata は元々存在した jpn.traineddata を上書きしないよう jpn1.traineddata という名前に変更して、tessdata フォルダに置く。

プログラムから使う場合、以下のようにする。ちなみに Init メソッドの最初の引数は tessdata フォルダを指すが、tesseract-ocr をインストールしたことによりわざわざ指定する必要がなくなったため、NULLにしてある。
	tesseract::TessBaseAPI tess;
	tess.Init(NULL, "jpn1+jpn");


認識結果がこれ。若干認識率がマシになった気がする。。。程度か。
ocr13

以上です。