私的AI研究会 > FormOCR

Form OCR Program

 文字認識エンジン「Tesseract」(テッセラクト)を使用した「OCR アプリケーション」開発のまとめ

※ 最終更新:2024/01/09 

帳票OCRプログラム「FormOCR」

 複数の帳票に対してあらかじめ設定した項目の領域を「AI技術を利用したOCR」により自動文字認識を行い結果を CSVファイルに出力する。

概 要

  1. 入力帳票
    ・帳票1枚につき1つの画像ファイルとする。ファイルはディレクトリごとに処理する。
    ・本版では帳票は「請求書」のみを対象とする。
    ・帳票のサイズは規定しないが、同一フォーマットの帳票に対しては縦横比率は同一とする。
    ・登録のない帳票に対しては新たにフォーマットを登録する。
    ・入力帳票は登録済みのフォーマットをアクセスの新しいものから順に一致を調べフォーマットが同一の帳票を使用して自動的に文字認識を行う。
    ・PDFファイルの場合は同梱のツールであらかじめ画像ファイルに変換する。
  2. 帳票全体のずれの補正
    (1) 画像の水平方向の傾きは 「ハフ変換 (Hough Transform)」にり自動的に補正する。
    ・あらかじめ同梱のツールを使用して補正を行う(デフォールト)設定になっているが、「帳票認識プログラム(formocr.py)」実行時に補正することもできる。
    (2)「OCR 帳票フォーマット編集プログラム(formocr_edit.py)」によるフォームの設定
  3. 各項目の領域に設定可能な前処理
  4. 帳票読み取り時の位置ずれ補正
    ・最初の項目(帳票名)の認識文字の座標から以後の項目の領域を補正する。
  5. 『文字認識エンジン』から得られる文字列の補正
    ・OCRからの認識結果には特有の誤認識文字が含まれていることがある。これらに対して正解値で修正することで全体としての認識率を上げる。 ・ユーザーにより正誤辞書ファイルの追加・変更でより実用的な精度になる。
    帳票名(KyeName)
    誤識別正解
    講求書請求書
    和求書請求書
    講求請求
    請求和書請求書
    ::

主なソースファイルと機能

※ コマンドラインから起動するプログラム

ファイルの場所ファイル名機能
~/workspace_py37/formocr/formocr.py ※あらかじめ登録されたフォーマットに従って帳票の自動処理を行い結果を CSV ファイルに出力
formocr_edit.py ※帳票フォーマットの登録と編集
「formocr.py」から呼び出し使用するが、コマンドラインから単独で起動することも可
prepros.py ※「formocr.py」の入力画像を整える
PDF ファイルからの画像抽出、縦横位置の回転、水平方向の傾き補正を行う
mylib_csv.pyCSVファイル操作
mylib_file.py汎用ファイル操作
mylib_frame.pyイメージフレームの座標操作
mylib_preprocess.pyOCR入力画像の前処理
mylib_pros.py画像処理
mylib_screen.py画面操作
mylib_text.py文字列処理
mylib_tilt.py水平傾き補正
mylib_yaml.pyYAMLファイル操作
~/workspace/lib/cvui.py「cvui」GUIライブラリ
EnhancedWindow.py
colortable80.pyテキスト背景色テーブル
myfunction.pyOpenCVで日本語テキストを描画
mylib.pyFPS速度計測
mylib_gui.pyGUIウインドウの状態を調べる
pngoverlay.pyOpenCVで透過PNGファイルの重ね合わせ

プログラムの初期化ファイル

ファイルの場所用途ファイル名
formocr/conf_init動作設定ファイルformocr.yaml
項目の正誤辞書ファイルdic_key.txt
dic_date.txt
dic_company.txt
dic_title.txt

動作確認のためのサンプル画像

ファイルの場所用途ファイル名ファイルサイズ(pixel)
formocr/_img_test/基本サンプルsample0.png1239 x 1754
縦横ずれ  x = -10, y=-10sample0_s0.png
      x = +10, y=+10sample0_s1.png
      x = -20, y=-20sample0_s2.png
      x = +20, y=+20sample0_s3.png
