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

開発版のTesseract 4.0 alpha をためしてみる その2

OCR tesseract

前回に引き続き、開発版のTesseract 4.0alpha ネタです。大した内容はありません。

a244.hateblo.jp

やったこと

前回の続きとして、新しい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 追記]

上記の件はバグかも。あるいは新しいエンジンは単語辞書を必要としないのか。

参考:LSTM: traineddata seem to be missing the lstm version of unicharset · Issue #527 · tesseract-ocr/tesseract · GitHub

jpn.unicharsetというファイルじゃなくて、専用のファイルがいるのか云々というのがIssueの内容。

まあ要調査ということで。

追記

OCRエンジンの再学習(トレーニング)について、公式Wiki に情報が記載されています*1

github.com

ざっくりいうと、以下のような感じ。

  • 学習プロセスの基本的な流れは同じだが、細部で変化している
  • 以前より遥かに時間がかかる
  • 完全に再学習させなくても良くなった
  • どこまで再学習させるかによって、いくつかの方法を選べる
  • これまでとは違い、非常に時間のかかるプロセスが存在するので完全に再学習プロセスを自動化できない

完全に再学習させない場合については以前より便利になると考えて良さそう。例えば書体の追加だけ、とか。


ざっと見たところ、変更点は以下。

  • 従来の.trファイルに変わり、.lstmfというファイルを修正する
  • .boxファイル(学習用の画像の、文字の位置と幅・高さ情報を記録したファイル)の書式の簡略化(行についての情報だけいいと書いてある)
  • これまでと異なり、同一画像内に複数のフォントが混在していても問題ない
  • クラスタ化ステップ(mftraining、cntraining, shapeclustering)にlstmtraining が使用される(と、書いてある)
  • たとえ新しいOCRエンジンしか使わないとしても、combine_tessdataコマンドは従来式のOCRエンジン用のファイルを要求する*2

新しいjpn.traineddataファイルが追加されたファイルを除いて以前とほとんど同じなのは、結局、追加されたファイル以外は従来式のOCRエンジン用ということで良さそう。

上記のWikiを見る限りjpn.lstm-number-dawgファイルが存在してもおかしくないはずだけど、そもそも生成元のファイルが空だったような気がするので当然か。

まとめ

ひとまずファイルが増えているということまでは確認しました。

それとlstmtrainingという思わせぶりなコマンドが追加されているようです。

以上です。

*1:二日前とか書いてあるし

*2:この点については将来改善予定と書いてある