Tesseract 4.00 のトレーニング方法
**tesstrain.sh
を使用したトレーニングは、現在非推奨/廃止されています。トレーニングには、https://github.com/tesseract-ocr/tesstrain の Python スクリプトを使用してください。**
トレーニングプロセスに関するご質問は? トレーニング中に問題が発生し、ヘルプが必要な場合は、tesseract-ocr メーリングリスト を使用して質問してください。絶対に issue として問題を報告したり、トレーニングに関する質問をしたりしないでください!
Ray Smith によるガイドとチュートリアルの内容
- はじめに
- 始める前に
- 必要な追加ライブラリ
- トレーニングツールのビルド
- ハードウェア・ソフトウェア要件
- トレーニングテキストの要件
- トレーニングプロセスの概要
- トレーニング中に使用される様々なファイルの理解
- LSTMTraining コマンドライン
- TessTutorial
- 出力ファイルの結合
- 幻覚効果
はじめに
次のガイドとチュートリアルは、Tesseract 5 では非推奨です。tesstrain.sh
を使用したトレーニングは、非推奨/廃止されています。トレーニングには、https://github.com/tesseract-ocr/tesstrain のスクリプトを使用してください。
はじめに
Tesseract 4.00 には、新しいニューラルネットワークベースの認識エンジンが含まれており、以前のバージョンよりもドキュメント画像の精度が大幅に向上しています(必要な計算能力の大幅な増加と引き換えに)。ただし、複雑な言語では、基本の Tesseract よりも高速になる可能性があります。
ニューラルネットワークは、基本の Tesseract よりもはるかに多くのトレーニングデータが必要であり、トレーニングに時間がかかります。ラテン語系の言語の場合、提供されている既存のモデルデータは約 400,000 行のテキストライン(約 4500 フォント)でトレーニング されています。他のスクリプトでは、利用可能なフォントはそれほど多くありませんが、同様の数のテキストラインでトレーニングされています。トレーニングには数分から数時間かかっていたのに対し、Tesseract 4.00 では数日から数週間かかります。これらすべての新しいトレーニングデータを使用しても、特定の問題には不十分であることが判明する可能性があり、そのため、再トレーニングが必要となるのです。
トレーニングには複数のオプションがあります。
- ファインチューニング。既存のトレーニング済み言語から始めて、特定の追加データでトレーニングします。これは、既存のトレーニングデータに近く、微妙に異なる問題(特に珍しいフォントなど)に効果があります。少量のトレーニングデータでも効果がある可能性があります。
- ネットワークの一番上のレイヤー(または任意の数のレイヤー)を切り取り、新しいデータを使用して新しい一番上のレイヤーを再トレーニングします。ファインチューニングが機能しない場合、これはおそらく次の最適な選択肢です。一番上のレイヤーを切り取ることで、最も似たスクリプトから始めれば、まったく新しい言語またはスクリプトのトレーニングにも効果があります。
- ゼロからの再トレーニング。これは、問題に対して非常に代表的で十分な量のトレーニングセットがない限り、困難な作業です。そうでない場合、トレーニングデータでは非常にうまく機能しますが、実際のデータではうまく機能しない過剰適合ネットワークが生成される可能性があります。
上記のオプションは異なって聞こえるかもしれませんが、コマンドラインを除いてトレーニング手順はほとんど同じなので、時間やハードウェアがあれば、並行してすべてを試すのは比較的簡単です。
少なくとも 4.00 では、古い認識エンジンはまだ存在しており、トレーニングすることもできますが、非推奨となっており、維持する正当な理由がない限り、将来のリリースで削除される可能性があります。
始める前に
Tesseract 4.00 をトレーニングするために、ニューラルネットワークのバックグラウンド知識は必要ありませんが、トレーニングオプションの違いを理解するのに役立つ可能性があります。トレーニングプロセスに深く入り込む前に、実装の概要 を読んでください。また、Tesseract 3.04 のトレーニングに関する注意も当てはまります。
重要な注意:Tesseract のトレーニングに時間と労力を費やす前に、ImproveQuality ページを読むことを強くお勧めします。
必要な追加ライブラリ
3.03 以降、トレーニングツールをビルドするには、追加のライブラリが必要です。
sudo apt-get install libicu-dev libpango1.0-dev libcairo2-dev
トレーニングツールのビルド
3.03 以降、ソースから Tesseract をコンパイルする場合は、個別の make コマンドを使用してトレーニングツールを作成してインストールする必要があります。上記の追加ライブラリをインストールしたら、Tesseract のソースディレクトリから次のコマンドを実行します。
./configure
Docker で実行する場合(またはグラフィックスを必要としない場合)は
./configure --disable-graphics
デフォルトでは、Tesseract の設定は、トレーニングのみに必要な依存関係が不足していても続行されますが、トレーニングを行うには、これらのオプションの依存関係がすべてインストールされていること、そして Tesseract のビルド環境がそれらを見つけられることを確認する必要があります。./configure
の出力で次の行を探します。
checking for pkg-config... [some valid path]
checking for lept >= 1.74... yes
checking for libarchive... yes
checking for icu-uc >= 52.1... yes
checking for icu-i18n >= 52.1... yes
checking for pango >= 1.22.0... yes
checking for cairo... yes
[...]
Training tools can be built and installed with:
(バージョン番号は時間の経過とともに変わる可能性があります。ここで探しているのは、「yes」、つまりすべてのオプションの依存関係が利用可能であることです。)
configure がトレーニングツールをビルドできると表示しない場合、ライブラリを追加するか、pkg-config
がそれらを見つけられるようにする必要があります。
設定後、トレーニングツールをビルドしようとすることができます。
make
make training
sudo make training-install
ScrollView.jar をビルドすることも有用ですが、必須ではありません。
make ScrollView.jar
export SCROLLVIEW_PATH=$PWD/java
Homebrew を使用した macOS Mojave の場合
Homebrew は pkgconfig
の設定方法が独特であるため、特定のファイルを選択する必要があります。一般的には brew info package
を実行し、言及されている PKG_CONFIG_PATH をこの環境変数に追加してください。
brew install cairo pango icu4c autoconf libffi libarchive
export PKG_CONFIG_PATH=\
$(brew --prefix)/lib/pkgconfig:\
$(brew --prefix)/opt/libarchive/lib/pkgconfig:\
$(brew --prefix)/opt/icu4c/lib/pkgconfig:\
$(brew --prefix)/opt/libffi/lib/pkgconfig
./configure
ハードウェア・ソフトウェア要件
執筆時点では、トレーニングは Linux でのみ機能します。(macOS はほぼ機能します。提供される古いバージョンの bash
と mktemp
の違いを考慮するために、シェルスクリプトに軽微なハックが必要です。)Windows は不明ですが、msys または Cygwin が必要になります。
Tesseract 4.0.0 の実行に関しては、OpenMP と SSE/AVX 拡張機能に対応した Intel Intrinsics を備えたマルチコア(4 コアが良い)マシンがあると便利です。基本的に、十分なメモリがあれば何でも動作しますが、プロセッサの性能が高いほど高速になります。GPU は必要ありません。(サポートされていません。)メモリ使用量は、–max_image_MB コマンドラインオプションで制御できますが、OS が使用するメモリ以外に少なくとも 1GB のメモリが必要になる可能性があります。
トレーニングテキストの要件
ラテン語系の言語の場合、提供されている既存のモデルデータは約 400,000 行のテキストライン(約 4500 フォント)でトレーニング されています。他のスクリプトでは、利用可能なフォントはそれほど多くありませんが、同様の数のテキストラインでトレーニングされています。
ニューラルネットワークは汎化性能が低く、実行する対象と同様のデータでトレーニングする必要があるため、トレーニングテキストを増やし、ページを増やすことが有益です。対象ドメインが非常に限定されている場合、大量のトレーニングデータが必要であるというすべての警告が当てはまらない可能性がありますが、ネットワークの仕様を変更する必要がある可能性があります。
トレーニングプロセスの概要
全体的なトレーニングプロセスは、Tesseract 3.04 のトレーニング と似ています。
概念的には同じです
- トレーニングテキストの準備。
- テキストを画像とボックスファイルにレンダリングします。(または、既存の画像データに対して手動でボックスファイルを作成します。)
- ユニチャセットファイルを作成します。(部分的に指定できます。つまり、手動で作成できます。)
- ユニチャセットとオプションの辞書データからスターターtraineddataを作成します。
- 画像とボックスファイルを処理するために tesseract を実行して、トレーニングデータセットを作成します。
- トレーニングデータセットでトレーニングを実行します。
- データファイルを結合します。
主な違いは次のとおりです。
- ボックスはテキストラインレベルでしか必要ありません。したがって、既存の画像データからトレーニングデータを作成する方がはるかに簡単です。
- .tr ファイルは .lstmf データファイルに置き換えられます。
- フォントは自由に混合でき、混合する必要があります。個別に扱う必要はありません。
- クラスタリング手順(mftraining、cntraining、shapeclustering)は、1 つの遅い lstmtraining 手順に置き換えられます。
いくつかの理由により、トレーニングは 3.04 のトレーニングほど自動化できません。
- 遅いトレーニング手順は、スクリプトの中間から実行するには適していません。停止しても再開でき、自動的に終了したかどうかを判断するのは困難です。
- ネットワークのトレーニング方法には複数のオプションがあります(上記を参照)。
- 言語モデルとユニチャセットは、基本の Tesseract で使用されているものと異なっていてもかまいませんが、同じである必要はありません。
- ニューラルネットの Tesseract と同じ言語の基本の Tesseract を持つ必要はありません。
トレーニング中に使用される様々なファイルの理解
基本の Tesseract と同様に、完成した LSTM モデルとその必要なものはすべて traineddata
ファイルに収集されます。基本の Tesseract とは異なり、トレーニング中に starter traineddata
ファイルが与えられ、事前に設定する必要があります。これには以下が含まれます。
- 制御パラメータを提供する設定ファイル。
- **ユニチャセット** 文字セットを定義します。
- **Unicharcompress**、別名リコダー。ユニチャセットを、ニューラルネットワーク認識エンジンが実際に使用するコードにさらにマップします。
- 単語の周囲で許可される句読点のパターンを含む句読点パターン dawg。
- 単語 dawg。システムの単語リスト言語モデル。
- 許可される数字のパターンを含む数字 dawg。
太字の要素は必ず提供する必要があります。他のものはオプションですが、dawg のいずれかが提供されている場合は、句読点の dawg も提供する必要があります。新しいツール:combine_lang_model
は、unicharset
とオプションの単語リストから starter traineddata
を作成するために提供されています。
トレーニング中、トレーナーはチェックポイントファイルを作成します。これはニューラルネットワークトレーナーの標準的な動作です。これにより、必要に応じてトレーニングを停止して後で再開できます。--stop_training
コマンドラインフラグを使用して、任意のチェックポイントを認識用の完全な traineddata
に変換できます。
トレーナーは、トレーニング中に達成された新しいベストスコアで定期的にチェックポイントファイルも書き込みます。
ネットワークを変更し、その一部のみを再トレーニングしたり、特定のトレーニングデータでファインチューニングしたり(変更されたユニチャセットでも!)するには、トレーナーに既存のチェックポイントファイルまたは combine_tessdata
を使用して既存の traineddata
ファイルから抽出された生の LSTM モデルファイル(整数に変換されていない場合)から --continue_from
するように指示します。
--traineddata
フラグで変更されたunicharsetが、--continue_from
で提供されたモデルで使用されていたものと異なる場合、対応するunicharset
とrecoder
を含むtraineddata
ファイルを、--old_traineddata
フラグで指定する必要があります。これにより、トレーナーは文字セット間のマッピングを計算できます。
トレーニングデータは.lstmf
ファイルで提供されます。これはシリアライズされたDocumentData
であり、画像とその対応するUTF8テキスト転写を含みます。Tesseractを使用してtif/boxファイルペアから生成でき、古いエンジンで.tr
ファイルを作成する方法と同様です。
LSTMTraining コマンドライン
lstmtrainingプログラムは、ニューラルネットワークをトレーニングするための多目的ツールです。次の表はそのコマンドラインオプションを示しています。
フラグ | 型 | デフォルト | 説明 |
---|---|---|---|
traineddata |
文字列 |
なし | unicharset、recoder、およびオプションの言語モデルを含む、開始traineddataファイルへのパス。 |
net_spec |
文字列 |
なし | ネットワークのトポロジを指定します。 |
model_output |
文字列 |
なし | 出力モデルファイル/チェックポイントのベースパス。 |
max_image_MB |
整数 |
6000 |
画像のキャッシュに使用できるメモリの最大量。 |
learning_rate |
倍精度浮動小数点数 |
10e-4 |
SGDアルゴリズムの初期学習率。 |
sequential_training |
ブール値 |
false |
シーケンシャルトレーニングの場合はtrueに設定します。デフォルトは、すべてのトレーニングデータをラウンドロビン方式で処理することです。 |
net_mode |
整数 |
192 |
network.h 内のNetworkFlags からのフラグ。可能な値: モーメンタムの代わりにAdam最適化を使用する場合は128 、異なるレイヤーが独自の学習率を持つことを許可する場合は64 (自動的に検出)。 |
perfect_sample_delay |
整数 |
0 |
ネットワークが良くなった場合、最後の完璧なサンプルが許可されてから、この数の不完全なサンプルが見られた後にのみ、完璧なサンプルをバックプロパゲーションします。 |
debug_interval |
整数 |
0 |
0以外の場合、この回数ごとに視覚的なデバッグ情報を表示します。 |
weight_range |
倍精度浮動小数点数 |
0.1 |
重みを初期化するランダム値の範囲。 |
momentum |
倍精度浮動小数点数 |
0.5 |
勾配のアルファ平滑化のためのモーメンタム。 |
adam_beta |
倍精度浮動小数点数 |
0.999 |
ADAMアルゴリズムにおける勾配の二乗の平滑化係数。 |
max_iterations |
整数 |
0 |
この回数繰り返したらトレーニングを停止します。 |
target_error_rate |
倍精度浮動小数点数 |
0.01 |
平均誤差率がこの値を下回った場合、トレーニングを停止します。 |
continue_from |
文字列 |
なし | トレーニングまたはファインチューニングを継続するための以前のチェックポイントへのパス。 |
stop_training |
ブール値 |
false |
--continue_from のトレーニングチェックポイントを認識モデルに変換します。 |
convert_to_int |
ブール値 |
false |
stop_training と共に、精度をわずかに犠牲にして速度を上げるために、8ビット整数に変換します。 |
append_index |
整数 |
-1 |
指定されたインデックスでネットワークの先頭を切り取り、切り取った部分の代わりに--net_spec ネットワークを追加します。 |
train_listfile |
文字列 |
なし | トレーニングデータファイルをリストするファイルのファイル名。 |
eval_listfile |
文字列 |
なし | トレーニングデータとは独立してモデルを評価するために使用される評価データファイルをリストするファイルのファイル名。 |
ほとんどのフラグはデフォルトで動作し、いくつかのフラグは以下にリストされている特定の操作にのみ必要ですが、まず、より複雑なフラグに関する詳細なコメントをいくつか紹介します。
ユニチャセットの圧縮と再エンコーディング
LSTMはシーケンスの学習に優れていますが、状態の数が多すぎると大幅に遅くなります。経験則として、多くのクラスの短いシーケンスよりも、LSTMに長いシーケンスを学習させる方が良いという結果があり、複雑なスクリプト(漢字、ハングル、インド系スクリプト)では、多くのクラスの大きなセットを持つよりも、各シンボルを少数のクラスからの短いコードシーケンスとして再コード化することの方が優れています。combine_lang_model
コマンドはこの機能をデフォルトで有効にしています。漢字は1~5個のコードの可変長シーケンスとして、ハングルはジャモエンコーディングを使用して3個のコードのシーケンスとして、その他のスクリプトはUnicodeコンポーネントのシーケンスとしてエンコードします。結合子子音を作成するためにビラマ文字を使用するスクリプト(すべてのインド系スクリプトに加えてミャンマー語とクメール語)では、関数NormalizeCleanAndSegmentUTF8
はビラマを適切な隣接文字とペアにして、unicharsetでよりグリフ指向のエンコーディングを生成します。この改善を最大限に活用するには、これらのスクリプトに対してcombine_lang_model
に--pass_through_recoder
フラグを設定する必要があります。
ランダム化されたトレーニングデータとsequential_training
確率的勾配降下法を正しく機能させるには、トレーニングデータはすべてのサンプルファイル全体でランダムにシャッフルされている必要があります。そのため、トレーナーは順番に各ファイルを読み取り、最後に達すると最初のファイルに戻ることができます。
(tesstrain.sh
経由で)レンダリングコードを使用している場合、各ファイル内のサンプルテキスト行をシャッフルしますが、各ファイルに単一フォントからのトレーニングサンプルが含まれるファイルセットが得られます。より均等な混合を追加するために、デフォルトでは、各ファイルから1つのサンプルを順番に処理する「ラウンドロビン」スタイルです。他の方法でトレーニングデータを作成した場合、またはすべて同じスタイル(手書き原稿の本など)からの場合、lstmtraining
に--sequential_training
フラグを使用できます。これにより、一度に2つのファイルからのデータのみを読み込んで順番に処理するため、メモリ効率が向上します。(2番目のファイルは先行読み込みされるため、必要になったときにすぐに使用できます。)
モデル出力
トレーナーは、--model_output
をベース名として使用して、定期的にチェックポイントを保存します。したがって、いつでもトレーニングを停止して再開でき、同じコマンドラインを使用して続行します。再起動を強制するには、別の--model_output
を使用するか、すべてのファイルを削除します。
ネットモードと最適化
128
フラグはAdam最適化を有効にします。これは、単純なモーメンタムよりもはるかに優れた効果があります。
64
フラグは、レイヤー固有の学習率を有効にします。進捗が停滞した場合、トレーナーはどのレイヤーの学習率を独立して削減する必要があるかを調査し、学習を続けるために1つ以上の学習率を下げる場合があります。
net_mode
のデフォルト値192
は、Adamとレイヤー固有の学習率の両方を有効にします。
学習率が減少している場合の、発散した場合に見られるメッセージの例を次に示します。
Iteration 8999: GROUND TRUTH : . هريغ )9(فرعي ال ؛ ميملا رسكب » رخنم « و » رخنم « اولاق
Iteration 8999: BEST OCR TEXT : . هريغ )6(فرعي ال ؛ ميملا رسكب » رخنم « و » رخنم « اولاق
File /home/ubuntu/OCR_GS_Data/ara/AWN/book_IbnQutayba.Adab_7_final_200_000742.lstmf line 0 :
Mean rms=1.696%, delta=3.16%, train=113.332%(18.851%), skip ratio=0.1%
Warning: LSTMTrainer deserialized an LSTMRecognizer!
At iteration 7794/9000/9011, Mean rms=1.696%, delta=3.16%, char train=113.332%, word train=18.851%, skip ratio=0.1%, New worst char error = 113.332At iteration 7507, stage 0, Eval Char error rate=5.4443537, Word error rate=16.233627
Divergence! Reverted to iteration 5870/6400/6408
Reduced learning rate to :0.00025000001
wrote checkpoint.
Iteration 6400: GROUND TRUTH : بيرق ناك اذإ »)1(ددعقو ددعق لجر « و ، هتصاخ : يأ » هللخدو نالف للخد«
File /home/ubuntu/OCR_GS_Data/ara/AWN/book_IbnQutayba.Adab_7_final_b_200_000438.lstmf line 0 (Perfect):
Mean rms=1.759%, delta=2.898%, train=62.442%(21.232%), skip ratio=0.2%
Iteration 6401: GROUND TRUTH : . )1(هجيه ام ردق ىلع
Iteration 6401: ALIGNED TRUTH : . )1(هجيه ام ردق ىىلع
Iteration 6401: BEST OCR TEXT : . )1(هجيمه ام ردق مع
パーフェクトサンプル遅延
「簡単な」サンプルでのトレーニングは必ずしも良い考えではありません。時間の無駄になる可能性がありますが、ネットワークがそれらを処理する方法を忘れてしまうことを許してはならないため、簡単なサンプルが頻繁に現れる場合は、それらを破棄することができます。--perfect_sample_delay
引数は、最後の完璧なサンプル以降に、この数の不完全なサンプルが見られていない場合、完璧なサンプルを破棄します。現在のデフォルト値の0はすべてのサンプルを使用します。実際には、この値は大きな影響を与えないようで、トレーニングを十分に長く実行できる場合、0が最良の結果をもたらします。
デバッグ間隔と視覚的なデバッグ
0(デフォルト)の--debug_interval
では、トレーナーは100回ごとに進捗レポートを出力します。次の例に似ています。
At iteration 61239/65000/65015, Mean rms=1.62%, delta=8.587%, char train=16.786%, word train=36.633%, skip ratio=0.1%, wrote checkpoint.
At iteration 61332/65100/65115, Mean rms=1.601%, delta=8.347%, char train=16.497%, word train=36.24%, skip ratio=0.1%, wrote checkpoint.
2 Percent improvement time=44606, best error was 17.77 @ 16817
Warning: LSTMTrainer deserialized an LSTMRecognizer!
At iteration 61423/65200/65215, Mean rms=1.559%, delta=7.841%, char train=15.7%, word train=35.68%, skip ratio=0.1%, New best char error = 15.7At iteration 45481, stage 0, Eval Char error rate=6.9447893, Word error rate=27.039255 wrote best model:./SANLAYER/LAYER15.7_61423.checkpoint wrote checkpoint.
--debug_interval -1
では、トレーナーはすべてのトレーニング反復に対して詳細なデバッグテキストを出力します。テキストデバッグ情報には、真のテキスト、認識されたテキスト、反復回数、トレーニングサンプルID(lstmfファイルと行)、およびいくつかの誤差メトリックの平均値が含まれます。行のGROUND TRUTH
はすべての場合に表示されます。ALIGNED TRUTH
とBEST OCR TEXT
は、GROUND TRUTH
と異なる場合にのみ表示されます。
Iteration 455038: GROUND TRUTH : उप॑ त्वाग्ने दि॒वेदि॑वे॒ दोषा॑वस्तर्धि॒या व॒यम् ।
File /tmp/san-2019-03-28.jsY/san.Mangal.exp0.lstmf line 451 (Perfect):
Mean rms=1.267%, delta=4.155%, train=11.308%(32.421%), skip ratio=0%
Iteration 455039: GROUND TRUTH : मे अपराध और बैठे दुकानों नाम सकते अधिवक्ता, दोबारा साधन विषैले लगाने पर प्रयोगकर्ताओं भागे
File /tmp/san-2019-04-04.H4m/san.FreeSerif.exp0.lstmf line 28 (Perfect):
Mean rms=1.267%, delta=4.153%, train=11.3%(32.396%), skip ratio=0%
Iteration 1526: GROUND TRUTH : 𒃻 𒀸 𒆳𒆳 𒅘𒊏𒀀𒋾
Iteration 1526: ALIGNED TRUTH : 𒃻 𒀸 𒆳𒆳 𒅘𒊏𒊏𒀀𒋾
Iteration 1526: BEST OCR TEXT : 𒀀𒋾
File /tmp/eng-2019-04-06.Ieb/eng.CuneiformComposite.exp0.lstmf line 19587 :
Mean rms=0.941%, delta=12.319%, train=56.134%(99.965%), skip ratio=0.6%
Iteration 1527: GROUND TRUTH : 𒀭𒌋𒐊
Iteration 1527: BEST OCR TEXT : 𒀭𒌋
File /tmp/eng-2019-04-06.Ieb/eng.CuneiformOB.exp0.lstmf line 7771 :
Mean rms=0.941%, delta=12.329%, train=56.116%(99.965%), skip ratio=0.6%
--debug_interval > 0
では、トレーナーはネットワークのレイヤーに関するいくつかのデバッグ情報のウィンドウを表示します。--debug_interval 1
の特別なケースでは、LSTMForward
ウィンドウをクリックするまで待ってから次の反復に進みますが、その他の場合は要求された頻度で情報を描き続けます。
–debug_interval > 0を使用するには、他のトレーニングツールに加えてScrollView.jarもビルドする必要があります。トレーニングツールのビルドを参照してください。
視覚的なデバッグ情報には以下が含まれます。
各ネットワークレイヤーの前方と後方のウィンドウ。ほとんどはランダムノイズですが、Output/Output-back
とConvNL
ウィンドウは見る価値があります。Output
は最終的なSoftmaxの出力を示し、これはnull文字の黄色の線として始まり、文字があると認識する各点で徐々に黄色のマークが開発されます。(x軸は画像のx座標、y軸は文字クラスです。)Output-back
ウィンドウは、同じレイアウトを使用して、実際の出力とターゲットの差を示しますが、「これ以上欲しい」には黄色、「これ以上は要らない」には青を使用します。ネットワークが学習するにつれて、ConvNL
ウィンドウは、下層から期待される典型的なエッジ検出結果を開発します。
LSTMForward
はトレーニング画像に対するネットワーク全体の出力を示します。LSTMTraining
はトレーニング画像に対するトレーニングターゲットを示します。両方において、各文字のピーク出力を示す緑色の線が描かれ、文字自体はその線の右側に描画されます。
他に注目すべき2つのウィンドウはCTC Outputs
とCTC Targets
です。これらは、出力強度対画像x座標の線グラフとして、ネットワークの現在の出力とターゲットを示しています。Output
ウィンドウのようなヒートマップではなく、各文字クラスに対して異なる色の線が描かれ、y軸は出力強度です。
反復回数とチェックポイント
トレーニング中、このような情報が表示されます。
At iteration 100/100/100, Mean rms=4.514%, delta=19.089%, char train=96.314%, word train=100%, skip ratio=0%, New best char error = 96.314 wrote checkpoint.
...
At iteration 14615/695400/698614, Mean rms=0.158%, delta=0.295%, char train=1.882%, word train=2.285%, skip ratio=0.4%, wrote checkpoint.
上記の例では、
14615 : learning_iteration
695400 : training_iteration
698614 : sample_iteration
sample_iteration: 「トレーニングサンプルセットへのインデックス。(sample_iteration >= training_iteration)」 学習プロセスにトレーニングファイルが何回渡されたかを示します。
training_iteration: 「実際に使用された後方トレーニングステップの数。」 トレーニングファイルが学習プロセスに何回**成功して**渡されたかを示します。「Image too large to learn!!」「Encoding of string failed!」「Deserialize header failed」などのエラーが発生するたびに、sample_iterationは増加しますが、training_iterationは増加しません。実際には、1 - (695400 / 698614) = 0.4% がスキップ率: エラーのためにスキップされたファイルの割合です。
学習イテレーション(learning_iteration):「ゼロ以外のデルタ誤差を生み出し、有意な学習をもたらしたイテレーションの数。(learning_iteration <= training_iteration)learning_iterationは学習進捗率を測定するために使用されます。」そのため、デルタ値を使用して、イテレーションが有用であったかどうかを評価します。
重要なのは、トレーニングプロセスに最大イテレーション数を指定すると、停止時期を知るために中間イテレーション数(training_iteration)を使用することです。しかし、チェックポイントを書き込む際には、チェックポイント名にも最適なイテレーション数(learning_iteration)と文字訓練率が使用されます。したがって、チェックポイント名は、model_name & char_train & learning_iteration & training_iterationを連結したものです。例:sanLayer_1.754_347705_659600.checkpoint
lstmtrainingプログラムは、2種類のチェックポイントファイルを出力します。
<model_base>_checkpoint
は、最新のモデルファイルと、トレーニングが発散した場合に使用するバックアップモデルです。<model_base>_<char_error>_<learning_iteration>_<training_iteration>.checkpoint
は、トレーニング中のその時点での最良のトレーニングエラーを持つモデルとして定期的に書き込まれます。<model_base>_checkpoint
と同様にトレーニングダンプですが、トレーニングが収束しなかった場合に使用するバックアップモデルを含んでいないため、サイズが小さくなっています。
これらのチェックポイントファイルのいずれかを、標準的な(best/float)traineddataファイルまたはわずかに精度が低い(fast/integer)traineddataファイルに変換するには、lstmtrainingでstop_training
フラグとconvert_to_int
フラグを使用します。
TessTutorial
下記にトレーニングデータの作成のプロセスについて説明し、続いてlstmtrainingのチュートリアルガイドで、実際のテスト済みのコマンドラインを使用した主なトレーニングプロセスの概要を示します。少なくともLinuxでは、コマンドラインをターミナルにコピー&ペーストするだけで実行できます。
tesstrain.sh
スクリプトを動作させるには、ローカルのtraining
ディレクトリとapi
ディレクトリをPATH
に含めるか、make install
を使用する必要があります。
TessTutorial のワンタイムセットアップ
TessTutorialを正常に実行するには、Tesseractとトレーニングツールのインストールが動作しており、トレーニングスクリプトと必要なtraineddataファイルが特定のディレクトリにある必要があります。これらの手順では、フォントからのレンダリングの場合のみを対象としているため、最初に必要なフォントをインストールする必要があります。フォントの場所は異なる可能性があることに注意してください。
sudo apt update
sudo apt install ttf-mscorefonts-installer
sudo apt install fonts-dejavu
fc-cache -vf
TessTutorialの初回設定を行うには、以下の手順に従ってください。
mkdir ~/tesstutorial
cd ~/tesstutorial
mkdir langdata
cd langdata
wget https://raw.githubusercontent.com/tesseract-ocr/langdata_lstm/main/radical-stroke.txt
wget https://raw.githubusercontent.com/tesseract-ocr/langdata_lstm/main/common.punc
wget https://raw.githubusercontent.com/tesseract-ocr/langdata_lstm/main/font_properties
wget https://raw.githubusercontent.com/tesseract-ocr/langdata_lstm/main/Latin.unicharset
wget https://raw.githubusercontent.com/tesseract-ocr/langdata_lstm/main/Latin.xheights
mkdir eng
cd eng
wget https://raw.githubusercontent.com/tesseract-ocr/langdata/main/eng/eng.training_text
wget https://raw.githubusercontent.com/tesseract-ocr/langdata/main/eng/eng.punc
wget https://raw.githubusercontent.com/tesseract-ocr/langdata/main/eng/eng.numbers
wget https://raw.githubusercontent.com/tesseract-ocr/langdata/main/eng/eng.wordlist
cd ~/tesstutorial
git clone --depth 1 https://github.com/tesseract-ocr/tesseract.git
cd tesseract/tessdata
wget https://github.com/tesseract-ocr/tessdata/raw/main/eng.traineddata
wget https://github.com/tesseract-ocr/tessdata/raw/main/osd.traineddata
mkdir best
cd best
wget https://github.com/tesseract-ocr/tessdata_best/raw/main/eng.traineddata
wget https://github.com/tesseract-ocr/tessdata_best/raw/main/heb.traineddata
wget https://github.com/tesseract-ocr/tessdata_best/raw/main/chi_sim.traineddata
トレーニングデータの作成
基本的なTesseractと同様に、フォントから合成トレーニングデータを作成するか、既存の画像(例えば、古代写本など)にラベル付けするかを選択できます。
いずれの場合も、必要な形式はtiff/boxファイルのペアですが、ボックスは個々の文字ではなくテキスト行をカバーするだけで済みます。
tesstrain.shを使用する場合は、トレーニングテキストと指定されたフォントリストから、必要なsynthetic
トレーニングデータ(box/tiffペアとlstmfファイル)が作成されます。
ボックスファイルの作成
Tesseract 4では、LSTMトレーニングのために複数の形式のboxファイルが受け入れられますが、Tesseract 3で使用されているものとは異なります(詳細)。
boxファイルの各行は、tiff画像内の「文字」(グリフ)に対応しています。
<symbol> <left> <bottom> <right> <top> <page>
ここで<left> <bottom> <right> <top> <page>
は、単一のグリフまたはテキスト行全体の境界ボックス座標です(例を参照)。
テキスト行の終わりを示すには、一連の行の後に特別な行を挿入する必要があります。
<tab> <left> <bottom> <right> <top> <page>
boxファイルは、tesseract <image name including extension> <box file name> lstmbox
を使用して、画像データからlstmbox
構成を使用してTesseract 4.0で生成できます。例えば、tesseract image.png image lstmbox
は、現在のディレクトリにある画像のimage.box
という名前のboxファイルを生成します。
アラビア語などの右から左に書く言語の場合でも、行のテキスト転写は左から右の順序でなければなりません。つまり、言語に関係なく、ネットワークは左から右に学習し、右から左/双方向の処理はTesseract内のより高いレベルで行われます。
tesstrain.sh の使用
tesstrain.shを実行するための設定は、基本的なTesseractと同じです。LSTMトレーニングには--linedata_only
オプションを使用します。ニューラルネットワークは汎化性能が低く、実行対象と同様のデータでトレーニングする必要があるため、より多くのトレーニングテキストを用意し、ページ数を増やすことが有益です。ターゲットドメインが非常に限定的な場合は、大量のトレーニングデータが必要という警告は当てはまらない可能性がありますが、ネットワークの仕様を変更する必要があるかもしれません。
トレーニングデータは、tesstrain.shを使用して以下のように作成します。
src/training/tesstrain.sh --fonts_dir /usr/share/fonts --lang eng --linedata_only \
--noextract_font_properties --langdata_dir ../langdata \
--tessdata_dir ./tessdata --output_dir ~/tesstutorial/engtrain
そして、実行が成功すると、以下が出力されます。
Created starter traineddata for LSTM training of language 'eng'
Run 'lstmtraining' command to continue LSTM training for language 'eng'
上記のコマンドは、英語の基本Tesseractのトレーニングに使用されたデータに相当するLSTMトレーニングデータを作成します。汎用的なLSTMベースのOCRエンジンを作成するには不十分ですが、優れたチュートリアルデモになります。
次に、'Impact'フォントの評価データを作成してみましょう。
src/training/tesstrain.sh --fonts_dir /usr/share/fonts --lang eng --linedata_only \
--noextract_font_properties --langdata_dir ../langdata \
--tessdata_dir ./tessdata \
--fontlist "Impact Condensed" --output_dir ~/tesstutorial/engeval
このデータは後でチューニングのデモに使用します。
lstmtraining のチュートリアルガイド
スターターtraineddataの作成
lstmtraining
は、コマンドラインでtraineddata
ファイルを受け取り、学習対象の言語に関する必要な情報をすべて取得します。traineddata
には、少なくともlstm-unicharset
とlstm-recoder
コンポーネントが含まれていなければならず、3つのdawgファイル(lstm-punc-dawg lstm-word-dawg lstm-number-dawg
)も含まれている場合があります。 config
ファイルもオプションです。他のコンポーネントが存在する場合でも、無視され、使用されません。
lstm-recoder
を直接作成するツールはありません。代わりに、combine_lang_model
というツールがあり、input_unicharset
とscript_dir
(script_dir
はlangdata
ディレクトリを指します)およびlang
(lang
は使用されている言語)とオプションの単語リストファイルを入力として受け取ります。input_unicharset
からlstm-recoder
を作成し、単語リストが提供されている場合はすべてのdawgを作成し、すべてをtraineddata
ファイルにまとめます。
tesstrain.shを使用する場合は、スターターtraineddataも、トレーニングテキストと指定されたフォントリストからsynthetic
トレーニングデータ(box/tiffペアとlstmfファイル)と共に作成されます。
ゼロからのトレーニング
次の例は、ゼロからトレーニングするためのコマンドラインを示しています。上記のコマンドラインで作成されたデフォルトのトレーニングデータで試してみてください。
mkdir -p ~/tesstutorial/engoutput
training/lstmtraining --debug_interval 100 \
--traineddata ~/tesstutorial/engtrain/eng/eng.traineddata \
--net_spec '[1,36,0,1 Ct3,3,16 Mp3,3 Lfys48 Lfx96 Lrx96 Lfx256 O1c111]' \
--model_output ~/tesstutorial/engoutput/base --learning_rate 20e-4 \
--train_listfile ~/tesstutorial/engtrain/eng.training_files.txt \
--eval_listfile ~/tesstutorial/engeval/eng.training_files.txt \
--max_iterations 5000 &>~/tesstutorial/engoutput/basetrain.log
(ネット仕様の「O1c111」は、111個の出力クラスを意味します。これは、unicharsetファイルのエントリ数と一致する必要があります。)
別のウィンドウでログファイルを確認します。
tail -f ~/tesstutorial/engoutput/basetrain.log
600回のイテレーションまでに、CTC Outputs
ウィンドウにスペース(白)が表示され始め、1300回のイテレーションまでに、画像にスペースがある場所にLSTMForward
ウィンドウに緑色の線が表示されることがわかります。
1300回のイテレーションまでに、CTC Outputs
に目に見えるスペース以外のバンプが表示されます。CTC Targets
は、最初はすべて同じ高さでしたが、スペースと一部の文字の明確な出力と、他の文字の暫定的な出力のために、高さに変化が生じています。同時に、LSTMTraining
ウィンドウの緑色の線の文字と位置は、ネットワークからの部分的な出力がCTCアルゴリズムを混乱させるため、最初は正確ではありませんでした。(CTCは異なるx座標間の統計的独立性を仮定していますが、明らかに独立していません。)
2000回のイテレーションまでに、Output
ウィンドウに、非NULLおよび非スペースに対する出力の増加を示すかすかな黄色のマークが表示され始め、LSTMForward
ウィンドウに文字が表示され始めます。
文字エラー率は、3700回のイテレーション直後に50%を下回り、5000回で約13%になり、そこで終了します。(最新のハイエンドマシンでAVXを使用すると、約20分かかります。)
このエンジンは、レガシーTesseractエンジンで使用されたのと同じ量のトレーニングデータでトレーニングされていますが、他のフォントに対する精度は非常に低い可能性があります。'Impact'フォントで独立したテストを実行します。
training/lstmeval --model ~/tesstutorial/engoutput/base_checkpoint \
--traineddata ~/tesstutorial/engtrain/eng/eng.traineddata \
--eval_listfile ~/tesstutorial/engeval/eng.training_files.txt
文字エラー率85%?あまり良くありませんね!
さて、基本的なTesseractは'Impact'でそれほどうまく機能しませんが、新しいLSTMバージョンのトレーニングに使用された4500個ほどのフォントに含まれているため、比較のために実行できる場合は実行してください。
training/lstmeval --model tessdata/best/eng.traineddata \
--eval_listfile ~/tesstutorial/engeval/eng.training_files.txt
文字エラー率2.45%?はるかに優れています!
次のセクションの参照として、使用してきたトレーニングセットで完全モデルのテストも実行します。
training/lstmeval --model tessdata/best/eng.traineddata \
--eval_listfile ~/tesstutorial/engtrain/eng.training_files.txt
文字エラー率=0.25047642、単語エラー率=0.63389585
さらに5000回のイテレーションを実行して、トレーニングセットのエラー率を大幅に低くすることができますが、'Impact'フォントにはあまり効果がありません。
mkdir -p ~/tesstutorial/engoutput
training/lstmtraining \
--traineddata ~/tesstutorial/engtrain/eng/eng.traineddata \
--net_spec '[1,36,0,1 Ct3,3,16 Mp3,3 Lfys48 Lfx96 Lrx96 Lfx256 O1c111]' \
--model_output ~/tesstutorial/engoutput/base --learning_rate 20e-4 \
--train_listfile ~/tesstutorial/engtrain/eng.training_files.txt \
--eval_listfile ~/tesstutorial/engeval/eng.training_files.txt \
--max_iterations 10000 &>>~/tesstutorial/engoutput/basetrain.log
トレーニングセットのエラー率が文字2.68%/単語10.01%に低下しているにもかかわらず、'Impact'の文字エラー率は現在100%を超えています。
training/lstmeval --model ~/tesstutorial/engoutput/base_checkpoint \
--traineddata ~/tesstutorial/engtrain/eng/eng.traineddata \
--eval_listfile ~/tesstutorial/engeval/eng.training_files.txt
これは、モデルが提供されたトレーニングセットに完全に過学習していることを示しています!これは、トレーニングセットがターゲットデータの望ましいバリエーションを網羅していない場合に何が起こるかを、優れた例として示しています。
要約すると、ゼロからトレーニングするには、非常に制約された問題、大量のトレーニングデータ、または上記の--net_spec
のいくつかのレイヤーのサイズを削減してネットワークを縮小する必要があります。あるいは、ファインチューニングを試すこともできます…
効果的なファインチューニング
インパクトのためのファインチューニングは、float
モデルをベースとして継続する場合にのみ実行できます。つまり、tessdata_bestリポジトリのtraineddataファイルを使用し、tessdataまたはtessdata_fastからのファイルは使用しないでください。
ファインチューニングとは、ネットワークのいかなる部分も変更することなく、既存のモデルを新しいデータでトレーニングするプロセスです。ただし、文字セットに文字を追加することはできます。(±数文字のファインチューニングを参照)
training/lstmtraining --model_output /path/to/output [--max_image_MB 6000] \
--continue_from /path/to/existing/model \
--traineddata /path/to/original/traineddata \
[--perfect_sample_delay 0] [--debug_interval 0] \
[--max_iterations 0] [--target_error_rate 0.01] \
--train_listfile /path/to/list/of/filenames.txt
注記 --continue_from
引数は、トレーニングチェックポイントまたは認識モデルを指すことができます。ファイル形式が異なる場合でも。トレーニングチェックポイントは、--model_output
で始まりcheckpoint
で終わるファイルです。認識モデルは、既存のtraineddataファイルからcombine_tessdata
を使用して抽出できます。 unicharsetとrecoderが含まれているため、元のtraineddataファイルも提供する必要があります。先に作成したモデルのファインチューニングから始め、「Impact」で動作するようにしてみましょう。
mkdir -p ~/tesstutorial/impact_from_small
training/lstmtraining --model_output ~/tesstutorial/impact_from_small/impact \
--continue_from ~/tesstutorial/engoutput/base_checkpoint \
--traineddata ~/tesstutorial/engtrain/eng/eng.traineddata \
--train_listfile ~/tesstutorial/engeval/eng.training_files.txt \
--max_iterations 1200
100回の反復後、文字/単語エラー率は22.36%/50.0%であり、1200回で0.3%/1.2%に減少します。次に、スタンドアロンテストを行います。
training/lstmeval --model ~/tesstutorial/impact_from_small/impact_checkpoint \
--traineddata ~/tesstutorial/engtrain/eng/eng.traineddata \
--eval_listfile ~/tesstutorial/engeval/eng.training_files.txt
トレーナーは1000回の反復で平均をとっており、改善しているので、0.0086%/0.057%というより良い結果が示されています。ただし、トレーニングデータでテストしているので、これはImpact
フォントの代表的な結果ではありません!
これは少しおもちゃのような例でした。ファインチューニングのアイデアは、実際に完全にトレーニングされた既存のモデルの1つに適用することです。
mkdir -p ~/tesstutorial/impact_from_full
training/combine_tessdata -e tessdata/best/eng.traineddata \
~/tesstutorial/impact_from_full/eng.lstm
training/lstmtraining --model_output ~/tesstutorial/impact_from_full/impact \
--continue_from ~/tesstutorial/impact_from_full/eng.lstm \
--traineddata tessdata/best/eng.traineddata \
--train_listfile ~/tesstutorial/engeval/eng.training_files.txt \
--max_iterations 400
100回の反復後、文字/単語エラー率は1.35%/4.56%であり、400回で0.533%/1.633%に減少します。ここでも、スタンドアロンテストはより良い結果を与えます。
training/lstmeval --model ~/tesstutorial/impact_from_full/impact_checkpoint \
--traineddata tessdata/best/eng.traineddata \
--eval_listfile ~/tesstutorial/engeval/eng.training_files.txt
文字エラー率0.017%、単語エラー率0.120%。しかし、より興味深いのは他のフォントへの影響なので、これまで使用してきた基本的なトレーニングセットでテストを実行します。
training/lstmeval --model ~/tesstutorial/impact_from_full/impact_checkpoint \
--traineddata tessdata/best/eng.traineddata \
--eval_listfile ~/tesstutorial/engtrain/eng.training_files.txt
文字エラー率=0.25548592、単語エラー率=0.82523491
トレーニングセットでほぼゼロエラーに達し、わずか400回の反復で達成したにもかかわらず、わずかに悪化するだけです。400回の反復を超えるトレーニングを行うと、基本セットのエラーが大きくなることに注意してください。
要約すると、事前トレーニングされたモデルは、小さなデータセットにファインチューニングまたは適応させることができます。一般的な精度に大きな悪影響を与えることなく。しかし、過学習を避けることは依然として非常に重要です。
±数文字のファインチューニング
±数文字のファインチューニングは、float
モデルをベースとして継続する場合にのみ実行できます。つまり、tessdata_bestリポジトリのtraineddataファイルを使用し、tessdataまたはtessdata_fastからのファイルは使用しないでください。
新機能 少量のトレーニングデータで、文字セットにいくつかの新しい文字を追加して、ファインチューニングによってそれらをトレーニングすることが可能です。
トレーニングには、新しいunicharset/recoder、オプションの言語モデル、および古いunicharset/recoderを含む古いtraineddataファイルが必要です。
training/lstmtraining --model_output /path/to/output [--max_image_MB 6000] \
--continue_from /path/to/existing/model \
--traineddata /path/to/traineddata/with/new/unicharset \
--old_traineddata /path/to/existing/traineddata \
[--perfect_sample_delay 0] [--debug_interval 0] \
[--max_iterations 0] [--target_error_rate 0.01] \
--train_listfile /path/to/list/of/filenames.txt
既存の英語モデルにプラスマイナス記号(±)を追加してみましょう。langdata/eng/eng.training_text
を修正して、±のサンプルを含めます。以下に示すように、14個挿入しました。
grep ± ../langdata/eng/eng.training_text
alkoxy of LEAVES ±1.84% by Buying curved RESISTANCE MARKED Your (Vol. SPANIEL
TRAVELED ±85¢ , reliable Events THOUSANDS TRADITIONS. ANTI-US Bedroom Leadership
Inc. with DESIGNS self; ball changed. MANHATTAN Harvey's ±1.31 POPSET Os—C(11)
VOLVO abdomen, ±65°C, AEROMEXICO SUMMONER = (1961) About WASHING Missouri
PATENTSCOPE® # © HOME SECOND HAI Business most COLETTI, ±14¢ Flujo Gilbert
Dresdner Yesterday's Dilated SYSTEMS Your FOUR ±90° Gogol PARTIALLY BOARDS firm
Email ACTUAL QUEENSLAND Carl's Unruly ±8.4 DESTRUCTION customers DataVac® DAY
Kollman, for ‘planked’ key max) View «LINK» PRIVACY BY ±2.96% Ask! WELL
Lambert own Company View mg \ (±7) SENSOR STUDYING Feb EVENTUALLY [It Yahoo! Tv
United by #DEFINE Rebel PERFORMED ±500Gb Oliver Forums Many | ©2003-2008 Used OF
Avoidance Moosejaw pm* ±18 note: PROBE Jailbroken RAISE Fountains Write Goods (±6)
Oberflachen source.” CULTURED CUTTING Home 06-13-2008, § ±44.01189673355 €
netting Bookmark of WE MORE) STRENGTH IDENTICAL ±2? activity PROPERTY MAINTAINED
次に、新しいトレーニングデータと評価データを作成します。
src/training/tesstrain.sh --fonts_dir /usr/share/fonts --lang eng --linedata_only \
--noextract_font_properties --langdata_dir ../langdata \
--tessdata_dir ./tessdata --output_dir ~/tesstutorial/trainplusminus
src/training/tesstrain.sh --fonts_dir /usr/share/fonts --lang eng --linedata_only \
--noextract_font_properties --langdata_dir ../langdata \
--tessdata_dir ./tessdata \
--fontlist "Impact Condensed" --output_dir ~/tesstutorial/evalplusminus
新しいトレーニングデータでファインチューニングを実行します。新しいターゲット文字のサンプルがわずかしかないため、より多くの反復が必要です。
training/combine_tessdata -e tessdata/best/eng.traineddata \
~/tesstutorial/trainplusminus/eng.lstm
training/lstmtraining --model_output ~/tesstutorial/trainplusminus/plusminus \
--continue_from ~/tesstutorial/trainplusminus/eng.lstm \
--traineddata ~/tesstutorial/trainplusminus/eng/eng.traineddata \
--old_traineddata tessdata/best/eng.traineddata \
--train_listfile ~/tesstutorial/trainplusminus/eng.training_files.txt \
--max_iterations 3600
100回の反復後、文字/単語エラー率は1.26%/3.98%であり、3600回で0.041%/0.185%に減少します。ここでも、スタンドアロンテストはより良い結果を与えます。
training/lstmeval --model ~/tesstutorial/trainplusminus/plusminus_checkpoint \
--traineddata ~/tesstutorial/trainplusminus/eng/eng.traineddata \
--eval_listfile ~/tesstutorial/trainplusminus/eng.training_files.txt
文字エラー率0.0326%、単語エラー率0.128%。しかし、より興味深いのは、新しい文字を「Impact」フォントで認識できるかどうかであるため、「Impact」評価セットでテストを実行します。
training/lstmeval --model ~/tesstutorial/trainplusminus/plusminus_checkpoint \
--traineddata ~/tesstutorial/trainplusminus/eng/eng.traineddata \
--eval_listfile ~/tesstutorial/evalplusminus/eng.training_files.txt
文字エラー率=2.3767074、単語エラー率=8.3829474
これは、元のモデルのImpactデータセットに対する元のテストと非常によく比較できます。さらに、エラーを確認すると
training/lstmeval --model ~/tesstutorial/trainplusminus/plusminus_checkpoint \
--traineddata ~/tesstutorial/trainplusminus/eng/eng.traineddata \
--eval_listfile ~/tesstutorial/evalplusminus/eng.training_files.txt 2>&1 |
grep ±
…すべての±記号が正しく認識されているはずです!(±を含むすべての真の行には、対応するOCR行にも±が含まれており、一致するOCR行がない真の行はありません。)
これは素晴らしいニュースです!つまり、既存の精度に影響を与えることなく、1つ以上の新しい文字を追加でき、新しい文字を認識する能力は、少なくともある程度まで、他のフォントにも一般化されます!
注記:ファインチューニングを行う際には、小さなデータセットでの過剰なトレーニングは過学習を引き起こすため、反復回数を試行することが重要です。ADAMは、まれなクラスを正しく認識するために必要な特徴の組み合わせを見つけるのに最適ですが、より単純な最適化アルゴリズムよりも過学習しやすいようです。
少数のレイヤーのみのトレーニング
数層のみのトレーニングは、float
モデルをベースとして継続する場合にのみ実行できます。つまり、tessdata_bestリポジトリのtraineddataファイルを使用し、tessdataまたはtessdata_fastからのファイルは使用しないでください。
新しいフォントスタイルを追加するだけの場合や、新しい文字をいくつか必要とする場合、ファインチューニングは問題ありませんが、クリンゴンのトレーニングが必要な場合はどうでしょうか?トレーニングデータはほとんどない可能性があり、他のものとはまったく異なるため、どうすればよいでしょうか?既存のネットワークモデルの上位レイヤーの一部を削除し、それらの一部を新しいランダム化されたレイヤーに置き換え、データでトレーニングしてみてください。コマンドラインはゼロからのトレーニングとほぼ同じですが、--continue_from
と--append_index
にモデルを提供する必要があります。
--append_index
引数は、指定されたインデックスのレイヤーの上にあるすべてのレイヤーを削除し(最外側のシリーズから0から開始)、残りの部分に指定された--net_spec
引数を追加するように指示します。このインデックス付けシステムは、ネットワークレイヤーを参照する完璧な方法ではありませんが、大幅に簡素化されたネットワーク仕様言語の結果です。ビルダーは、生成されたネットワークに対応する文字列を出力するため、インデックスが目的のレイヤーを参照していることを合理的に簡単に確認できます。
4.00アルファの新機能として、combine_tessdataはtraineddataファイルの内容とそのバージョン文字列をリストアップできます。ほとんどの場合、バージョン文字列には、トレーニングに使用されたnet_specが含まれています。
training/combine_tessdata -d tessdata/best/heb.traineddata
Version string:4.00.00alpha:heb:synth20170629:[1,36,0,1Ct3,3,16Mp3,3Lfys48Lfx96Lrx96Lfx192O1c1]
17:lstm:size=3022651, offset=192
18:lstm-punc-dawg:size=3022651, offset=3022843
19:lstm-word-dawg:size=673826, offset=3024221
20:lstm-number-dawg:size=625, offset=3698047
21:lstm-unicharset:size=1673826, offset=3703368
22:lstm-recoder:size=4023, offset=3703368
23:version:size=80, offset=3703993
そして、chi_simの場合
training/combine_tessdata -d tessdata/best/chi_sim.traineddata
Version string:4.00.00alpha:chi_sim:synth20170629:[1,48,0,1Ct3,3,16Mp3,3Lfys64Lfx96Lrx96Lfx512O1c1]
0:config:size=1966, offset=192
17:lstm:size=12152851, offset=2158
18:lstm-punc-dawg:size=282, offset=12155009
19:lstm-word-dawg:size=590634, offset=12155291
20:lstm-number-dawg:size=82, offset=12745925
21:lstm-unicharset:size=258834, offset=12746007
22:lstm-recoder:size=72494, offset=13004841
23:version:size=84, offset=13077335
レイヤーの数は同じですが、サイズだけが異なります。したがって、これらのモデルでは、次の--append_index
の値は関連する最後のレイヤーを保持し、上に追加します。
インデックス | レイヤー |
---|---|
0 |
入力 |
1 |
Ct3,3,16 |
2 |
Mp3,3 |
3 |
Lfys48/64 |
4 |
Lfx96 |
5 |
Lrx96 |
6 |
Lfx192/512 |
既存モデルの残りの部分の重みは、最初は変更されませんが、新しいトレーニングデータによって変更される可能性があります。
例として、既存のchi_simモデルをengに変換してみましょう。最後のLSTMレイヤー(chi_simの方がengモデルのトレーニングに使用されたものよりも大きかった)とsoftmaxを切り捨て、より小さなLSTMレイヤーと新しいsoftmaxに置き換えます。
mkdir -p ~/tesstutorial/eng_from_chi
training/combine_tessdata -e tessdata/best/chi_sim.traineddata \
~/tesstutorial/eng_from_chi/eng.lstm
training/lstmtraining --debug_interval 100 \
--continue_from ~/tesstutorial/eng_from_chi/eng.lstm \
--traineddata ~/tesstutorial/engtrain/eng/eng.traineddata \
--append_index 5 --net_spec '[Lfx256 O1c111]' \
--model_output ~/tesstutorial/eng_from_chi/base \
--train_listfile ~/tesstutorial/engtrain/eng.training_files.txt \
--eval_listfile ~/tesstutorial/engeval/eng.training_files.txt \
--max_iterations 3000 &>~/tesstutorial/eng_from_chi/basetrain.log
下位レイヤーはすでにトレーニングされているため、ゼロからトレーニングするよりも高速に学習します。600回の反復で突然出力が生成され始め、800回で既にほとんどの文字が正しく認識されています。3000回の反復で停止するまでに、文字エラー率6.00%/単語エラー率22.42%になるはずです。
完全なトレーニングセットで通常のテストを試します。
training/lstmeval --model ~/tesstutorial/eng_from_chi/base_checkpoint \
--traineddata ~/tesstutorial/engtrain/eng/eng.traineddata \
--eval_listfile ~/tesstutorial/engtrain/eng.training_files.txt
そして、Impact
フォントで独立したテストを行います。
training/lstmeval --model ~/tesstutorial/eng_from_chi/base_checkpoint \
--traineddata ~/tesstutorial/engtrain/eng/eng.traineddata \
--eval_listfile ~/tesstutorial/engeval/eng.training_files.txt
完全なトレーニングセットでは5.557%/20.43%になり、Impact
では36.67%/83.23%になり、ゼロからのトレーニングよりもはるかに優れていますが、それでもひどく過学習しています。
要約すると、既存のネットワークの上位レイヤーを切り捨てて、ゼロからトレーニングするかのようにトレーニングすることは可能ですが、過学習を避けるには、かなり大量のトレーニングデータが必要です。
トレーニングからのエラーメッセージ
トレーニングの実行中に発生する可能性のあるさまざまなエラーメッセージがあり、その中には重要なものもあれば、それほど重要ではないものもあります。
Encoding of string failed!
は、トレーニング画像のテキスト文字列が、指定されたunicharsetを使用してエンコードできない場合に発生します。考えられる原因は次のとおりです。
- unicharsetにない文字(たとえば、ポンド記号など)がテキストに含まれている。
- テキストに不要な印刷できない文字(タブや制御文字など)が含まれている。
- テキストに表現されていないインドのグラフェム/アクサラが含まれている。
いずれの場合も、トレーニング画像がトレーナーによって無視されます。エラーがまれな場合は無害ですが、unicharsetがトレーニングしている言語を表すのに不適切であることを示している可能性があります。
Unichar xxx is too long to encode!!
(ほとんどの場合、インド語のみ)。recoderで使用できるUnicode文字の長さには上限があり、LSTMエンジン用のunicharsetを簡素化します。単に続行し、そのアクサラを認識可能なセットから除外しますが、多数ある場合は問題が発生します。
Bad box coordinates in boxfile string!
LSTMトレーナーは、文字レベルではなく、完全なテキスト行のバウンディングボックス情報のみを必要としますが、次のようにボックス文字列にスペースを入れると
<text for line including spaces> <left> <bottom> <right> <top> <page>
パーサーは混乱し、エラーメッセージが表示されます。
Deserialize header failed
は、トレーニング入力がLSTM形式ではないか、ファイルを読み取れない場合に発生します。ファイルリストファイルを確認して、有効なファイル名が含まれているかどうかを確認してください。
No block overlapping textline:
は、レイアウト分析がトレーニングデータとして与えられた画像を正しくセグメント化できない場合に発生します。テキスト行は削除されます。数が少ない場合はそれほど問題ではありませんが、多数ある場合は、トレーニングテキストまたはレンダリングプロセスに問題がある可能性があります。
<Undecodable>
は、トレーニングの初期段階でALIGNED_TRUTHまたはOCR TEXT出力のいずれかに発生する可能性があります。これは、unicharsetの圧縮とCTCトレーニングの結果です。(上記のUnicharset圧縮とtrain_modeを参照)。これは無害であり、安全に無視できます。頻度はトレーニングの進行とともに低下するはずです。
出力ファイルの結合
lstmtrainingプログラムは、2種類のチェックポイントファイルを出力します。
<model_base>_checkpoint
は最新のモデルファイルです。<model_base><char_error>_<iteration>.checkpoint
は、トレーニングエラーが最も少ないモデルとして定期的に書き込まれます。これはチェックポイントと同じトレーニングダンプですが、トレーニングが発散した場合に使用されるバックアップモデルがないため、サイズが小さくなっています。
これらのファイルのいずれかを、次のように標準のtraineddataファイルに変換できます。
training/lstmtraining --stop_training \
--continue_from ~/tesstutorial/eng_from_chi/base_checkpoint \
--traineddata /path/to/traineddata/used/in/lstmtraining/eng.traineddata \
--model_output ~/tesstutorial/eng_from_chi/eng.traineddata
これにより、トレーニングダンプから認識モデルを抽出し、トレーニング中に提供されたunicharset、recoder、および任意のdawgとともに、–traineddata引数に挿入します。
注意 Tesseract 4.00 は、lang.lstm
、lang.lstm-unicharset
、およびlang.lstm-recoder
のみを含むtraineddataファイルで問題なく動作するようになりました。lstm-*-dawgs
はオプションであり、OCRエンジンモードをOEM_LSTM_ONLYに設定した場合、他のコンポーネントはどれも必要なく、使用されません。 ビッグラム、ユニチャルアンビグ、その他のコンポーネントは必要なく、存在しても効果はありません。他に機能を持つコンポーネントはlang.config
のみで、レイアウト解析やサブ言語に影響を与える可能性があります。
既存のTesseract traineddataファイルに追加する場合、lstm-unicharset
はTesseractのunicharset
と一致する必要はありませんが、LSTMのトレーニングとlstm-*-dawgs
ファイルの作成には同じunicharsetを使用する必要があります。
幻覚効果
モデルが誤動作していることに気づいた場合(例:
- 特定の単語の先頭に
小文字
ではなく大文字
を追加する。 スペース
を不要な箇所に追加する。- など…