ブラジルでは、病院で新生児ごとに(手で)記入された標準フォーム。このフォームは「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')
ところで、私はコンピュータービジョンについて手がかりがありません。グーグルに戻りましょう...