傾きのずれ 時計回りに 0.5°sample0_r-05.png
      時計回りに 1.0°sample0_r-10.png
      版時計回りに 1.0°sample0_r10.png
同じ配置の別データ 1test_sample001.png
          2test_sample002.png
          3test_sample003.png
同じ配置の解像度の異なるデータ 1sample1.png2479 x 3508
                2sample2.png4958 x 7016
formocr/_edit_test/項目の一部の場所が異なるデータ 2sample0a.png1238 x 1754
formocr/_pdf_test/3ページを持つPDFサンプルsample0a.pdf1238 x 1754

OCR の誤認識を修正する正誤辞書ファイル

ファイルの場所項目正誤辞書ファイル名
formocr/帳票名(KyeName)dic_key.txt
日付(Date)dic_date.txt
会社名(CompName)dic_company.txt
案件名(Title)dic_title.txt

プロジェクト関連ファイル

実行に必要な アプリケーション設定ファイル「formocr.yaml」

KeyDisp:
- 請求書
- 日  付
- 会社名
- 案件名
- 税抜金額
- 税込金額
KeyTable:
- KyeName
- Date
- CompName
- Title
- B4Tax
- TotalMoney
Template:                ← 登録したテンプレートのキーファイルをアプリが書く
- sample0.png

アプリケーションが作成する帳票設定ファイル「formocr_temp.yaml」

 

「FormOCR」プロジェクトのインストールと環境設定

プロジェクトパッケージのダウンロード

■ プロジェクト・パッケージ for Windows

■ プロジェクト・パッケージ for Linux

環境設定

 Form OCR Program 環境構築

サンプルデータを使って練習

・「Anaconda Powersell」を起動してプロジェクトのディレクトリ「formocr」に移動する。

 ※ 以下 Windows版の例

