読者です 読者をやめる 読者になる 読者になる

はだしの元さん

プログラミングの技術的なことを忘備録かねて書いていこうと思っています。

Tesseract-OCRの学習

Tesseract-OCRはHPが開発し現在はGoogleが公開しているオープンソースOCRエンジンです。
オープンソースのOCRエンジン Tesseract-OCRでTesseeract-OCRで日本語の読み込みまでは説明しました。

今回はTesseract-OCR機械学習を行い精度を向上させるための方法を説明します。
僕は基本的に以下の公式のチュートリアルを読みながらやって行きました。

Tesseract Training Wiki
https://code.google.com/p/tesseract-ocr/wiki/TrainingTesseract3

大まかにやることは3つあります。

  1. boxファイルの作成 
  2. trファイルの作成
  3. トレーニングデータの作成

boxファイルの作成

まず学習したい画像ファイルを用意します。今回は以下の画像(train_img.png)を使用しました。
f:id:hadashi_gensan:20140115113722p:plain

次に以下のコマンドを実行します。

tesseract train_img.png jpn.hiragi.exp0 -l jpn batch.nochop makebox

ここでboxファイルのファイル名には以下のような命名規則があるので気をつけてください。

(3文字の言語名).(フォント名(任意)).exp(インデックス番号)

3文字の言語名は以下のサイトを参考して目的の言語を選んでください。日本はjpnです。
http://ja.wikipedia.org/wiki/ISO_639

インデックス番号はTesseract-OCRは同時に複数の画像を学習できるのでそのときに連番をつけて識別します。
今回は1枚の画像だけなので、0しか使いません。

成功するとjpn.hiragi.exp0.boxというファイルが出力されます。
テキストエディタで開くと以下のようになっていると思います。

M 4 6 22 30 0
u 23 5 39 23 0
C 42 5 57 24 0
i 59 6 73 31 0
n 77 6 93 24 0
t 95 5 111 28 0
0 112 5 130 24 0
S 132 5 147 24 0
h 149 6 165 30 0
ニ 172 5 178 24 0
0 184 5 202 24 0
p 203 0 219 24 0
e 221 5 237 24 0
n 239 6 255 24 0
C 258 5 273 24 0
V 274 6 292 23 0
y 310 0 328 23 0
q 329 5 345 24 0
m 346 6 364 24 0
G 365 5 381 24 0
伽 382 5 418 24 0
t 419 5 435 29 0
。 436 5 454 24 0

これは1行につき1文字文の情報が書かれています。
この情報の見方は以下の通りです。

読み込んだ文字 x1 y1 x2 y2 インデックス番号
M 4 6 22 30 0

f:id:hadashi_gensan:20140115150111p:plain

しかしこのデータをよく見てみると、実際の文字とは間違っているところがたくさんあると思います。
Tesseract-OCRの学習ではこの間違いを修正して、教える事で精度の向上ができます。
以下のように読み込んだ文字や座標の修正を行って保存します。

読み込んだ文字 左上のx座標 左上のy座標 右下のx座標 右下のy座標 インデックス番号
M 4 6 22 30 0
a 23 5 39 23 0

今回は一部しか示しませんが、実際は全ての文字と座標について修正を加えます。

trファイルの作成

次にtrファイルを作成します。
このときに使用していた画像のファイル名もboxファイルと同じ名前にする必要があります。
boxファイルの作成にしようした画像ファイルのファイル名を以下のように変更します。

jpn.hiragi.exp0.png

ファイル名を変更したら以下のコマンドを実行します。

tesseract jpn.hiragi.exp0.png jpn.hiragi.exp0 nobatch box.train.stderr

jpn.hiragi.exp0.trというファイルが出力されれば成功です。

トレーニングデータの作成

トレーニングを行う前に

  1. unicharsetファイル
  2. font_propertiesファイル

という2つのファイルを作成します。2つともTesseract-OCRに文字のフォント情報等を教えるために必要なファイルです。

unicharsetファイル

以下のコマンドを実行します。ここでboxファイルを指定するときにここでは拡張子を含む事に注意してください。

unicharset_extractor jpn.hiragi.exp0.box
font_propertiesファイル

このファイルは直接テキストエディタを使って作成します。
以下の1行だけからなる「font_properties(拡張子なし)」というテキストファイルを作成してください。

hiragi 0 0 0 0 0

このファイルは

フォント名(boxファイルのファイル名で指定した物と同名) italic bold fixed serif fraktur
hiragi 0 0 0 0 0

という順でデータが並んでいます。
italicなフォントを使用した場合は以下のようになるイメージです。

フォント名 italic bold fixed serif fraktur
hiragi 1 0 0 0 0
学習

unicharsetとfont_propertiesの2つのファイルを作ったら、以下のコマンドで学習を行います。

mftraining -F font_properties -U unicharset jpn.hiragi.exp0.tr 

成功すると以下のファイルが出力されます。

  • inttemp
  • shapetable
  • pffmtable

続いて次のコマンドを実行します。

 mftraining -F font_properties -U unicharset -O jpn.unicharset unicharset jpn.hiragi.exp0.tr

さらに次のコマンドを実行します。

cntraining jpn.hiragi.exp0.tr

このコマンドでnormprotoというファイルが作成されます。

次に今まで作成したファイルのファイル名を変更します。

  • inttemp
  • shapetable
  • pffmtable
  • normproto

というファイルの先頭に「jpn.」をつけます。
変更後

  • jpn.inttemp
  • jpn.shapetable
  • jpn.pffmtable
  • jpn.normproto

というファイル名に変更します。

ファイル名を変更したら以下のコマンドを実行します。

combine_tessdata jpn.

最後のドットを忘れないようにしてください。
成功するとjpn.traineddataというファイルが作られているはずです。

最後に以下のコマンドで「/usr/local/share/tessdata/」に生成したjpn.traineddataファイルをコピーしたら完了です。

cp jpn.traineddata /usr/local/share/tessdata/

以上でTesseract-OCRの簡単な学習方法の説明は完了です。
しかし今回はたった1枚の画像でしか学習していませんが、これを複数用意して学習させていく事で、精度の向上や新しい言語の対応などができます。

複数のファイルをやるときはtrファイルを作った段階で、catコマンドでそのファイルを結合することで対応できます。