LSTM/ニューラルネット Tesseract のトレーニング方法
トレーニングプロセスについて質問がありますか?トレーニングプロセス中に問題が発生し、ヘルプが必要な場合は、tesseract-ocr メーリングリストを使用して質問してください。絶対にトレーニングに関する問題の報告や質問をissueとして報告しないでください!
tesstrain.sh
bash スクリプトを使用したトレーニングは、Tesseract 5 ではサポートされておらず/放棄されています。トレーニングには、tesstrain リポジトリの Python スクリプトを使用してください。
目次
- はじめに
- 始める前に
- ハードウェアとソフトウェアの要件
- 追加で必要なライブラリ
- トレーニングツールのビルド
- トレーニングテキストの要件
- トレーニングプロセスの概要
- トレーニング中に使用されるさまざまなファイルの理解
- LSTMTraining コマンドライン
- 出力ファイルの結合
- 幻覚効果
はじめに
Tesseract 4.00 では、新しいニューラルネットワークベースの認識エンジンが導入され、以前のバージョンよりも大幅に高い精度 (ドキュメント画像の場合) が実現されました。その代わり、必要な計算能力が大幅に増加しました。ただし、複雑な言語では、ベースの Tesseract よりも高速になる場合があります。
ニューラルネットワークは、ベースの Tesseract よりもはるかに多くのトレーニングデータが必要で、トレーニングにはるかに時間がかかります。ラテン文字ベースの言語の場合、提供されている既存のモデルデータは、約 4500 フォントにまたがる約 400000 行のテキストでトレーニングされています。他のスクリプトでは、それほど多くのフォントが利用可能ではありませんが、同様の数のテキスト行でトレーニングされています。トレーニングに数分から数時間かかる代わりに、Tesseract 4.00 では数日から数週間かかります。これらすべての新しいトレーニングデータを使用しても、特定の問題には不十分であるとわかる可能性があるため、再トレーニングしようとしているのです。
トレーニングには複数のオプションがあります
- 微調整。既存のトレーニング済み言語から始めて、特定の追加データでトレーニングします。これは、既存のトレーニングデータに近い問題、特に珍しいフォントなど、わずかに異なる問題に有効な場合があります。少量のトレーニングデータでも機能する場合があります。
- ネットワークから最上位レイヤー (または任意の数のレイヤー) を切り取り、新しいデータを使用して新しい最上位レイヤーを再トレーニングします。微調整が機能しない場合は、これが最も可能性の高い次の最適なオプションです。最も類似したスクリプトから開始する場合、最上位レイヤーを切り取ると、完全に新しい言語またはスクリプトのトレーニングにも機能する可能性があります。
- スクラッチからの再トレーニング。これは、問題に対して非常に代表的で十分な大きさのトレーニングセットがない限り、困難なタスクです。そうでない場合、トレーニングデータでは非常にうまく機能するが、実際のデータでは機能しない、過剰適合したネットワークになる可能性があります。
上記のオプションは異なるように聞こえるかもしれませんが、トレーニングステップはコマンドラインを除いてほぼ同じであるため、並列で実行する時間またはハードウェアがあれば、すべての方法を試すことは比較的簡単です。
古い認識エンジンはまだ存在しており、トレーニングすることもできますが、非推奨であり、維持する正当な理由が生じない限り、将来のリリースで削除される可能性があります。
始める前に
Tesseract をトレーニングするためにニューラルネットワークのバックグラウンドは必要ありませんが、トレーニングオプションの違いを理解するのに役立つ場合があります。トレーニングプロセスを深く掘り下げる前に、実装の概要をお読みください。
重要な注意:非常に珍しいフォントや新しい言語を使用している場合を除き、Tesseract を再トレーニングしても役に立たない可能性があることに注意することが重要です。Tesseract のトレーニングに時間と労力を費やす前に、ImproveQuality ページを読むことを強くお勧めします。多くの場合、入力画像を前処理するだけで認識を改善できます。
ハードウェアとソフトウェアの要件
この記事の執筆時点では、トレーニングは Linux でのみ機能します。(macOS はほぼ機能します。提供されている古いバージョンの bash
および mktemp
の違いを考慮するために、シェルスクリプトにマイナーなハックが必要です。) Windows は不明ですが、msys または Cygwin が必要になります。
Tesseract の実行に関しては、マルチコア (4 つが最適) マシンが、OpenMP と SSE/AVX 拡張機能の Intel Intrinsics サポートを備えていると便利ですが、必須ではありません。基本的には、十分なメモリがあれば何でも実行できますが、プロセッサが高性能であればあるほど、高速になります。GPU は必要ありません。(サポートされていません。)メモリ使用量は、–max_image_MB コマンドラインオプションで制御できますが、OS で使用されるメモリに加えて、少なくとも 1GB のメモリが必要になる可能性があります。
追加で必要なライブラリ
3.03 以降、トレーニングツールをビルドするには追加のライブラリが必要です。
sudo apt-get install libicu-dev libpango1.0-dev libcairo2-dev
トレーニングツールのビルド
3.03 以降、Tesseract をソースからコンパイルする場合は、個別の make コマンドを使用してトレーニングツールを作成およびインストールする必要があります。
トレーニングでは、これらのオプションの依存関係がすべてインストールされており、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:
(バージョン番号は時間とともに変更される可能性があります。ここで探しているのは、「はい」です。オプションの依存関係がすべて利用可能です。)
構成後、トレーニングツールのビルドを試みることができます
make
make training
sudo make training-install
ScrollView.jar をビルドすることも便利ですが、必須ではありません
make ScrollView.jar
export SCROLLVIEW_PATH=$PWD/java
トレーニングテキストの要件
ラテン文字ベースの言語の場合、提供されている既存のモデルデータは、約 4500 フォントにまたがる約 400000 行のテキストでトレーニングされています。他のスクリプトでは、それほど多くのフォントが利用可能ではありませんが、同様の数のテキスト行でトレーニングされています。
ただし、ニューラルネットはうまく一般化せず、実行する内容と同様の内容でトレーニングする必要があるため、トレーニングテキストを増やし、ページ数を増やすことが有益であることに注意してください。ターゲットドメインが大幅に制限されている場合は、多くのトレーニングデータが必要になるという重大な警告は当てはまらない可能性がありますが、ネットワーク仕様を変更する必要がある場合があります。
トレーニングプロセスの概要
トレーニングの主な手順は次のとおりです
- トレーニングテキストを準備します。
- テキストを画像 + box ファイルにレンダリングします。(または、既存の画像データの手作り box ファイルを作成します。)
- unicharset ファイルを作成します。(部分的に指定できます。つまり、手動で作成できます)。
- unicharset およびオプションの辞書データからスターター/プロト traineddata を作成します。
- tesseract を実行して、画像 + box ファイルを処理し、トレーニングデータセット (lstmf ファイル) を作成します。
- トレーニングデータセットでトレーニングを実行します。
- データファイルを結合します。
ベース Tesseract (レガシー Tesseract 3.04) のトレーニングとの主な違いは次のとおりです
- ボックスはテキストラインレベルであるだけで済みます。したがって、既存の画像データからトレーニングデータを作成するのがはるかに簡単です。
- .tr ファイルは .lstmf データファイルに置き換えられます。
- フォントは、個別に分けるのではなく、自由に混合でき、そうすべきです。
- クラスタリングステップ (mftraining、cntraining、shapeclustering) は、単一の低速
lstmtraining
ステップに置き換えられます。
トレーニングは、いくつかの理由により、3.04 のトレーニングほど自動化することはできません
- 低速のトレーニングステップは、停止した場合に再開でき、いつ完了したかを自動的に判断するのが難しいため、スクリプトの途中から実行するのに適していません。
- ネットワークのトレーニング方法には複数のオプションがあります (上記参照)。
- 言語モデルと unicharset は、ベース/レガシー Tesseract で使用されているものとは異なることが許可されていますが、そうする必要はありません。
- ニューラルネット Tesseract と同じ言語のベース/レガシー Tesseract を持つ必要はありません。
トレーニング中に使用されるさまざまなファイルの理解
ベース/レガシー Tesseract と同様に、完了した LSTM モデルと必要なその他すべてのものは、traineddata
ファイルに収集されます。ベース/レガシー Tesseract とは異なり、トレーニング中に starter/proto traineddata
ファイルが提供され、事前に設定する必要があります。含まれる可能性のあるものは次のとおりです
- 制御パラメーターを提供する構成ファイル。
- 文字セットを定義するUnicharset。
- Unicharcompress (別名、リコーダー)。これは、unicharset をニューラルネットワーク認識エンジンで実際に使用されるコードにさらにマッピングします。
- 単語の周りに許可されている句読点パターンを含む句読点パターン dawg。
- 単語 dawg。システム単語リスト言語モデル。
- 許可されている数字のパターンを含む数字 dawg。
太字の要素は必ず指定する必要があります。その他はオプションですが、いずれかの dawg が指定されている場合は、句読点 dawg も指定する必要があります。
新しいツール combine_lang_model
が unicharset
およびオプションの単語リストから starter traineddata
を作成するために提供されており、トレーニングに必要です。
トレーニング中、トレーナーはチェックポイントファイルを書き込みます。これは、ニューラルネットワークトレーナーの標準的な動作です。これにより、必要に応じてトレーニングを停止して後で再開できます。任意のチェックポイントは、--stop_training
コマンドラインフラグを使用して、認識用の完全な traineddata
に変換できます。
トレーナーは、トレーニング中に達成された新しいベストでチェックポイントファイルも定期的に書き込みます。
トレーナーに既存のチェックポイントファイルまたは combine_tessdata
を使用して既存の traineddata
ファイルから抽出された裸の LSTM モデルファイル (整数に変換されていない場合) から --continue_from
するように指示することで、ネットワークを変更し、その一部だけを再トレーニングしたり、特定のトレーニングデータに合わせて微調整したりできます (変更された unicharset でも!)。
もし、--traineddata
フラグで指定された unicharset が、--continue_from
で提供されたモデルで使用されたものと異なる場合、対応する unicharset
と recoder
を保持する traineddata
ファイルを --old_traineddata
フラグで指定する必要があります。これにより、トレーナーは文字セット間のマッピングを計算できます。
トレーニングデータは、シリアライズされた DocumentData
である .lstmf
ファイルで提供されます。これには、画像と対応する UTF8 テキストの転写が含まれており、古いエンジンで .tr
ファイルが作成されたのと同様の方法で、Tesseract を使用して tif/box ファイルのペアから生成できます。
LSTMTraining コマンドライン
lstmtraining プログラムは、ニューラルネットワークをトレーニングするための多目的ツールです。次の表は、そのコマンドラインオプションについて説明しています。
フラグ | 型 | デフォルト | 説明 |
---|---|---|---|
traineddata |
string |
なし | unicharset、recoder、およびオプションの言語モデルを含む、スターターの traineddata ファイルへのパス。 |
net_spec |
string |
なし | ネットワークのトポロジーを指定します。 |
model_output |
string |
なし | 出力モデルファイル/チェックポイントのベースパス。 |
max_image_MB |
int |
6000 |
画像のキャッシュに使用する最大メモリ量。 |
learning_rate |
double |
10e-4 |
SGD アルゴリズムの初期学習率。 |
sequential_training |
bool |
false |
シーケンシャル学習の場合は true に設定します。デフォルトでは、すべてのトレーニングデータがラウンドロビン方式で処理されます。 |
net_mode |
int |
192 |
network.h の NetworkFlags からのフラグ。取り得る値:モメンタムの代わりに Adam 最適化を使用する場合は 128 、異なるレイヤーが自動的に発見された独自の学習率を持つことを許可する場合は 64 。 |
perfect_sample_delay |
int |
0 |
ネットワークが良好になったら、最後の完全なサンプルが許可されてから、この数の不完全なサンプルが見られた後にのみ、完全なサンプルをバックプロパゲートします。 |
debug_interval |
int |
0 |
ゼロ以外の場合、この反復回数ごとに視覚的なデバッグを表示します。 |
weight_range |
double |
0.1 |
重みを初期化するためのランダム値の範囲。 |
momentum |
double |
0.5 |
アルファスムージング勾配のモメンタム。 |
adam_beta |
double |
0.999 |
ADAM アルゴリズムにおけるスムージングファクタの二乗勾配。 |
max_iterations |
int |
0 |
この反復回数後にトレーニングを停止します。 |
target_error_rate |
double |
0.01 |
平均エラー率がこの値を下回った場合にトレーニングを停止します。 |
continue_from |
string |
なし | トレーニングまたは微調整を継続する前のチェックポイントへのパス。 |
stop_training |
bool |
false |
--continue_from のトレーニングチェックポイントを認識モデルに変換します。 |
convert_to_int |
bool |
false |
stop_training で、わずかに精度が低下しますが、速度を上げるために 8 ビット整数に変換します。 |
append_index |
int |
-1 |
指定されたインデックスでネットワークのヘッドを切り取り、切り取られた部分の代わりに --net_spec ネットワークを追加します。 |
train_listfile |
string |
なし | トレーニングデータファイルをリストしたファイルの名前。 |
eval_listfile |
string |
なし | トレーニングデータとは独立してモデルを評価するために使用される評価データファイルをリストしたファイルの名前。 |
ほとんどのフラグはデフォルトで動作し、以下に示す特定の操作でのみいくつかのフラグが必要ですが、まずより複雑なフラグに関する詳細なコメントをいくつか示します。
Unicharset の圧縮と再コード化
LSTM はシーケンスを学習するのに優れていますが、状態の数が多すぎると非常に遅くなります。LSTM に多数のクラスの短いシーケンスよりも長いシーケンスを学習させる方が良いという経験的な結果があるため、複雑なスクリプト(漢字、ハングル、およびインド系スクリプト)の場合、各シンボルを少数クラスのコードの短いシーケンスとして再コード化する方が、多数のクラスを持つよりも優れています。
combine_lang_model
コマンドでは、この機能がデフォルトでオンになっています。各漢字を 1〜5 個のコードの可変長シーケンスとしてエンコードし、ハングルをジャモエンコードを使用して 3 個のコードのシーケンスとしてエンコードし、他のスクリプトを Unicode コンポーネントのシーケンスとしてエンコードします。結合子音を生成するためにヴィラーマ文字を使用するスクリプト(インド系スクリプト、ミャンマー語、クメール語)の場合、関数 NormalizeCleanAndSegmentUTF8
は、ヴィラーマを適切な隣接文字と組み合わせて、unicharset でよりグリフ指向のエンコードを生成します。この改善を最大限に活用するには、これらのスクリプトで combine_lang_model
の --pass_through_recoder
フラグを設定する必要があります。
ランダム化されたトレーニングデータと sequential_training
確率的勾配降下法が適切に機能するためには、トレーニングデータはすべてのサンプルファイルにわたってランダムにシャッフルされることになっており、トレーナーは各ファイルを順番に読み進め、最後に到達したら最初のファイルに戻ることができます。
レンダリングコードを使用している場合(tesstrain.py
を介して)、各ファイル内のサンプルテキスト行がシャッフルされますが、単一のフォントからのトレーニングサンプルを含むファイルのセットが生成されます。より均一な混合を追加するために、デフォルトでは、各ファイルから1つずつサンプルを順番に処理します。これは「ラウンドロビン」スタイルとも呼ばれます。他の方法でトレーニングデータを生成した場合、またはすべて同じスタイル(例えば、手書きの原稿本)である場合は、lstmtraining
の --sequential_training
フラグを使用できます。これにより、一度に 2 つのファイルからのみデータをロードし、それらを順番に処理するため、メモリ効率が向上します。(2 番目のファイルは先読みされ、必要に応じて準備ができます。)
モデル出力
トレーナーは、--model_output
をベース名として使用して、チェックポイントを定期的に保存します。したがって、いつでもトレーニングを停止し、同じコマンドラインを使用して再起動して、続行することが可能です。再起動を強制するには、異なる --model_output
を使用するか、すべてのファイルを削除します。
ネットモードと最適化
128
フラグは、通常のモメンタムよりもはるかにうまく機能するように見える Adam 最適化を有効にします。
64
フラグは、レイヤー固有の自動学習率を有効にします。進行が停滞した場合、トレーナーはどのレイヤーの学習率を個別に減らす必要があるかを調査し、学習を継続するために 1 つ以上の学習率を下げることができます。
デフォルトの net_mode
の値である 192
は、Adam とレイヤー固有の学習率の両方を有効にします。
完璧なサンプル遅延
「簡単な」サンプルでトレーニングすることは、時間の無駄なので必ずしも良いアイデアではありませんが、ネットワークがそれらの処理方法を忘れてはならないため、簡単なサンプルが頻繁に発生する場合は、一部の簡単なサンプルを破棄することができます。--perfect_sample_delay
引数は、最後の完全なサンプル以降にそれほど多くの不完全なサンプルが見られなかった場合、完全なサンプルを破棄します。
現在のデフォルト値であるゼロは、すべてのサンプルを使用します。実際には、この値は大きな影響を与えないようで、トレーニングを十分に長く実行すると、ゼロが最良の結果をもたらします。
デバッグ間隔とビジュアルデバッグ
ゼロ(デフォルト)の --debug_interval
では、トレーナーは次の例と同様の進捗レポートを 100 回の反復ごとに表示します。
At iteration 717/10500/10500, Mean rms=0.113000%, delta=0.009000%, BCER train=0.029000%, BWER train=0.083000%, skip ratio=0.000000%, New worst BCER = 0.029000 wrote checkpoint.
At iteration 718/10600/10600, Mean rms=0.112000%, delta=0.007000%, BCER train=0.023000%, BWER train=0.085000%, skip ratio=0.000000%, New worst BCER = 0.023000 wrote checkpoint.
2 Percent improvement time=509, best error was 2.033 @ 209
At iteration 718/10700/10700, Mean rms=0.111000%, delta=0.006000%, BCER train=0.019000%, BWER train=0.069000%, skip ratio=0.000000%, New best BCER = 0.019000 wrote best model:data/engRupee/checkpoints/engRupee_0.019000_718_10700.checkpoint wrote checkpoint.
2 Percent improvement time=509, best error was 2.033 @ 209
At iteration 718/10800/10800, Mean rms=0.108000%, delta=0.002000%, BCER train=0.007000%, BWER train=0.052000%, skip ratio=0.000000%, New best BCER = 0.007000 wrote best model:data/engRupee/checkpoints/engRupee_0.007000_718_10800.checkpoint wrote checkpoint.
Finished! Selected model with minimal training error rate (BCER) = 0.007
--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
は、最終的なソフトマックスの出力を示します。これは、ヌル文字の黄色の線として始まり、文字があると思われる各ポイントで徐々に黄色のマークが付けられます。(x 軸は画像の x 座標、y 軸は文字クラスです。)Output-back
ウィンドウは、実際の出力とターゲットの違いを同じレイアウトで示しますが、「これをさらにください」の場合は黄色、「これを減らしてください」の場合は青色で示します。ネットワークが学習するにつれて、ConvNL
ウィンドウは、最下位レイヤーから予想される典型的なエッジ検出器の結果を開発します。
LSTMForward
は、トレーニング画像でのネットワーク全体の出力を示します。LSTMTraining
は、トレーニング画像でのトレーニングターゲットを示します。どちらの場合も、各文字のピーク出力を示す緑色の線が描画され、文字自体が線の右側に描画されます。
見る価値のある他の 2 つのウィンドウは、CTC Outputs
と CTC Targets
です。これらは、ネットワークの現在の出力とターゲットを、画像 x 座標に対する出力の強さの線グラフとして示します。 Output
ウィンドウのようなヒートマップの代わりに、文字クラスごとに異なる色の線が描画され、y 軸が出力の強さになります。
反復とチェックポイント
トレーニング中に、次のような情報が表示されます。
2 Percent improvement time=100, best error was 100 @ 0
At iteration 100/100/100, Mean rms=6.042000%, delta=63.801000%, BCER train=98.577000%, BWER train=100.000000%, skip ratio=0.000000%, New best BCER = 98.577000 wrote checkpoint.
2 Percent improvement time=200, best error was 100 @ 0
At iteration 200/200/200, Mean rms=5.709000%, delta=58.372000%, BCER train=98.399000%, BWER train=99.986000%, skip ratio=0.000000%, New best BCER = 98.399000 wrote checkpoint.
...
At iteration 14615/695400/698614, Mean rms=0.131000%, delta=0.038000%, BCER train=0.207000%, BWER train=0.579000%, skip ratio=0.4%, wrote checkpoint.
上記の例では、
14615 : learning_iteration
695400 : training_iteration
698614 : sample_iteration
sample_iteration : 「トレーニングサンプルセットへのインデックス。(sample_iteration >= training_iteration)。」 これは、トレーニングファイルが学習プロセスに渡された回数です。
training_iteration : 「使用された実際のバックワードトレーニングステップの数。」 これは、トレーニングファイルが学習プロセスに正常に渡された回数です。したがって、「画像が大きすぎて学習できません!!」-「文字列のエンコードに失敗しました!」-「ヘッダーのデシリアライズに失敗しました」というエラーが発生するたびに、sample_iteration はインクリメントされますが、training_iteration はインクリメントされません。実際には、1 - (695400 / 698614) = 0.4% が skip ratio : エラーのためにスキップされたファイルの割合です。
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
と同様のトレーニングダンプですが、トレーニングが発散した場合に使用されるバックアップモデルがないため、サイズが小さくなっています。
これらのチェックポイントファイルのいずれも、lstmtraining で stop_training
および convert_to_int
フラグを使用することで、標準の(最適/浮動小数点)traineddata ファイル、またはわずかに精度が低い(高速/整数)traineddata ファイルに変換できます。
トレーニングからのエラーメッセージ
トレーニングの実行時に発生する可能性のあるエラーメッセージはいくつかあり、重要度の高いものもあれば、そうでないものもあります。
Encoding of string failed!
は、トレーニング画像のテキスト文字列が指定された unicharset を使用してエンコードできない場合に発生します。考えられる原因は以下のとおりです。
- テキストに、unicharset に存在しない文字(たとえば、unicharset にない英国ポンド記号)が含まれている。
- テキストに、印刷できない文字(タブや制御文字など)が迷い込んでいる。
- テキストに、表現されていないインドの書記素/アクサラが含まれている。
pct. 2 の(CHARACTER TABULATION、CARRIAGE RETURN、NO-BREAK SPACE、LEFT-TO-RIGHT MARK、RIGHT-TO-LEFT MARK、ZERO WIDTH NO-BREAK SPACE、POP DIRECTIONAL FORMATTING、ZERO WIDTH NON-JOINER)などの問題のある文字は、sed スクリプトで簡単に削除できます。
remove_control_chars.sed
s/\x09//g
s/\x0d//g
s/\x00\xa0/ /g
s/\x20\x0e//g
s/\x20\x0f//g
s/\xfe\xff//g
s/\x20\x2c//g
s/\x20\x0c//g
sed -i -f remove_control_chars.sed data/lang-ground-truth*.gt.txt
いずれにしても、そのトレーニング画像はトレーナーによって無視されます。エラーが頻繁に発生しない場合は無害ですが、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 ファイルに変換できます。これにより、トレーニングダンプから認識モデルが抽出され、unicharset、recoder、およびトレーニング中に提供された dawgs とともに、–traineddata 引数に挿入されます。
注: Tesseract は、lang.lstm
、lang.lstm-unicharset
、および lang.lstm-recoder
のみを含む traineddata ファイルで正常に動作するようになりました。lstm-*-dawgs
はオプションであり、他のコンポーネントは OEM_LSTM_ONLY を OCR エンジンモードとして使用する場合、必要でも使用されません。 バイグラム、unichar ambigs、または他のコンポーネントは、存在しても必要ではなく、効果もありません。他に機能するコンポーネントは、レイアウト分析やサブ言語に影響を与える可能性がある lang.config
のみです。
既存の Tesseract traineddata ファイルに追加した場合、lstm-unicharset
は Tesseract unicharset
と一致する必要はありませんが、LSTM をトレーニングし、lstm-*-dawgs
ファイルを構築するために、同じ unicharset を使用する必要があります。
幻覚効果
たとえば、モデルが誤った動作をしていることに気づいた場合、
- 特定の単語の先頭に
Small
文字の代わりにCapital
文字を追加する。 - 本来スペースを入れるべきではない箇所に
Space
を追加する。 - など…。