ABBYY FlexiCapture Engine 10.0:新しいツールによる柔軟性のトレーニング

開発者向けの補充製品-ABBYY FlexiCapture Engineの次のバージョンがリリースされました。 これは、ユーザーソリューションに画像からデータを入力(データキャプチャ)するためのテクノロジを埋め込むことができる製品であることを思い出させてください。



新しいバージョンの興味深い機能の1つは、簡単な種類のドキュメントからデータを抽出するようにすばやく構成できることでした。 私の同僚はすでにこの機能がFlexiLayout Studio 10でどのように実装されているかについてHabrの読者に語っています。APIが製品の新バージョンに追加され、この機能への完全なプログラムアクセスを提供します。 さらに、使いやすいツール(ソースコードとしても利用可能)を作成して、ユーザーのタスクを数分で調整できるようにし( このビデオに示すように)、テクノロジーの微妙さを深く掘り下げることなく、ソリューションの迅速なプロトタイプを作成しました。



この記事は、開発者が開発者向けに作成したもので、このテクノロジーの可能性と限界について説明します。マーケティング資料にはありません。





データキャプチャテクノロジの広範な使用の妨げとなっている既知の問題の1つは、必要な画像タイプで作業をセットアップするための時間と労力の初期投資が高いことです。 インテグレーター-開発者は、多くのツールで作業する方法を学ぶ必要があり、かなり複雑なテクノロジーの複雑さを理解する必要があります。 その後のみ、彼はターンキーソリューションの最も単純なプロトタイプを収集し、プロジェクト全体の有効性と実行可能性を評価できます。



新しいツールキットを使用すると、リリース前に既製のソリューションを微調整する段階まで、またはバージョン2まで、この技術の深い知識を延期できます。 FlexiLayout Studioなどの高度なツールを完全に置き換えることはできませんが、単純な場合やより複雑な場合に作業を再複雑化せずに、簡単に機能するプロトタイプをすばやく取得できます。



この記事ですでに説明したように 、実際にAPIを使用してデータを抽出するには、数行のコードしか必要ありませんが、その中には1行しかありません。



//            IFlexiCaptureProcessor processor = engine.CreateFlexiCaptureProcessor(); processor.AddDocumentDefinitionFile( sampleFolder + "Invoice_eng.fcdot" );
      
      





この1行のコードは、特定の種類のドキュメントの作業をセットアップします。 FCDOT拡張子( F lexi C apture DO cument T emplate)のファイルには、制限が課された抽出データの説明、画像内でこのデータを見つける方法、認識設定、およびオプションでドキュメントデータをエクスポートするための設定が含まれます。



サンプルを使用する場合、すべてが簡単です-必要なドキュメント定義ファイルが添付されます。 しかし、どのように動作するかを「感じる」ために、現在のタスクのドキュメントの同様の定義を取得する方法は?



10年代のリリース前には、いずれの場合でも、デスクトップバージョンのFlexiCaptureをインストールし、少なくともドキュメント定義エディター(明確に定義された参照ポイントを備えた硬い構造のドキュメントを操作するため)の操作方法を学ぶ必要がありました。ドキュメントの柔軟なレイアウトを記述するためのFlexiLayout Studioツールの使用方法を学びます。 同時に、「会議」の最も単純な作業バージョンでさえ作成することはほとんど不可能です。ほぼ確実に、両方のツールのドキュメントを注意深く読むか、トレーニングコースを受講する必要があります。



今何? ウィザードの形式で作成された自動テンプレート生成ツールの簡単な例があります。これは、数分で満足のいくプロトタイプを取得するのに役立ちます。 これがどのように機能するかの例を見てみましょう。



挑戦する



ある会計システムに小切手を登録するためのアプリケーションを作成し、スキャンした小切手がたくさんあるとします。 このパックから同じタイプのチェックを選択し、アプリケーションのドキュメント定義(ドキュメントテンプレート)のプロトタイプを作成します。



可能性と制限について事前に言います:



•任意のチェックで適切に機能するユニバーサルテンプレートを作成することはできません 。テンプレートは、 ほぼ同じタイプのチェックで、できれば単一のソースでうまく機能します

•現在のバージョンでは、テーブルなどの複雑な構造記述することはできません 。 そのようなことのために、FlexiLayout Studioを学ぶ必要があります

•しかし、 数値、日付、金額などの「フラットな」データをかなり抽出できます。



解決策



それでは始めましょう。 最初に、興味のあるタイプの画像(3〜5個)をいくつか持つパパが必要です。 これがトレーニング画像フォルダーになります。 この段階では、データに余分な「ノイズ」がなく、テンプレートが完全な認識でケースと一致するように、良質の画像が望ましいです。



1.ウィザードを実行して、フォルダーへのパスを指定します。





2.言語を選択します。





3.抽出されたフィールドを「描画」し、名前を付けます。





