質問
フィールドの文字をできるだけ正確に読み取りたい時の基本的にどうすればいいですか。
回答
FlexiCapture で FlexiLayout からエクスポートした定義を元に文字を読み取る時、絶対ではありませんが、ある程度、その通り設定すれば 認識精度 が上がりやすい、印刷の品質が多少変化しても精度になるべく影響を出さないようにする考え方があります。
以下では、それをご紹介します。
できるだけ正確に読み取りたい文字は、可能であれば*、その位置に FlexiLayout において Region Element: 区域 を割り当て、 Block に格納し、FlexiCapture に渡して読む
*読み取りたい場所が、特定の位置でない、要素間の相対関係で確実な位置を予想できない場合、FlexiLayout において Region Element: 区域 以外の 要素 を割り当て、 Block に格納し、FlexiCapture に渡して読むようにします。
何故か?:
FlexiLayout は一旦、画像の全体の文字や線などの印刷要素を読み取りはしますが、文字を読み取る事を目的としたアプリケーションではなく、あくまで、画像上の要素でかなり確実な印刷品質や法則があり、どのような品質の入力画像が入力されても 読み取れる可能性が高い要素同士を使って、その相対位置や関係性で FlexiCapture が読み取る位置を切り取って渡すアプリケーションだから です。
具体例:
下図の「カード番号」の下の赤枠で囲まれた コード のようなものを読み取りたいとします。
この時、Character String: 文字列 を使う設定は一つの設定方法ですが、下図のように、FlexiLayout の設定の時点で、文字種を限定してしまうのはお勧めできません。
何故か?:
FlexiLayout が各文字を読み間違えることがあるからです。
対して、人間が、容易に読み取りできるのは、想像力があるからです。
例えば、
数字の "1" は印刷の品質によっては、アルファベットの小文字の"l"(エル)、記号の "|" などと FlexiLayout が読み間違える可能性があります。
ですので、もし、この値が現れる位置が固定 か、相対位置で位置がはっきりしているなら、Region Element: 区域 で読み取る位置のみを指定し、
FlexiCapture に渡し、FlexiCapture 側で 文字限定を行う方が、読み取り精度があがる可能性が非常に高くなります。
FlexiCapture に読み取り位置を渡してから、文字を限定する。
詳しくはこちらのトピックをご覧ください
カスタムデータタイプの作成
https://help.abbyy.com/ja-jp/flexicapture/12/distributed_administrator/create_data_type
また、文字列 の 文字種と桁数、法則性 が分かっていれば、正規表現を設定します。
FlexiCaptureの正規表現については、こちらをご覧ください。
また、合わせて、こちらの記事もご覧ください。
FlexiCapture, FlexiLayout - 正規表現 - サンプル集
すると、FlexiCapture は設定された内容に当てはめようとして、FlexiLayout で切り取った場所を読み取りますので、数字の "1" をアルファベットの小文字の"l"(エル)、"0" (ゼロ) を"O"(オー) と読み間違えるような可能性を大幅に減らすことができます。
FlexiCapture、FlexiLayout それぞれの役割:
- FlexiLayout は、読み取り位置をどのような印刷品質、レイアウト変化があってもできるだけ確実に特定できるよう設定して、FlexiCaptureに渡す。
- FlexiCapture は FlexiLayout で切り取った位置の読み取り精度を高める設定を行う。
FlexiLayout の Static Text: 静的テキスト の キーワード にはできるだけ長い文字数の文字列を設定する
何故か?:
短い文字ほど、読み間違えが許されないからです。
例えば、「単位」というようなたった2文字の文字列は、なるべくなら キーワード にすべきではありません。
短い文字ほど、FlexiLayout での読み取り時には1文字も間違えられなくなります。
上図のような「単位」という2文字しかないと、「最大エラー割合」も100 (%) にするしかありません。
2文字なので、上図のような 30 (%) という間違いはあり得ませんし、
50 (%) (2文字中1文字は間違っても良い)と設定すると、今度は、「単」か「位」を持つ2文字なら他の文字もヒットしてしまいます。
例えば、下図のような「単価」という文字などです。
もちろん、「単価」というたった2文字の キーワード も、なるべくなら、使うべきではありません。
ではどうすれば良いのか?
Table: 表 や Repeating Group: 繰り返しグループ の 列 の位置などを指定するには、例えば上図のような表に 罫線 がある場合は、Separator: 区切り線 などを使って、列要素を囲った Region Element: 区域 要素 を Table: 表 の列 に 指定することで、より設定が堅牢になる可能性が高くなります。
また、表の列名 以外でも、キーワード を設定する場合には、文字列の内容 が不変で、画像上の位置を示す起点となるので、あれば、どのような文字列でも良いので、
下図のような文字列を使用しても問題ありません。
何故か?:
長い文字の方が、多少の読み間違いでも、適合しますし、他の異なる文字がヒットする可能性も低くなります。
文字数の長いキーワード方が安定した、起点となります。
例えば、下の図では、ベンダーの情報は、キーワードの上、表のサマリ、表はキーワードの下にある、ということが指定できるかと思います。
読み取りが難しそうな Table: 表 は Repeating group: 繰り返しグループ を用いる
対象の画像上の Table: 表 を見て、シンプル でない、複雑 だと感じた時、バリエーション が色々がありそうな場合、また、普通に Table: 表 を使用すると、読み取りが途中の行で止まったり、読み飛ばしたりしそうな場合(空行がある、印刷の品質が悪い、行内の文字が線にくっついている、など)、など簡単には定義ができそうにない場合、その表を確実に読み取りたい場合には、基本的には、Repeating Group: 繰り返しグループ を用いましょう。
何故か?:
Table: 表 はなるべく簡単に GUIの設定 だけで、表の位置を指定するために用意された要素で、Repeating Group: 繰り返しグループ の 簡易版 のようなものだから、です。
実際、Table: 表 で設定できる画像要素は全て Repeating Group: 繰り返しグループ でも設定することができます。ただ、Repeating Group: 繰り返しグループ は多種多様な設定が可能で、使用方法、動きも複雑です。ですので、Table: 表 があります。
しかし、逆に印刷品質さえ良ければ、明らかに一定の繰り返し要素がある印刷要素は、Table: 表 で設定できなくても Repeating Group: 繰り返しグループ で設定できる可能性が高くなります。
もし、設定が上手くいくかどうか分からない表が印刷されていましたら、Repeating Group: 繰り返しグループ の利用を検討してみましょう。
もし、Table: 表 でどうやっても設定できない場合、Repeating Group: 繰り返しグループ での設定のし直しをすることになり、2度手間になってしまう可能性もあります。
Table: 表 で設定できる印刷要素は Repeating Group: 繰り返しグループ でも定義できる。
それでは 表 は全て Repeating Group: 繰り返しグループ で読み取れば良いのではないか?というとそうではありません。
Table: 表 には次のようなメリットがあります。
- Repeating Group: 繰り返しグループ に比べ圧倒的に設定が簡単である。
- Table: 表の方が、より緻密に 行・列 を認識できる場合もある。
- ページ をまたぐ 表 を自動的に続けて読み取ることができる。
- ページ をまたぐ 表 の ヘッダ行 をある程度、自動的に読み飛ばすことができる。
- 表 の末尾の行が空行ばかりの場合、空業は自動的に無視して、内容がある行までで自動的に読み取りを止めてくれる。
- ...など。
コメント
0件のコメント
サインインしてコメントを残してください。