グループ要素検索の最適化
グループ要素(グループ)の要素連鎖のすべての仮説に品質値1がある場合、これらの要素の他の仮説は分析されません。
注意:これは、FlexiLayoutを最適化し、合致を迅速化し、仮説ツリーの不要な「枝わかれ」を回避するために行われます。ですが、プログラムに最適な仮説は必ずしも求められる画像のオブジェクトに対応するわけではありません。これは、要素の検索制限があまり厳しくない場合に発生する可能性があります。そのため、このような状況が発生した場合は、最初に要素検索のパラメータセットを分析します。
プロジェクトGO.fspを考察しましょう(フォルダ%public%\ABBYY\FlexiCapture\12.0\Samples\FLS\Tips and Tricks\GO\1)。ここではフィールド「請求書番号」を検索します。
プロジェクトには2ページあります:
- ページ1 – 画像の質が良い;
- ページ2 – 求められるフィールドの名前にノイズあり。
フィールド名を検索するための要素を含むグループInvoiceGroupを作成しました。これは静的テキスト種類の要素で、名前InvoiceHeaderが付き、値は「INVOICE」です。「請求書番号」フィールドを検索するために、種類文字列の名前InvoiceNumber付き要素を作成しました。要素InvoiceNumberの関係セクションの名前に関連する日付フィールド検索の検索制限を指定しました。
注意:セクションのテキストを検索名前の大文字小文字は関係ありません。
要素InvoiceHeaderの値として指定された文字列「請求書」は、画像で3回発生します: 「請求書番号」フィールドの名前として、名前「請求日」のサブ文字列として、また請求書の下部で支払条件「現在の請求書は…」のサブ文字列としてです。従って、合致後に3つの仮説があることを予測できます。
合致コマンドを選択して、FlexiLayoutの合致を実行した後、グループInvoiceGroupの仮説ツリーには予期していた3つの仮説ではなく、1つの連鎖があること、また完全な仮説の連鎖は検出しようとしている名前に対応しないことに気づきます。
生成された連鎖の各要素のプロパティを見ると、各仮説の連鎖の質は1で、最適化につながることがわかります。質の点で理想的な連鎖が検出されると(質1がある)、仮説の生成は止まります。
注意:グループの仮説木を表示するには、仮説ツリーでグループ要素の名前をダブルクリックするか、Enterを押すか、またはショートカットメニューから詳細を表示を選択します。
仮説生成の段階で、画像の1つのオブジェクトが他のオブジェクトよりも好ましいかは、アルゴリズムで判断されます。
FlexiLayoutの合致結果は満足されないものであるため、問題の原因を分析し、解決方法を決定する必要があります。
まず、要素InvoiceHeaderの検索領域を限定しませんでした。次に、要素InvoiceNumberを記述する際、数字列の長さを任意に指定しました(請求書番号の長さはわからないためです)。また、それがほぼ同じ横水準で、名前の右が検索されるよう指定しました。単語「請求書」のすべての3つのインスタンスがこれらの条件に合致することがわかります。名前の間違った検出がフィールド「請求書番号」の間違った検出に自動的につながったのは、このためです。制限を加えて、最終的に最高の仮説が得られ、FlexiLayoutが合致速度以外でも最適になるようにする必要があります。
フィールドの配置がプロジェクトのすべてのページで同じであると仮定すると、最も簡単な方法とは、ページの右端に最も近い要素「請求書」の文字列が必要である、と指示することです。従って、以下のコードを、要素InvoiceHeaderの高度な検索前関係セクションに書きます:Nearest:PageRight;.これができるのは、求められるフィールド「請求書番号」の名前がページの右端に最も近い唯一 の要素であるためです。そうでなかった場合や文書が形式化されていなかった場合、Nearest関数は問題の解決に役立ちませんでした。
半構造化文書がある場合など、このタスク実行の別の方法を示すために、GO.fspプロジェクトを作成しました(フォルダGO\2)。
画像の通り、数字列と単語「請求書」の間の距離は、求められるフィールド「請求書番号」で最小です。これはすべてのページで真であり、要素InvoiceNumberの高度な検索後関係セクションで以下のコードを入力することで、生成された仮説の品質値に影響を及ぼすことができます:
if (not InvoiceHeader.IsNull) and (not IsNull) then
{ FuzzyQuality: Rect.Left - InvoiceHeader.Rect.Right, {0, 0, 0, 10000}*dt; }
つまり、両方の要素が検出された場合、要素間の距離は要素InvoiceNumberの仮説に対して計算され、これが間隔{0, 0, 0, 10000}*dtに属するかが確認されます。間隔のこの記述は、仮説の質と要素間距離の線形依存性を示しており、距離が長いほど、ペナルティは大きくなります(関数FuzzyQualityは仮説の検索後品質を復元し、仮説のプロパティウィンドウで閲覧可能になります)。間隔(10000dt)の右境界の値は実験的に割り出されました。この値を選択する時、試験画像の対応するオブジェクト間の距離を考慮する必要があります。
下の図の通り、指定された間隔プロパティの下で、最大ペナルティ(1)は距離10000dtに対応します。従って、距離1000dtはペナルティ0.1、距離100dtはペナルティ0.01となっていきます。
約100-300ドットの実際の距離については、画像の通り、ペナルティ係数は0.99-0.97になります。
注意:これらの関数の使用の詳細は要素の検索にNearestおよびFuzzyQualityを使用をご覧ください。
このバッチの画像では、値「2005」の不要なフィールド「請求書番号」に対応する仮説に最大のペナルティが科せられている一方で、求められたフィールドに対応する仮説には最小のペナルティが科せられています。ペナルティですべての仮説の検索後品質が1でなくなったため、グループ要素InvoiceGroupの両要素のすべての仮説が分析されることになりました。
フィールド「請求書番号」がページ2でも正しく検出されていることに注意してください。ここでは、名前「請求書」に多くのノイズがあることで認識エラーが発生し、追加的なペナルティが仮説に科されます。
12.04.2024 18:16:07