4.ここで、参照要素(参照要素)を描画する必要があります。 これは、プロセス全体で完全に些細なステップではありません。 サポート要素は、画像(通常はテキスト)内のいくつかの選択された静的(つまり、永続的な)オブジェクトで、これに対して可変コンテンツのフィールドが検索されます。 通常、この例(スクリーンショットを参照)のように、フィールド名はサポート要素の役割に適しています。



愛人メモ
NB。 サポート要素は各フィールドにある必要はありません。 これは、小さなドキュメントの1行になり、フィールドは非常に厳密に配置されます。 不要な混乱を招かないように、サポート要素が多すぎてはいけません。 サポート要素のテキストは変更できます。主なことは、セマンティクスを保持することです。この場合、一部のチェックで「Total:」の代わりに「Total:」を使用できます。学習プロセスでは、それが同一であることを一度示すだけです。 テキストが一意であることが重要です。たとえば、ドキュメントに「合計」と「VAT付き合計」が同時に存在する場合、「合計」という別の単語は不適切なサポートになります。







5.次に、トレーニングパッケージのすべての画像を順番に確認し、マークアップを確認します。 各画像のシステムにはマークアップオプションがあり、既にテストされた画像のトレーニング結果に従って取得されます。 私たちのタスクは、エラーを修正することです。フィールドのジオメトリを修正し、見つからないものを描画し、余分なものを削除します。 私たちの場合、最初の画像の後にオーバーレイにエラーはありませんが、認識には小さな問題があります。



愛人メモ
NB。 認識の問題は、デフォルトの認識オプションを使用してそれらを調整できるために発生します(たとえば、フォントタイプをドットマトリックスプリンターに設定し、可能なアルファベットを制限したり、一部のフィールドに正規表現を設定したりします)。 現在、APIにはそのような機会がありますが、検討中のツールにはそのような機能はまだありません。



NB。 一部のフィールドは一部の画像に表示されない場合があります。



NB。 [テンプレート]メニューの[言語とフィールドの変更]メニューを使用すると、何かを忘れた場合にいつでも言語とフィールドの編集に戻ることができます。









6.選択した画像のトレーニングが終了したら、結果のテンプレートを確認することをお勧めします。 「はい」と答えて、必要な種類のすべての画像があるテストフォルダーとして選択します。



フォルダーの各画像に対して一貫して、オーバーレイ結果が提供されます。 タスクは、成功または失敗をクリックして統計を収集することです。 テンプレートが一部の画像と重ならず、画像が非常に正常に見える場合、[現在の画像をトレーニングバッチに追加する]ボタンをクリックして、テスト用にパッケージに追加できます。 テストが完了すると、「追加された画像を再トレーニング」することができ、テンプレートを一貫して改善できます。



愛人メモ
NB。 この段階では、一般的なエラーを考慮して、最低品質の画像をトレーニングパッケージに混在させることができます。 主なことは無理をしないことです。

NB。 アプリケーションの操作はいつでも中断できます。 再起動すると、完了した場所から続行できます。 さらに、1週間または1か月以内に作業を改善したい新しい画像が表示された場合、いつでも「プロジェクト」に戻ることができます。







7.結果が満足された後、最後に行う必要があるのは、結果のテンプレートをFCDOTファイルにエクスポートし、すべてを開始し、アプリケーションのコードの記述に戻ることです。





結果



その結果、画像に非常によく重ねられたテンプレート(90を超える品質)が得られましたが、フィールドのフォント機能とフィールドのデータ型(日付、番号など)が考慮されていないため、フィールドの認識にいくつかの問題があります。 プロトタイプについては、かなり良いです。



繰り返しますが、説明したツールは普遍的であるとは限りません。 汎用性が必要な場合は、FlexiLayout Studioの使用方法と柔軟な説明の言語を学習する必要があります。 しかし、「複数のフィールドを抽出する」などの非常に単純なタスクの場合、非常にうまく機能し、より迅速かつ簡単に実用的なソリューションを得ることができます。



APIについて少し



説明したツールは完全にパブリックAPIで記述されており、ソースコードが付属しているため、お客様はニーズに合わせて修正したり、エンドユーザー向けの製造ツールのベースとして使用したりできます。 エンドユーザーにとって、このような機能は、新しいドキュメント用にシステムをすばやく構成する機能に役立つ場合があります。



API呼び出しのレベルでの例の作業は次のようになります(以下のコメントを参照)。

シナリオ1-線形。 IDEASは最初から最後まで予測可能です。 理解しやすい


