開発版のTesseract 4.0 alpha をためしてみる その2
スポンサーリンク
前回に引き続き、開発版のTesseract 4.0alpha ネタです。大した内容はありません。
やったこと
前回の続きとして、新しいjpn.trainneddata
ファイルをバラして内容を確認してみます。
ファイルが混ざると面倒なので作業ディレクトリを2つ作ります。
$ mkdir 4.0a $ mkdir 3.04
まず新しい方のjpn.traineddata
。パスは Homebrew で開発版をインストールした場合した関係で、/usr/local/Cellar/tesseract/
配下の'HEAD-'で始まるディレクトリ(フォルダ)になります。
$ combine_tessdata -u /usr/local/Cellar/tesseract/HEAD-23e420a_2/share/tessdata/jpn.traineddata 4.0a/jpn. Wrote 4.0a/jpn.config Wrote 4.0a/jpn.unicharset Wrote 4.0a/jpn.unicharambigs Wrote 4.0a/jpn.inttemp Wrote 4.0a/jpn.pffmtable Wrote 4.0a/jpn.normproto Wrote 4.0a/jpn.punc-dawg Wrote 4.0a/jpn.word-dawg Wrote 4.0a/jpn.number-dawg Wrote 4.0a/jpn.freq-dawg Wrote 4.0a/jpn.shapetable Wrote 4.0a/jpn.params-model Wrote 4.0a/jpn.lstm Wrote 4.0a/jpn.lstm-punc-dawg Wrote 4.0a/jpn.lstm-word-dawg
以前と比較して、さりげなくファイルが増えています。
- jpn.lstm
- jpn.lstm-punc-dawg
- jpn.lstm-word-dawg
dawgというのはデータ構造の名称の方(directed acyclic word graph : DAWG)のことでで、要は辞書データです。新しいlstmエンジン用の記号(句読点、Punctuation)辞書(punc-dawg)と、単語辞書(word-dawg)かと思います。
DAWGに関する参考ページ
tesstrain.sh
および、tesstrain_utils.sh
の修正内容からすると、既存コマンドのいくつかが新しく生成するファイルをリネームしているようです。
いつの間にかlstmtraining
というコマンドが追加されていますが、このコマンドが直接呼び出されている箇所は見つけられず。
比較対象のバージョン3.04用のjpn.trainneddata
は以下の通り。
$ combine_tessdata -u ~/workspace/github_tesseract/tessdata/jpn.traineddata 3.04/jpn. Extracting tessdata components from /Users/atuyosi/workspace/github_tesseract/tessdata/jpn.traineddata Wrote 3.04/jpn.config Wrote 3.04/jpn.unicharset Wrote 3.04/jpn.unicharambigs Wrote 3.04/jpn.inttemp Wrote 3.04/jpn.pffmtable Wrote 3.04/jpn.normproto Wrote 3.04/jpn.punc-dawg Wrote 3.04/jpn.word-dawg Wrote 3.04/jpn.number-dawg Wrote 3.04/jpn.freq-dawg Wrote 3.04/jpn.shapetable Wrote 3.04/jpn.params-model
md5チェックサムを比較すると新しく増えたファイル以外は全く同一でした。langdataリポジトリにはまだ更新はないみたいなので妥当といえば妥当です。
ついでなのでjpn.lstm-word-dawg
を元のテキストに戻してみます。下記のコマンドでtemp.txt
にdawg形式に変換される前の状態に戻せるはず。
$ dawg2wordlist 4.0a/jpn.unicharset 4.0a/jpn.lstm-word-dawg temp.txt Loading word list from 4.0a/jpn.lstm-word-dawg Reading squished dawg Word list loaded.
中身を見ると理解不能な単語の羅列になっているようです。
$ wc -l temp.txt 110077 temp.txt
先頭だけ抜粋。正直、何これというのが感想。
$ head -n 10 temp.txt ワ ワマ ワマ想プ ワマ想プナク燻ーア ワマ想プナク燻ーア信 ワマ想プナク燻ーアな ワマ想プKク燻ーア ワマ想プケク燻ーア ワマ想プれマ ワマ想想|ナ
単語辞書をニューラルネットワークで自動生成したのでしょうかね? それともn-gram データから文字列生成したとか?
[2016/12/04 追記]
上記の件はバグかも。あるいは新しいエンジンは単語辞書を必要としないのか。
jpn.unicharset
というファイルじゃなくて、専用のファイルがいるのか云々というのがIssueの内容。
まあ要調査ということで。
追記
OCRエンジンの再学習(トレーニング)について、公式Wiki に情報が記載されています*1。
ざっくりいうと、以下のような感じ。
- 学習プロセスの基本的な流れは同じだが、細部で変化している
- 以前より遥かに時間がかかる
- 完全に再学習させなくても良くなった
- どこまで再学習させるかによって、いくつかの方法を選べる
- これまでとは違い、非常に時間のかかるプロセスが存在するので完全に再学習プロセスを自動化できない
完全に再学習させない場合については以前より便利になると考えて良さそう。例えば書体の追加だけ、とか。
ざっと見たところ、変更点は以下。
- 従来の
.tr
ファイルに変わり、.lstmf
というファイルを修正する .box
ファイル(学習用の画像の、文字の位置と幅・高さ情報を記録したファイル)の書式の簡略化(行についての情報だけいいと書いてある)- これまでと異なり、同一画像内に複数のフォントが混在していても問題ない
- クラスタ化ステップ(mftraining、cntraining, shapeclustering)に
lstmtraining
が使用される(と、書いてある) - たとえ新しいOCRエンジンしか使わないとしても、
combine_tessdata
コマンドは従来式のOCRエンジン用のファイルを要求する*2
新しいjpn.traineddata
ファイルが追加されたファイルを除いて以前とほとんど同じなのは、結局、追加されたファイル以外は従来式のOCRエンジン用ということで良さそう。
上記のWikiを見る限りjpn.lstm-number-dawg
ファイルが存在してもおかしくないはずだけど、そもそも生成元のファイルが空だったような気がするので当然か。
まとめ
ひとまずファイルが増えているということまでは確認しました。
それとlstmtraining
という思わせぶりなコマンドが追加されているようです。
以上です。