■ サンプルデータの水平傾き補正をする。

  1. コマンドラインからパラメータ付「python prepros.py -r 0」きで起動する。
  2. 表示されるダイアログで対象ディレクトリ「_img_test」を開いてから選択を押す。
    (py37w) PS > python prepros.py -r 0
    
    --- File preprocessing Program  Ver 0.01 ---
    
    File preprocessing Program  Ver 0.01: Starting application...
       - Rotate angle :  0
       - Log flag     :  y
       - Multi flag   :  y
    
     File list:  []
     Select list:  ['N:/anaconda_win/workspace_py37/formocr/_img_test\\sample0.png', 'N:/anaconda_win/workspace_py37/formocr/_img_test\\sample0_r-05.png', 'N:/anaconda_win/workspace_py37/formocr/_img_test\\sample0_r-10.png', 'N:/anaconda_win/workspace_py37/formocr/_img_test\\sample0_r10.png', 'N:/anaconda_win/workspace_py37/formocr/_img_test\\sample0_s0.png', 'N:/anaconda_win/workspace_py37/formocr/_img_test\\sample0_s1.png', 'N:/anaconda_win/workspace_py37/formocr/_img_test\\sample0_s2.png', 'N:/anaconda_win/workspace_py37/formocr/_img_test\\sample0_s3.png', 'N:/anaconda_win/workspace_py37/formocr/_img_test\\sample1.png', 'N:/anaconda_win/workspace_py37/formocr/_img_test\\sample2.png', 'N:/anaconda_win/workspace_py37/formocr/_img_test\\test_sample_001.png', 'N:/anaconda_win/workspace_py37/formocr/_img_test\\test_sample_002.png', 'N:/anaconda_win/workspace_py37/formocr/_img_test\\test_sample_003.png']
     >> image file preprocessing >> 13:29:03
     Image file: <<sample0.png>>
     Detection tilt angle:  0                  ← 水平の傾きは 0
     Image file: <<sample0_r-05.png>>
     count= 1, r= 212.00235847744713, degree= 0.2702611064941363
     Detection tilt angle:  0
     Image file: <<sample0_r-10.png>>
     count= 1, r= 200.02249873451737, degree= 0.8593722436446809
     count= 2, r= 122.01639234135715, degree= 0.9391909457355799
     count= 3, r= 336.05356715857073, degree= 1.0230301886678357
     count= 4, r= 67.00746227100382, degree= 0.8550973962667232
     count= 5, r= 42.01190307520001, degree= 1.3639275316029187
     count= 6, r= 41.012193308819754, degree= 1.3971810272963765
     count= 7, r= 74.00675644831355, degree= 0.7742201649280623
     New file:  sample0_r-10_tilt.png          ← 傾きを補正した新しいファイル
     Detection tilt angle:  1.0302884997345967
     Image file: <<sample0_r10.png>>
     count= 1, r= 65.00769185258002, degree= -0.8814039965821377
     count= 2, r= 227.01982292302142, degree= -0.757168865058535
     count= 3, r= 154.02921800749363, degree= -1.1160103914072725
     count= 4, r= 274.0456166407337, degree= -1.0454273910633103
     count= 5, r= 170.01176429882727, degree= -0.6740368979845053
     count= 6, r= 227.01982292302142, degree= -0.757168865058535
     count= 7, r= 118.01694793545543, degree= -0.9710219310791666
     count= 8, r= 114.00438588054409, degree= -0.5025816667210311
     count= 9, r= 76.00657866263946, degree= -0.7538483330707672
     New file:  sample0_r10_tilt.png          ← 傾きを補正した新しいファイル
     Detection tilt angle:  -0.8287409264472512
     Image file: <<sample0_s0.png>>
     Detection tilt angle:  0
     Image file: <<sample0_s1.png>>
     Detection tilt angle:  0
     Image file: <<sample0_s2.png>>
     Detection tilt angle:  0
     Image file: <<sample0_s3.png>>
     count= 1, r= 61.00819617067857, degree= -0.9391909457355799
     count= 2, r= 115.00434774390054, degree= -0.49821161261364194
     Detection tilt angle:  0
     Image file: <<sample1.png>>
     Detection tilt angle:  0
     Image file: <<sample2.png>>
     count= 1, r= 57.0087712549569, degree= 1.0050860052541812
     Detection tilt angle:  0
     Image file: <<test_sample_001.png>>
     count= 1, r= 115.00434774390054, degree= 0.49821161261364194
     Detection tilt angle:  0
     Image file: <<test_sample_002.png>>
     count= 1, r= 115.00434774390054, degree= 0.49821161261364194
     Detection tilt angle:  0
     Image file: <<test_sample_003.png>>
     count= 1, r= 56.00892785976178, degree= 1.0230301886678357
     Detection tilt angle:  0
    
     Finished.  13:29:06
    ・13ファイル中傾きの大きい2ファイルを補正してあたらしく「xxxx_tilt.xxx」ファイルができた。

■ サンプル帳票を自動識別処理する

  1. コマンドラインから起動する。「python formocr.py」
  2. 表示されるダイアログで対象ディレクトリ「_img_test」を開いてから選択を押す。
    (py37w) PS > python formocr.py
    
    --- FormOCR Program  Ver 0.01 ---
     OpenCV version 4.5.3
    
    FormOCR Program  Ver 0.01: Starting application...
       - Language     :  jpn
       - Layout       :  6
       - Log flag     :  n
       - Processed out:  formocr.csv
       - Multi flag   :  y
       - Tilt chk flag:  n
  3. 最初はフォームの登録がないので表示されるダイアログで「はい」を選択。
  4. サンプル帳票が表示されるので、最初の項目「請求書」の範囲をマウスでドラッグ指定する。
    ・「請求書項目」は上下左右のずれを補正するため文字の周囲の余白を大きめで囲む。
    ・指定領域が赤く表示され OCRに入力する画像と OCRの認識結果が表示される。
    ・正しい認識となるまで繰り返し操作することができる。
    ・画面下部の「Save」ボタンを押して領域を登録する。
    ・登録された領域は緑で認識結果の文字とともに表示される。
  5. 同様の操作で項目「日付」「会社名」「案件名」「税引き金額」「税込み金額」を順次登録していく。
  6. すべての項目の表示が緑になったことを確認してから「Quit」を押して編集を終了する。
  7. エラーとなった帳票から再度処理が開始される。
        :
     ** Run again !! **
     << sample0.png >>
     matching form: sample0.png *
     << sample0_r-05.png >>
     matching form: sample0.png
     << sample0_r-10_tilt.png >>
     matching form: sample0.png
     << sample0_r10_tilt.png >>
     matching form: sample0.png
     << sample0_s0.png >>
     matching form: sample0.png
     << sample0_s1.png >>
     matching form: sample0.png
     << sample0_s2.png >>
     matching form: sample0.png
     << sample0_s3.png >>
     matching form: sample0.png
     << sample1.png >>
     matching form: sample0.png
     << sample2.png >>
     matching form: sample0.png
     << test_sample_001.png >>
     matching form: sample0.png
     << test_sample_002.png >>
     matching form: sample0.png
     << test_sample_003.png >>
     matching form: sample0.png
    
     Finished.  13:35:23
    ・フォームがうまく登録されれば 13のサンプルファイルの処理が行われ認識結果が CSVファイル「formocr.csv」として作成される。

