コンテンツにスキップ

Tesseract 4.00における新しいニューラルネットワークシステムの概要

はじめに

Tesseract 4.00には、テキスト行認識器として構成された新しいニューラルネットワークサブシステムが含まれています。これはOCRopusのPythonベースのLSTM実装を起源としていますが、Tesseract向けにC++で完全に再設計されています。TesseractのニューラルネットワークシステムはTensorFlowよりも前から存在しますが、Variable Graph Specification Language (VGSL)と呼ばれるネットワーク記述言語があるため、TensorFlowと互換性があります。これはTensorFlowでも利用可能です。 https://github.com/tensorflow/models/tree/master/research/street を参照してください。

VGSLの考え方は、多くのことを学ばなくてもニューラルネットワークを構築してトレーニングできるということです。 Python、TensorFlowを学ぶ必要も、C++コードを書く必要もありません。構文的に正しいネットワーク記述を作成するのに十分なほどVGSL仕様言語を理解するだけで済みます。さまざまなニューラルネットワークレイヤータイプとその組み合わせ方に関する基本的な知識があれば、非常に役立ちます。

Tesseractとの統合

Tesseract 4.00ニューラルネットワークサブシステムは、行認識器としてTesseractに統合されています。既存のレイアウト分析と組み合わせて大きなドキュメント内のテキストを認識したり、外部テキスト検出器と組み合わせて単一テキスト行の画像からテキストを認識したりできます。

ニューラルネットワークエンジンは4.00のデフォルトです。単一テキスト行の画像からテキストを認識するには、SetPageSegMode(PSM_RAW_LINE)を使用します。これはコマンドラインから-psm 13を使用して使用できます。

ニューラルネットワークエンジンは、Tesseract 3.04で動作していた多言語モードを有効にするために統合されましたが、これは将来のリリースで改善される予定です。中国語、日本語、韓国語の縦書きテキストがサポートされるようになり、自動的に検出されるはずです。

ハードウェアとCPUの要件

Tesseract 4.00ニューラルネットワークサブシステムは、計算負荷が非常に高く、基本的なTesseractの約10倍のCPUリソースを使用しますが、プラットフォームがサポートしている場合は、次のように影響が軽減されます。

複数のコアとAVXを搭載したマシンでは、簡単な英語の画像の処理に基本的なTesseractの2倍の実時間と7倍のCPUが必要になる場合がありますが、ヒンディー語は基本的なTesseractよりも多くのCPUを使用しますが、実際の実時間では高速に動作します。

上記のコンポーネントがない場合は、コードが引き続き動作するようにする、より低速なプレーンC++実装があります。

リトルエンディアンとビッグエンディアンの両方のシステムがサポートされています。

オープンソースコントリビューター向け

初期実装には以下が欠けています

実装の基本

すべてのネットワークレイヤータイプは、Network基底クラスから派生しています。Plumbingサブクラスは、入力/出力を再形成したり、レイヤーのグループを編成したりするなど、何らかの方法で他のレイヤーを操作するレイヤーの基底クラスです。

入力/出力データ「テンソル」はNetworkIOであり、重みはWeightMatrixに格納されます。どちらもデータを保持するためにTesseract GENERIC_2D_ARRAYを含みます。LSTMRecognizerは、テキスト行の画像をtesseract WERD_RESクラスのシーケンスに変換するという、より高レベルの抽象化を提供します。LSTMTrainerも同様に、UTF-8文字列「truth」を持つテキスト行の画像でネットワークをトレーニングするという抽象化を処理します。NetworkBuilderは、VGSL仕様言語をネットワーク要素のグラフに変換する役割を担います。

新しいレイヤータイプの追加

新しいレイヤークラスは、NetworkまたはPlumbingから派生し、少なくとも以下の仮想メソッドを実装する必要があります。

重みを持つレイヤーは、一連の勾配で重みを更新するためにUpdateも実装する必要があります。新しいレイヤーの特定の要件に応じて、実装する必要があるメソッドが他にもかなりあります。実装が必要になる可能性のあるメソッドの詳細については、network.hを参照してください。