4

ブラジルでは、病院で新生児ごとに(手で)記入された標準フォーム。このフォームは「DNV」と呼ばれます (ポルトガル語の「Born Alive Declaration」にちなんで)。「DO」と呼ばれる形もあります(ポルトガル語で「Decease Declaration」を意味します)。私の州では、病院がこれらのフォームを 100 万枚近く、私が勤務する機関に送り、そこで「人口動態統計」と呼ばれるデータベースを計算しています。その作業を自動化できないか調査中です。商用ICRソリューションは多額の費用がかかるため、担当者は誰もそれを内部で実行できるとは信じていないため、草の根プロジェクトです.

フォームの上部は次のようになります。 ここに画像の説明を入力

私はいくつかの病院から送られてきた 10 万件の PDF ファイルを手に入れ、単純なアルゴリズムを使用してそれらを 2 つのタイプ (DNV または DO) のいずれかに分類することができました。まず、ドキュメントのタイプを含む黒い四角形を見つけます (cv2.findContoursおよび少しヒューリスティック)、OCR を適用します ( pytesseract.image_to_string)。20k の「死亡宣言」(DO) と 80k の「生存宣言」を見つけました。

同様のアルゴリズムを使用して、黒い四角形の右側の数字を OCR し、55,000 フォームの画像を、これらのドキュメントに基づいてプロのタイピストが入力したデータベース内の対応するレコードにリンクすることができました。

ここで、数字を認識するための機械学習を少し試すために、日付フィールド (赤) を見つけたいと思います。フィールドは以下で強調表示されています。 ここに画像の説明を入力

最初に、これをテンプレートとして使用して「テンプレート マッチング」アルゴリズムを試しました。ここに画像の説明を入力

これはうまく機能しますが、テンプレートとフォームの画像が同じ縮尺と角度である場合に限られます。このcv2.matchTemplate方法は、スケールに非常に敏感です。SURF を使用して特徴マッチング アルゴリズムを試しましたが、機能させるのに苦労しています (やり過ぎのように感じます)。

左側の黒い長方形を見つけるのは簡単なので、数字を見つけるためにいくつかのオプションを考えています:

  • 黒い長方形を元にスケールと角度を正規化して試してみcv2.matchTemplateます。

  • 輪郭を見つけようとし、それを使用して単純化しcv2.approxPolyDP、数字の位置を推測します。

私の質問は次のとおりです。問題に対処する方法について何かアドバイスはありますか? 入力が解像度/角度に関して正規化されていない場合、このフォーム フィールドを見つけるために他のどのアルゴリズムを使用できますか?

[アップデート #1]

(x, y, w, h) を左側の黒い四角形の位置とサイズとして指定すると、妥当な確信を持って検索を絞り込むことができます。ここに画像の説明を入力

ランダムサンプルを試すと、この式は次のようになります。

img.crop((x+w, y+h/3, x+h*3.05, y+2*h/3))

ここに画像の説明を入力 ここに画像の説明を入力 ここに画像の説明を入力

[アップデート #2]

erodeとについて知ったばかりですdilateが、今では彼らは私の新しい親友です。

horizontal = edges.copy()
vertical = edges.copy()

kv = np.ones((25, 1), np.uint8)
kh = np.ones((1, 30), np.uint8)

horizontal = cv2.dilate(cv2.erode(horizontal, kh, iterations=2), kh, iterations=2)
vertical = cv2.dilate(cv2.erode(vertical, kv, iterations=2), kv, iterations=2)

grid = horizontal | vertical

plt.imshow(edges, 'gray')

ここに画像の説明を入力

plt.imshow(grid, 'gray')

ここに画像の説明を入力

ところで、私はコンピュータービジョンについて手がかりがありません。グーグルに戻りましょう...

4

1 に答える 1