■ サンプル帳票のフォーム編集プログラム

  1. 前の処理でエラーとなったファイル(_img_test_err/ に移動)があればその原因調査や、登録フォームの確認・修正などに利用する。
  2. コマンドラインから起動する。「python formocr_edit.py」
    (py37w) PS > python formocr_edit.py
    
    --- FormOCR Template Edit Program Ver 0.02 ---
     OpenCV version 4.5.3
    
    FormOCR Template Edit Program Ver 0.02: Starting application...
       - Language     :  jpn
       - Layout       :  6
       - Log flag     :  y
       - Multi flag   :  y
    
    
     file: <N:/anaconda_win/workspace_py37/formocr/_img_test/sample0.png>
     Screen size: width x height = 2560 x 1440 (pixels)
    
     original h x w :  1754 x  1239
     display  h x w :  1196 x   845
     scale    h x w : 0.682 x 0.682
     -----------
     Check Form : < sample0.png >
     text ofset :  79 34
     form value :  79 34
     base scale : 1.000 x 1.000
     form Ofset :  0 0
     OCR text: 請 求 書  →  請求書
     OCR text: 2021 年 10 月 11 日  →  2021/10/11
     OCR text: エム ズ フ ァ ク トリ ー 株 式 会 社  →  エムズファクトリー株式会社
     OCR text: ノー ト PC 用 メモ リー  →  ノートPC用メモリー
     OCR text: ¥7,800|  →  7800
     OCR text: ¥8,580|  →  8580
    QWindowsWindow::setGeometry: Unable to set geometry 98x69+81+31 (frame: 114x108+73+0) on QWidgetWindow/"FormOCR Editter : sample0.pngWindow" on "\\.\DISPLAY1". Resulting geometry: 120x69+81+31 (frame: 136x108+73+0) margins: 8, 31, 8, 8 minimum size: 98x69 maximum size: 98x69 MINMAXINFO maxSize=0,0 maxpos=0,0 mintrack=114,108 maxtrack=114,108)
     - Saved all parameters !! -
     -----------
    
    
     Finished.
  3. 表示されるダイアログで対象ファイル「_img_test/sample0.png」を指定する。
    ・フォームの登録があるファイルの場合は登録内容と認識結果が緑で表示される。
    ・エラーとなったファイルを表示して、「Load」ボタンで設定フォームのファイルを読み出し認識できない項目を確認することができる。

     詳しくは 操作マニュアル を参照のこと。

    ・終了は「Quit」を押す。
 

「FormOCR」プロジェクトの操作マニュアル

 Form OCR Program 操作マニュアル

 

「FormOCR」プロジェクトの現状

実際の帳票でのての実行結果~

・ サンプル帳票数:119
・ 登録フォーム数: 36

今後の課題

 

「FormOCR」プログラムソースコード

▼「formocr.py」
▼「formocr_edit.py」
▼「prepros.py」
 

更新履歴

参考資料

 

Last-modified: 2024-01-10 (水) 13:18:57