ニューラルネットベースのLSTM Tesseract 4.00のトレーニングについては、Tesseract 4.00のトレーニングを参照してください。
Tesseract 2.xを新しい言語でトレーニングするために提供されているツールをどのように使用するか?
注記: これらの手順は、古いバージョンのTesseractに関するものです。最近のバージョンに関するトレーニング手順はこちらにあります。
はじめに
Tesseract 2.0は完全にトレーニング可能です。このページでは、トレーニングプロセスについて説明し、さまざまな言語への適用性に関するガイドラインと、結果から期待できることについて説明します。
背景と制限事項
Tesseractはもともと英語テキストのみを認識するように設計されました。他の言語とUTF-8文字を処理できるように、エンジンとそのトレーニングシステムを変更するための努力が払われてきました。Tesseract 2.0は任意のUnicode文字(UTF-8でコード化された文字)を処理できますが、それが成功する言語の範囲には限界があります。そのため、特定の言語でうまく機能するという期待を膨らませる前に、このセクションをよく考慮してください!
Tesseractは、左から右の言語しか処理できません。右から左の言語でも何か出力できますが、出力ファイルはテキストが左から右であるかのように順序付けられます。上から下への言語は、現在では不可能です。
Tesseractは、アラビア語のような連結スクリプトを処理できない可能性が高いです。これを処理するには、特殊なアルゴリズムが必要であり、現時点ではそれを持っていません。
Tesseractは、文字セットの大きい言語(中国語など)では非常に遅くなる可能性があり、おそらく役に立たないでしょう。また、256文字を超える言語に対応するために、いくつかのコード変更を行う必要があります。
句読点と数字が異なる言語は、ASCII句読点と数字を想定するいくつかのハードコードされたアルゴリズムによって不利になります。
必要なデータファイル
別の言語でトレーニングするには、tessdata
サブディレクトリに8個のデータファイルを作成する必要があります。命名規則はlanguagecode.file_name
です。言語コードはISO 639-3規格に従います。英語で使用される8つのファイルは次のとおりです。
tessdata/eng.freq-dawg
tessdata/eng.word-dawg
tessdata/eng.user-words
tessdata/eng.inttemp
tessdata/eng.normproto
tessdata/eng.pffmtable
tessdata/eng.unicharset
tessdata/eng.DangAmbigs
最小限で済ませるには?
下記の手順を使用して、inttemp、normproto、pffmtable、freq-dawg、word-dawg、およびunicharsetを**必ず**作成する必要があります。限られた範囲のフォント(例えば、単一のフォント)のみを認識しようとしている場合、単一のトレーニングページで十分な場合があります。DangAmbigsとuser-wordsは空ファイルでもかまいません。単語リストがない場合は、辞書ファイルfreq-dawgとword-dawgに多くの単語を与える必要はありませんが、適切なサイズの(例えば英語の場合は数万語)辞書がある場合よりも精度は低くなります。ただし、少なくとも2.04以前では、空のdawgファイルと単語のないdawgファイルは許可されていません。
トレーニング手順
手順の一部は避けられないほど手動です。可能な限り自動化されたヘルプを提供しています。将来的には、より自動化されたツールが登場する可能性があります。以下で参照されているツールはすべて、trainingサブディレクトリに組み込まれています。
トレーニング画像の生成
最初のステップは、使用する完全な文字セットを決定し、例一式のテキストまたはワードプロセッサファイルを用意することです。トレーニングファイルを作成する際に最も重要な点は次のとおりです。
- 各文字のサンプルを最低限の数用意してください。10個が良いですが、まれな文字の場合は5個でも大丈夫です。
- より頻繁に出現する文字には、より多くのサンプルが必要です(少なくとも20個)。
- 非文字をまとめてグループ化する間違いを犯さないでください。テキストをより現実的にします。例えば、「The quick brown fox jumps over the lazy dog. 0123456789 !@#$%^&(),.[]{}<>/?」はひどいです。「The (quick) [brown] {fox} jumps! over the $3,456.78
<lazy>
#90 dog & duck/goose, as 12.5% of E-mail from aspammer@website.com is spam?」の方がはるかに優れています。これにより、テキストライン検索コードは、特殊文字のベースラインメトリクスをより適切に取得する可能性が高まります。 - 印刷時にテキストを少し間隔を空けて配置することは**絶対に不可欠**です。そのため、ワードプロセッサで文字間間隔と行間間隔を広げます。テキストの間隔を十分に空けないと、trファイル生成中に「FAILURE! box overlaps no blobs or blobs in multiple rows」エラーが発生し、致命的なエラーにつながります - 「x」のラベル付きサンプルが0個になり、「Error: inttempにX個のクラスがあるのに、unicharsetにはY個のユニチャがある」となり、新しいデータファイルを使用できなくなります。
- トレーニングデータは現在、単一のtiff画像に収まる必要がありますが、マルチページtiffでもかまいません(libtiffがインストールされている場合)。
- 複数のサイズでトレーニングする必要はありません。10ポイントで十分です。(例外として非常に小さいテキストがあります。約15ピクセルよりも小さいx高さのテキストを認識したい場合は、それを具体的にトレーニングするか、認識しようとする前に画像のサイズを変更する必要があります。)
- **同じページにフォントを混ぜないでください**(正確には、単一の.trファイル内)。これにより、クラスタリング時に特徴が削除され、認識エラーが発生します。
- ダウンロードページにあるサンプルのboxtiffファイルは、トレーニングデータのフォーマット方法がわからない場合に役立ちます。
次に、印刷してスキャンするか(または何らかの電子レンダリング方法を使用するか)して、トレーニングページの画像を作成します。最大32個のトレーニング画像を使用できます。イタリック体やボールド体を含む、さまざまなフォントとスタイルのページを作成するのが最適です。
注記: 間隔を空ける必要があるため、実際の画像からのトレーニングは実際にはかなり困難です。これは今後のリリースで改善されます。今のところ、独自のトレーニングテキストを印刷/スキャンできる方がはるかに簡単です。
また、次のステップでコードを別のファイルに挿入する必要があるため、トレーニング画像をUTF-8テキストファイルとして保存する必要があります。
大量のトレーニングデータに関する明確化 32画像の制限は、フォントの数です。各フォントは単一のマルチページtiffに配置できます**(libtiffを使用している場合のみ!)**、ボックスファイルは座標の後に各文字のページ番号を指定するように変更できます。したがって、任意の量のトレーニングデータが特定のフォントに対して作成でき、大規模な文字セット言語のトレーニングが可能になります。マルチページtiffの代替として、単一のフォントに対して多くのシングルページtiffを作成し、各フォントのtrファイルをいくつかのシングルフォントtrファイルに連結する必要があります。いずれの場合も、mftrainingへの入力trファイルにはそれぞれ単一のフォントが含まれていなければならず、ファイルの順序は、unicharset_extractorに与えられる順序と一致する必要があります。
ボックスファイルの作成
次のステップでは、Tesseractは各トレーニング画像に「ボックス」ファイルが必要です。ボックスファイルは、トレーニング画像内の文字を順に、行ごとに1文字ずつ列挙したテキストファイルで、画像の周りのバウンディングボックスの座標が記述されています。Tesseract 2.0には、必要な形式のテキストファイルを出力するモードがありますが、文字セットが現在のトレーニングとは異なる場合、テキストが正しくないのは当然です。したがって、ここでの重要なプロセスは、ファイルを編集して正しい文字を入力することです。
このコマンドラインを使用して、各トレーニング画像でTesseractを実行します。
tesseract fontfile.tif fontfile batch.nochop makebox
その後、fontfile.txt
の名前をfontfile.box
に変更する必要があります。
さて、難しい部分です。fontfile.boxファイルを編集し、各行の先頭に、Tesseractによって配置された正しくない文字の代わりに、各文字のUTF-8コードを入力する必要があります。例:ディストリビューションには、eurotext.tifという画像が含まれています。上記のコマンドを実行すると、次の行を含むテキストファイルが生成されます(142行目~155行目)。
s 734 491 751 516
p 753 483 776 515
r 779 492 796 516
i 799 492 810 525
n 814 492 837 516
g 839 483 862 516
t 865 491 878 520
u 101 452 122 483
b 126 453 146 486
e 149 452 168 477
r 172 453 187 476
d 211 450 232 483
e 236 450 255 474
n 259 451 281 474
Tesseractは英語モードで実行されたため、ウムラウトを正しく認識しません。この文字は、適切なエディタを使用して修正する必要があります。UTF-8を理解するエディタを使用する必要があります。HTMLエディタは通常、良い選択肢です。(Linux上のMozillaを使用すると、ブラウザから直接UTF-8テキストファイルを編集できます。FirefoxとIEではこれを行うことができません。MS Wordはさまざまなテキストエンコーディングを非常にうまく処理し、Notepad++はUTF-8を理解する別のエディタです。)LinuxとWindowsの両方には、入力できない文字をコピーするために使用できる文字マップがあります。この場合、uをüに変更する必要があります。
理論的には、ボックスファイルの各行はトレーニングファイルの文字の1つを表す必要がありますが、下部の二重引用符「„」など、水平に分割された文字がある場合、おそらくマージする必要がある2つのボックスがあるでしょう!
例:117行目~130行目
D 101 503 131 534
e 135 501 154 527
r 158 503 173 526
, 197 496 205 507
, 206 496 214 508
s 220 499 236 524
c 239 499 258 523
h 262 500 284 532
n 288 500 310 524
e 313 499 332 523
l 336 500 347 533
l 352 500 363 532
e 367 499 386 524
" 389 520 407 532
ご覧のとおり、低い二重引用符文字は2つの単一のコンマとして表現されています。バウンディングボックスは次のようにマージする必要があります。
- 最初の数字(左):2行の最小値を取ります(197)
- 2番目の数字(下):2行の最小値を取ります(496)
- 3番目の数字(右):2行の最大値を取ります(214)
- 4番目の数字(上):2行の最大値を取ります(508)
これは次のようになります。
D 101 503 131 534
e 135 501 154 527
r 158 503 173 526
„ 197 496 214 508
s 220 499 236 524
c 239 499 258 523
h 262 500 284 532
n 288 500 310 524
e 313 499 332 523
l 336 500 347 533
l 352 500 363 532
e 367 499 386 524
" 389 520 407 532
トレーニング画像で文字の間隔をうまく空けられなかった場合は、一部の文字が1つのボックスに結合されている場合があります。この場合、間隔を空けた画像を作り直してやり直すか、ペアが共通している場合は、両方の文字を行の先頭に配置し、バウンディングボックスに両方を表させます。(2.04以降、「文字」の説明には24バイトの制限があります。これにより、コードがunicodeセット内のどこに位置しているかによって、6〜24個のunicodeを文字の説明に使用できます。この制限に達した場合は、状況を説明する問題を提出してください。)
注記 ボックスファイルで使用されている座標系では、(0,0)が左下にあります。
UTF-8を理解するエディタがある場合、UTF-8文字ごとに最大4バイトのコードがあるため、単純なエディタはすべてのバイトを個別に表示するため、このプロセスははるかに簡単になります。
ボックスファイルを編集するための視覚的なツールがいくつかあります。../AddOnsを確認してください。
新しい文字セットのブートストラップ
新しい文字セットのトレーニングを試みている場合は、単一のフォントで1つの適切なボックスファイルを作成することに努力を払い、トレーニングプロセスの残りを実行し、新しい言語でTesseractを使用して残りのボックスファイルを次のように作成することをお勧めします。
tesseract fontfile.tif fontfile -l yournewlanguage batch.nochop makebox
これにより、2番目のボックスファイルの作成が容易になります。Tesseractがほとんどのテキストを正しく認識する可能性が高いからです。トレーニングセットにさらにフォントを追加する(つまり、以下のmfTrainingとcnTrainingのコマンドラインに)ことができますが、既存のセットに新しいトレーニングデータを追加できる増分トレーニングモードはありません。つまり、mfTrainingとcnTrainingを実行するたびに、コマンドラインで指定したtrファイルから新しいデータファイルが最初から作成され、これらのプログラムは既存のintproto/pffmtable/normprotoを直接追加することはできません。
Tif/Boxペアを提供!
Tif/Boxファイルペアはダウンロードページにあります。(tiffファイルはサイズを節約するためにG4圧縮されているため、libtiffが必要になります)。独自の言語または既存の言語のサブセットのためにより良いトレーニングデータを作成したり、既存の言語に異なる文字/形状を追加したりするために、次のプロセスに従うことができます。
- ボックスファイルから、必要な文字のみの行を残してフィルタリングします。
- トレーニング用のtesseractを実行します(下記)。
- 各フォントについて、複数の言語の.trファイルを連結し、必要な文字セットを取得します。自身のフォントまたは文字の.trファイルを追加します。
- .trファイルと同様に、フィルタリングされたボックスファイルを連結して、unicharset_extractorに渡します。
- トレーニングプロセスの残りの部分を実行します。注意!これは見た目ほど簡単ではありません!cntrainingとmftrainingは最大32個の.trファイルしか処理できないため、同じフォントの複数の言語からのすべてのファイルを連結して、32個の言語が結合されたがフォントは個別のファイルを作成する必要があります。unicharset_extractorに渡す際、.trファイルにある文字は、ボックスファイルにある文字の順番と**必ず**一致する必要があります。そのため、.trファイルと同じ順番でボックスファイルを連結する必要があります。cn/mftrainingとunicharset_extractorのコマンドラインには、異なるフォントに対して異なるフィルタリングを行っている場合に備えて、.trファイルと.boxファイルを**同じ順番**で指定する必要があります。これらすべての処理を行い、文字マップのように文字を選択するプログラムが利用できるかもしれません。これにより、全体が容易になる可能性があります。
トレーニングのためのTesseractの実行
トレーニング画像とボックスファイルのペアごとに、トレーニングモードでTesseractを実行します。
tesseract fontfile.tif junk nobatch box.train
または
tesseract fontfile.tif junk nobatch box.train.stderr
最初の形式では、Windowsバージョン2.03以前と同様に、すべてのエラーがtesseract.log(すべてのプラットフォーム)に送信されます。box.train.stderrを使用すると、Windows以外のプラットフォームのバージョン2.03以前と同様に、すべてのエラーがすべてのプラットフォームのstderrに送信されます。
ボックスファイル名は、パスを含めてtifファイル名と一致する必要があります。そうでなければ、Tesseractはそれを検出しません。このステップの出力はfontfile.tr
であり、トレーニングページの各文字の特徴が含まれています。また、出力名は入力画像名から取得され、ここに示されている通常の出力名junk
とは異なる点にも注意してください。junk.txtも改行のみでテキストなしで書き込まれます。
**重要** apply_boxからの出力にエラーがないか確認してください。FATALITIESが報告されている場合、ボックスファイルを修正するまでトレーニングプロセスを続ける意味はありません。新しいbox.train.stderr設定ファイルにより、出力場所の選択が容易になります。FATALITIESは通常、このステップでボックスファイルにリストされている文字のトレーニングサンプルが見つからなかったことを示しています。座標が間違っているか、対象の文字の画像に問題があります。使用可能な文字サンプルがない場合、認識できず、生成されたinttempファイルは後でunicharsetファイルと一致せず、Tesseractは異常終了します。
もう1つの発生する可能性のあるエラーは**致命的で注意が必要な**「Box file format error on line n」に関するエラーです。「Bad utf-8 char…」が先行する場合は、UTF-8コードが正しくなく、修正する必要があります。「utf-8 string too long…」エラーは、文字の説明で8(v2.01)バイトの制限を超えたことを示しています。8バイトより長い説明が必要な場合は、問題を報告してください。上記のいずれのエラーも含まないボックスファイル形式エラーは、バウンディングボックスの整数に問題があるか、ボックスファイルに空行がある可能性を示しています。空行自体は実際には無害であり、この場合はエラーを無視できます。コードによって無視される可能性がありますが、ボックスファイルに意図しない問題がある場合に備えて、無視しません。
fontfile.trファイルの内容を編集する必要はありません。その中のフォント名は設定する必要はありません。興味のある方のために、フォーマットに関する情報を以下に示します。
Every character in the box file has a corresponding set of entries in
the .tr file (in order) like this
UnknownFont <UTF-8 code(s)> 2
mf <number of features>
x y length dir 0 0
... (there are a set of these determined by <number of features>
above)
cn 1
ypos length x2ndmoment y2ndmoment
The mf features are polygon segments of the outline normalized to the
1st and 2nd moments.
x= x position [-0.5.0.5]
y = y position [-0.25, 0.75]
length is the length of the polygon segment [0,1.0]
dir is the direction of the segment [0,1.0]
The cn feature is to correct for the moment normalization to
distinguish position and size (eg c vs C and , vs ')
クラスタリング
すべてのトレーニングページの文字特徴が抽出されたら、それらをクラスタリングしてプロトタイプを作成する必要があります。mftraining
とcntraining
プログラムを使用して、文字形状の特徴をクラスタリングできます。
mftraining fontfile_1.tr fontfile_2.tr ...
これにより、2つのデータファイルinttemp
(形状プロトタイプ)とpffmtable
(各文字の予想される特徴の数)が出力されます。(Microfeat
という3番目のファイルもこのプログラムによって書き込まれますが、使用されません。)
cntraining fontfile_1.tr fontfile_2.tr ...
これにより、normproto
データファイル(文字正規化感度プロトタイプ)が出力されます。
文字セットの計算
Tesseractは、出力可能な文字セットを知る必要があります。unicharset
データファイルを生成するには、クラスタリングに使用したものと同じトレーニングページのバウンディングボックスファイルに対してunicharset_extractor
プログラムを使用します。
unicharset_extractor fontfile_1.box fontfile_2.box ...
Tesseractは、isalpha、isdigit、isupper、islowerの文字プロパティにアクセスする必要があります。このデータはunicharset
データファイルにエンコードする必要があります。このファイルの各行は1つの文字に対応します。UTF-8の文字の後に、プロパティをエンコードするバイナリマスクを表す16進数が続きます。各ビットはプロパティに対応します。ビットが1に設定されている場合、プロパティがtrueであることを意味します。ビットの順序は(最下位ビットから最上位ビットまで):isalpha、islower、isupper、isdigitです。
例
- ‘;’はアルファベット文字、小文字、大文字、数字ではありません。したがって、そのプロパティはバイナリ数0000(16進数で0)で表されます。
- ‘b’はアルファベット文字であり、小文字です。したがって、そのプロパティはバイナリ数0011(16進数で3)で表されます。
- ‘W’はアルファベット文字であり、大文字です。したがって、そのプロパティはバイナリ数0101(16進数で5)で表されます。
- ‘7’は数字だけです。したがって、そのプロパティはバイナリ数1000(16進数で8)で表されます。
; 0
b 3
W 5
7 8
システムがwctype関数をサポートしている場合、これらの値はunicharset_extractorによって自動的に設定され、**unicharsetファイルを編集する必要はありません。**一部の古いシステム(例:Windows 95)では、これらのプロパティ記述コードを追加するために、unicharsetファイルを手で編集する必要があります。
**注意** inttemp、normproto、pffmtableが生成されるたびにunicharsetファイルを再生成する必要があります(つまり、ボックスファイルが変更された場合は**すべて**再作成する必要があります)。これらは同期している必要があるためです。unicharsetの行は正しい順序である必要があります。inttempはunicharsetへのインデックスを格納し、分類器によって返される実際の文字は、指定されたインデックスのunicharsetから取得されるためです。
辞書データ
Tesseractは、言語ごとに3つの辞書ファイルを使用します。2つのファイルは有向非巡回グラフ(DAWG)としてコード化され、もう1つはプレーンなUTF-8テキストファイルです。DAWG辞書ファイルを作成するには、まず使用する言語の単語リストが必要です。単語リストは、行ごとに1つの単語を含むUTF-8テキストファイルとしてフォーマットされます。単語リストを2つのセットに分割します。頻繁に使用される単語と、それ以外の単語です。次に、wordlist2dawg
を使用してDAWGファイルを作成します。
wordlist2dawg frequent_words_list freq-dawg
wordlist2dawg words_list word-dawg
**注意:単語リストには少なくとも1つの単語を含める必要があります!**空のファイルと単語のない辞書は**現在**サポートされていません!(少なくとも1つの認識される単語を知っているはずです。)
単語が常にgoogle.comのように句読点を含んでいる場合は、辞書に含めることをお勧めします。
3番目の辞書ファイルはuser-wordsと呼ばれ、通常は空です。
最後のファイル
Tesseractが使用する最後のデータファイルはDangAmbigsと呼ばれます。これは、文字または文字セット間の固有のあいまいさを表し、現在は完全に手動で生成されます。ファイル形式を理解するには、次の例を参照してください。
1 m 2 r n
3 i i i 1 m
最初のフィールドは2番目のフィールドの文字数です。3番目のフィールドは4番目のフィールドの文字数です。他のファイルと同様に、これはUTF-8形式のファイルであるため、各文字は複数のバイトで表される場合があります。最初の行は、ペア 'rn' が誤って 'm' として認識されることがあることを示しています。2行目は、文字 'm' が誤ってシーケンス 'iii' として認識されることがあることを示しています。両側の文字はunicharsetに存在する必要があります。このファイルを使用して、文字をあるセットから別のセットに翻訳することはできません。
DangAmbigsファイルも空にすることができます。
全てをまとめる
以上です!あとは、8つのファイルをすべてまとめて、lang.
プレフィックス(langはhttp://en.wikipedia.org/wiki/List_of_ISO_639-2_codesから取得した言語の3文字コード)を付けて名前変更し、tessdataディレクトリに配置するだけです。その後、Tesseractは(理論的には)次のコマンドでその言語のテキストを認識できるようになります。
tesseract image.tif output -l lang
(実際には、言語コードとして任意の文字列を使用できますが、他の誰でも簡単に使用できるようにするには、ISO 639を使用するのが適切です。)