danglingfarpointer's memoization

仕事周りでの気付き、メモ、愚痴などを書いていきます。

文字認識エンジンTesseract OCRで学習

はじめに

Googleの文字認識エンジンTesseract 3.02での学習プロセスの備忘録。OSはMac OS X. jTessBoxEditorという、学習を省力化するツールを使ってみる。

題材として、デジタル時計や電卓のような文字を認識するための学習をする。文字は[0-9]:に限定。

参考:

フォントの取得

まずは上述したようなフォントがないと始まらない。

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と書かれたイメージを認識させてみる。

f:id:danglingfarpointer:20150128211158p:plain

# 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'をクリック

f:id:danglingfarpointer:20150128211526p:plain

すると、led.7barsp.exp0.tifled.7barsp.exp0.boxが生成される。これらを~/trainに移動する。

試しに、'Box Editor'というタブを開き、生成されたtifファイルを選択すると、一文字一文字がどのようにboxされているかを確認できる。

f:id:danglingfarpointer:20150128211628p:plain

このように自動で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

ノイズの入ったイメージなどでも試してみたい。