文字認識エンジンTesseract OCRで学習
はじめに
Googleの文字認識エンジンTesseract 3.02での学習プロセスの備忘録。OSはMac OS X. jTessBoxEditorという、学習を省力化するツールを使ってみる。
題材として、デジタル時計や電卓のような文字を認識するための学習をする。文字は[0-9]
と:
に限定。
参考:
- TrainingTesseract3 - https://code.google.com/p/tesseract-ocr/wiki/TrainingTesseract3
- jTessBoxEditor - http://vietocr.sourceforge.net/training.html
フォントの取得
まずは上述したようなフォントがないと始まらない。
http://www.trojanbear.net/s/category/font の7barSPというフォントを使う。
ダウンロードしたら展開し、OS XのFont bookからインストールする。
tesseractのインストール
最初に、tesseractが依存する画像処理ライブラリleptonicaをインストール。
sudo port install leptonica
次に、tesseract 3.02をソースからインストール。まずパッケージの取得。
wget https://tesseract-ocr.googlecode.com/files/tesseract-ocr-3.02.02.tar.gz
tar xzf tesseract-ocr-3.02.02.tar.gz
cd tesseract-ocr
そしてビルド。配置先はホームディレクトリにする。
./configure --prefix=$HOME/tesseract LIBLEPT_HEADERSDIR=/opt/local/include/leptonica make make install
最後に、デフォルトの英語辞書をインストール。
wget https://tesseract-ocr.googlecode.com/files/tesseract-ocr-3.02.eng.tar.gz
tar xzf tesseract-ocr-3.02.eng.tar.gz
cp tesseract-ocr/tessdata/eng.* $HOME/tesseract/share/tessdata/
学習なしで試してみる
ここで試しに、学習なしで、7barSPフォントで15:39
と書かれたイメージを認識させてみる。
# ImageMagickでイメージを作成 convert -background white -fill black -font 7barSP -size 150x label:15:39 1539.png # 数値と':'のみをホワイトリストとするための制御ファイル echo 'tessedit_char_whitelist 0123456789:' > tess.conf # 実行 -> byeng.txtに結果が出力される $HOME/tesseract/bin/tesseract 1539.png byeng -l eng tess.conf
結果は以下のとおり。今のところ認識に失敗している。
$ less byeng.txt 35 35
学習 - 辞書の作成
ここから辞書を作成していく。
1. jTessBoxEditorのインストール
jTessBoxEditorを取得・起動する。
wget -O jTessBoxEditor-1.3.zip http://sourceforge.net/projects/vietocr/files/jTessBoxEditor/jTessBoxEditor-1.3.zip/download unzip jTessBoxEditor-1.3.zip cd jTessBoxEditor # 環境変数を設定 export TESSDATA_PREFIX=$HOME/tesseract/share # 起動 java -Xms128m -Xmx1024m -jar jTessBoxEditor.jar &
起動後に、GUIから、tesseractの実行ファイルの置かれたディレクトリを指定してやれば、とりあえずツール準備は完了。
2. 学習に必要なデータの準備
jTessBoxEditorを使った学習では、以下のファイルを用意する必要があるようだ。
- tifファイル: 文字データのイメージをtif形式として保存したもの。今回は
0123456789:
という文字列のイメージを準備 - boxファイル: tifファイルの中の一文字一文字の座標と大きさを記録したファイル
- font propertiesファイル: フォントの情報を与えたもの
- word listファイル: 単語のリスト。今回は空ファイルとする
- frequent word listファイル: 頻出単語のリスト。今回は空ファイルとする
以上のファイルを ~/train
に作っていく。
2-1. tifファイルとboxファイル
この2つは、jTessBoxEditorを使って生成する。
- ツールで、'TIFF/Box Generator'というタブを選択
- 'Output'にledと入力。3文字であれば基本的になんでもよいはず。今回は、フォントの形状がLEDサインを連想させるので、ledと名付ける
- フォントとして7barSPを選択。フォントサイズは48ptとした
- 下のペインに
0123456789:
と入力。本来は学習の精度を上げるために、もっと多くの単語を入力したほうが良いと思われる - 'generate'をクリック
すると、led.7barsp.exp0.tif
とled.7barsp.exp0.box
が生成される。これらを~/train
に移動する。
試しに、'Box Editor'というタブを開き、生成されたtifファイルを選択すると、一文字一文字がどのようにboxされているかを確認できる。
このように自動でboxファイルを作れることが、jTessBoxEditorの一番のメリットか。
2-2. font propertiesファイル
これはコマンドラインから作る。
1列目にフォント名7barsp
を与える(tif/boxファイル名の中の文字列に対応)。 2列目以降には、そのフォントが、italic, bold, fixed, serif, frakturに相当するか否かを、順に0/1で与える。
cd ~/train echo '7barsp 0 0 0 0 0' > led.font_properties
2-3. word listファイルとfrequent word listファイル
これらはいずれも空ファイルとする。
cd ~/train touch led.words_list led.frequent_words_list
3. 学習実行
jTessBoxEditorの'Trainer'タブを開き、'Training Data'で~/train
を、'Language'を'led'に設定する。そして、'Train with Existing Box'を指定して'Run'.
ズラズラとログが表示されるが、成功すれば上記5つ以外のファイルがいくつか生成されている。
最後にファイルを1つにまとめる。led
のあとのドットを忘れない。
cd ~/train $HOME/tesseract/bin/combine_tessdata led.
これで、目的となるled.traineddata
という辞書が生成された。$HOME/tesseract/share/tessdata/
に移動すれば完了。
cp -f led.traineddata $HOME/tesseract/share/tessdata/
テスト
$HOME/tesseract/bin/tesseract 1539.png byled -l led # 実行 -> byled.txtに結果が出力される
結果は以下の通り。ちゃんと認識できるようになった!
$ less byled.txt 15:39
ノイズの入ったイメージなどでも試してみたい。