コード
 //        ITrainingBatch trainingBatch = engine.CreateTrainingBatch( rootFolder, "_TrainingBatch", "English" ); try { trainingBatch.AddImageFile( rootFolder + "\\00.jpg" ); trainingBatch.AddImageFile( rootFolder + "\\01.jpg" ); //       ITrainingPage firstPage = trainingBatch.Pages[0]; //      .        //   (    UI   ) firstPage.PrepareLayout(); //  “”      .    for( int j = 0; j < firstPage.ImageObjects.Count; j++ ) { ITrainingImageObject obj = firstPage.ImageObjects[j]; string text = obj.RecognizedText; //  “”  if( text == "978-1-4095-3439-6" ) { // “”  ITrainingField isbnField = trainingBatch.Definition.Fields.AddNew( "ISBN", TrainingFieldTypeEnum.TFT_Field ); firstPage.SetFieldBlock( isbnField, obj.Region ); break; } } for( int j = 0; j < firstPage.ImageObjects.Count; j++ ) { ITrainingImageObject obj = firstPage.ImageObjects[j]; string text = obj.RecognizedText; //  “”    if( text == "ISBN" ) { // “”   ITrainingField isbnTag = trainingBatch.Definition.Fields.AddNew( "ISBNTag", TrainingFieldTypeEnum.TFT_ReferenceText ); firstPage.SetFieldBlock( isbnTag, obj.Region ); break; } } assert( trainingBatch.Definition.Fields.Count == 2 ); //      trainingBatch.SubmitPageForTraining( firstPage ); //      for( int i = 1; i < trainingBatch.Pages.Count; i++ ) { ITrainingPage page = trainingBatch.Pages[i]; //    ,     page.PrepareLayout(); //    trainingBatch.SubmitPageForTraining( page ); } //   .        CreateDocumentDefinitionFromAFL trainingBatch.Definition.ExportToAFL( rootFolder + "\\_TrainingBatch\\NewTemplate.afl" ); } finally { trainingBatch.Close(); }
      
      









シナリオ2-非線形。 ページごとのユーザーの音声は、いつでも説明を変更する場合があります。 ユーザーにとって便利




コード
 //        ITrainingBatch trainingBatch = engine.CreateTrainingBatch( rootFolder, "_TrainingBatch", "English" ); try { trainingBatch.AddImageFile( rootFolder + "\\00.jpg" ); trainingBatch.AddImageFile( rootFolder + "\\01.jpg" ); //  ,        ITrainingPage page = trainingBatch.PrepareNextPageNotSubmittedForTraining(); while( page != null ) { //       ,       .   //  ,           if( page == trainingBatch.Pages[0] ) { for( int j = 0; j < page.ImageObjects.Count; j++ ) { TrainingImageObject obj = page.ImageObjects[j]; string text = obj.RecognizedText; //  “”  if( text == "978-1-4095-3439-6" ) { // “”  ITrainingField isbnField = trainingBatch.Definition.Fields.AddNew( "ISBN", TrainingFieldTypeEnum.TFT_Field ); page.SetFieldBlock( isbnField, obj.Region ); break; } } for( int j = 0; j < page.ImageObjects.Count; j++ ) { ITrainingImageObject obj = page.ImageObjects[j]; string text = obj.RecognizedText; //  “”    if( text == "ISBN" ) { // “”   ITrainingField isbnTag = trainingBatch.Definition.Fields.AddNew( "ISBNTag", TrainingFieldTypeEnum.TFT_ReferenceText ); page.SetFieldBlock( isbnTag, obj.Region ); break; } } assert( trainingBatch.Definition.Fields.Count == 2 ); } //    trainingBatch.SubmitPageForTraining( page ); //      page = trainingBatch.PrepareNextPageNotSubmittedForTraining(); } //   .        CreateDocumentDefinitionFromAFL trainingBatch.Definition.ExportToAFL( rootFolder + "\\_TrainingBatch\\NewTemplate.afl" ); } finally { trainingBatch.Close(); }
      
      









結論として



開発者にとって興味深い、説明されている機能に加えて、次のものがあります。



•高度な画像処理ツール 。 その中でも、高度なノイズ低減と、ウェーブレットのような周波数領域で動作するカスタムフィルターです。 このフィルターを調整した後、写真の操作品質を大幅に向上させることができます(簡単にピンぼけ、ノイズ)。

単語および文字認識オプションにアクセスするためのAPI。 これにより、場合によっては、抽出されたデータのモデルがよく知られている場合、このモデルに最適なオプションをプログラムで選択し、出力の品質を向上させることができます。 たとえば、データベースに含まれるデータと有意義に比較したり、チェックサムを検討したりできます。

habr読者のコメントによると! Javaの適切なサポート -ディストリビューションには、オブジェクトとインターフェイスの構造を含むJAR(.Netから見たときにインターフェイスを繰り返す)、および呼び出しに必要なすべてのJNIアダプタを備えたdllが含まれます。 99%のケースでは、そのまま使用できます。 コールバックのサポートだけではありません。コールバックは、本当に必要な場合にユーザーが選択的に実装できます(方法を説明します)。

ABBYY FlexiCapture Engineの詳細については、ABBYY Webサイトをご覧ください



アレクセイ・カリュジニー・アレクセイ

FlexiCaptureエンジン開発チームリーダー



All Articles