見出し画像

ChatGPTでつくった文字画像を抽出するプログラムで請求書を読み込んでみた

以前、ChatGPTに画像ファイルの文字を抽出するプログラムを作ってもらいましたが、今回は請求書を読み込んでいき、python(pytesseract.image_to_string)で、文字抽出する際の設定値(psm、oem)を微調整しながら文字の抽出精度を検証していこうと思います。


以前、ChatGPTに画像ファイルの文字を抽出するプログラムを作ってもらった記事

pytesseract.image_to_stringに設定するpsmと、oemについて

まずは、pytesseract.image_to_stringに設定するpsmと、oemについてChatGTPに聞き、仕様をおさらいします。

プロンプト

pytesseract.image_to_stringに設定するpsmと、oemについて教えてください

ChatGPTの回答

pytesseract は、Tesseract OCRエンジンをPythonから利用するためのラッパーです。Tesseract OCRエンジンには、ページ分割モード(PSM)とOCRエンジンモード(OEM)の2つの主要な設定があります。これらの設定は、画像の解析方法やOCRの精度に大きな影響を与えるため、適切に設定することが重要です。

PSM (Page Segmentation Mode)

PSMは、Tesseractが画像内のテキストをどのようにセグメントするかを制御します。以下のように、様々なモードがあります:
0 - Orientation and script detection (OSD) only.
1 - Automatic page segmentation with OSD.
2 - Automatic page segmentation, but no OSD, or OCR.
3 - Fully automatic page segmentation, but no OSD. (Default)
4 - Assume a single column of text of variable sizes.
5 - Assume a single uniform block of vertically aligned text.
6 - Assume a single uniform block of text.
7 - Treat the image as a single text line.
8 - Treat the image as a single word.
9 - Treat the image as a single word in a circle.
10 - Treat the image as a single character.
11 - Sparse text. Find as much text as possible in no particular order.
12 - Sparse text with OSD.
13 - Raw line. Treat the image as a single text line, bypassing hacks that are Tesseract-specific.


OEM (OCR Engine Mode)

OEMは、Tesseractが使用するOCRエンジンのモードを設定します。以下の4つのモードがあります:
0 - Legacy engine only.
1 - Neural nets LSTM engine only.
2 - Legacy + LSTM engines.
3 - Default, based on what is available.


設定方法

pytesseract.image_to_string関数にconfigパラメータを追加してPSMとOEMを設定できます。例えば、次のように設定します:

import pytesseract
from PIL import Image

# 画像の読み込み
image = Image.open('your_image.png')

# PSMとOEMを設定してテキストを抽出
custom_config = r'--oem 3 --psm 6'
text = pytesseract.image_to_string(image, config=custom_config)

print(text)

この例では、--oem 3 でデフォルトエンジンを使用し、--psm 6 で単一の均一なブロックのテキストとして解析しています。画像の特性や用途に応じて、これらの設定を調整することが推奨されます。

psmの各種モードについて日本語でも補足してもらいました

以下に、PSM (Page Segmentation Mode) の各モードについて日本語での補足を記載します。
0 - Orientation and script detection (OSD) only
向きとスクリプトの検出のみを行います。
1 - Automatic page segmentation with OSD
向きとスクリプトの検出を伴う自動ページ分割を行います。
2 - Automatic page segmentation, but no OSD, or OCR
向きとスクリプトの検出やOCRを行わず、自動ページ分割のみを行います。
3 - Fully automatic page segmentation, but no OSD (Default)
向きとスクリプトの検出を行わない完全な自動ページ分割を行います(デフォルト設定)。
4 - Assume a single column of text of variable sizes
サイズが変動する単一のテキストカラム(列)を前提とします。
5 - Assume a single uniform block of vertically aligned text
垂直に整列した単一の均一なテキストブロックを前提とします。
6 - Assume a single uniform block of text
単一の均一なテキストブロックを前提とします。
7 - Treat the image as a single text line
画像を単一のテキスト行として扱います。
8 - Treat the image as a single word
画像を単一の単語として扱います。
9 - Treat the image as a single word in a circle
画像を円の中の単一の単語として扱います。
10 - Treat the image as a single character
画像を単一の文字として扱います。
11 - Sparse text. Find as much text as possible in no particular order
まばらなテキスト。特定の順序に従わずに可能な限り多くのテキストを検出します。
12 - Sparse text with OSD
まばらなテキストと向き・スクリプトの検出を行います。
13 - Raw line. Treat the image as a single text line, bypassing hacks that are Tesseract-specific
生の行。Tesseract固有のハックをバイパスして、画像を単一のテキスト行として扱います。

これらの設定を使い分けることで、画像の特性や解析の目的に応じて適切なOCR処理を行うことができます。

文字の形態によって、psmのモードを適宜切り替えていく

画像ファイルに記載された文字の形態によって、psmのモードを切り替えていくと、精度が高く読み取れるとのことですが、どのモードが適しているかをpsmのパラメータを変えながら検証していきたいと思います。

請求書の読み込み検証

読み取り対象ファイル

フリーの請求書フォーマットがありましたので、こちらを使用させて頂き、今回はこちらを読み込みながら検証していきたいと思います。

検証について

psmを切り替え、oem:3固定で検証してみました。

psm:3(向きとスクリプトの検出を行わない完全な自動ページ分割。デフォルト設定)、oem:3 での検証結果

請 求 書

サンプル株式会社 御中 No 1001

請求日 2022/4/30

下記のとおり、御請求申し上げます。 サンプル株式会社
件名 サンプルプロジェクト 〒100-000
支払期限 02747| 東京都千代田区千代田1-1-1
あん サンプル銀行 本店 普通 1111111 サンプルビル3階
サンプル (カ TEL : 03-0000-0000

担当: サンプル太郎
 154,000 円 (税込)

摘要 EE 単位 Ei 金額
サンプル1 1|10,000 10,000
サンプル2 1| 式 10,000 10,000
サンプル3 1|10,000 10,000
サンプル4 1| 式 10,000 10,000
サンプル5 1|10,000 10,000
サンプル6 1| 式 10,000 10,000
サンプル7 1|10,000 10,000
サンプル8 1| 式 10,000 10,000
サンプル9 1|10,000 10,000
キモトレーアロ1 1イ ード 4n nn 4n nn

psm:4(サイズが変動する単一のテキストカラムを前提)、oem:3 での検証結果

請 求 書

サンプル株式会社 御中 No 1001

請求日 2022/4/30

下記のとおり、御請求申し上げます。 サンプル株式会社
件名 サンプルプロジェクト 〒100-000
支払期限 02747| 東京都千代田区千代田1-1-1
あん サンプル銀行 本店 普通 1111111 サンプルビル3階
サンプル (カ TEL : 03-0000-0000

担当: サンプル太郎
 154,000 円 (税込)

摘要 EE 単位 単価 金額

サンプル1 1|10,000 10,000
サンプル2 1| 式 10,000 10,000
サンプル3 1|10,000 10,000
サンプル4 1| 式 10,000 10,000
サンプル5 1|10,000 10,000
サンプル6 1| 式 10,000 10,000
サンプル7 1|10,000 10,000
サンプル8 1| 式 10,000 10,000
サンプル9 1|10,000 10,000 

ユエキュレーア1 ィ ード ィ4n nn 44n nnn

psm:6(単一の均一なテキストブロックを前提)、oem:3 での検証結果

請 求 書

サンプル株式会社 御中 _ リー

請求日 2022/4/30
下記のとおり、御請求申し上げます。 サンプル株式会社

Ia サンプルプロジェクト 〒100-0001
支払期限 AM747人| 東京都千代田区千代田1-1-1
あん サンプル銀行 本店 普通 1111111 サンプルビル3階
サンプル (カ TEL : 03-0000-0000
担当: サンプル太郎
合計 154,000 円 (税込)

サンプル1 1|10,000 10,000
サンプル2 1| 式 10,000 10,000
サンプル3 1|10,000 10,000
サンプル4 1| 式 10,000 10,000
サンプル5 1|10,000 10,000
サンプル6 1| 式 10,000 10,000
サンプル7 1|10,000 10,000
サンプル8 1| 式 10,000 10,000
サンプル9 1|10,000 10,000
キモトレーアロ1 1イ ード 4n nn 4n nn

psm:8(画像を単一の単語として扱う)、oem:3 での検証結果

をニ

psm:9(画像を円の中の単一の単語として扱う)、oem:3 での検証結果

ーー

psm:11(まばらなテキスト。特定の順序に従わずに可能な限り多くのテキストを検出)、oem:3 での検証結果

=圭

ロ月

求

書

細

サンプル株式会社 御中

No

1001

請求日

2022/4/30

下記のとおり、

請求申し上げます。

サンプル株式会社

ii

サンプルプロジェクト

〒100-000

支払期限

2022/5/31

東京都千代

区千代田1-1-1

があか

サンプル銀行 本店 普通 1111111

サンプルビル3階

サンプル (カ

TEL : 03-0000-0000

担当: サンプル太郎

154,000 円 (税込)

サンプル1

1

品

式

10,000

10,000

サンプル2

式

10,000

10,000

サンプル3

式

10,000

10,000

サンプル4

式

10,000

10,000

サンプル5

式

10,000

10,000

サンプル6

式

10,000

10,000

サンプル7

式

10,000

10,000

サンプル8

式

10,000

10,000

サンプル9

式

10,000

10,000

キモトレーアロ1

ード

ィ4n nn

4ィ4n nnn

psm:12(まばらなテキストと向き・スクリプトの検出)、oem:3 での検証結果

=圭

ロ月

求

中

サンプル株式会社 御中

No

1001

還

吸

求日

2022/4/30

下記のとおり、

請求申し上げます。

サンプル株式会社

ii

サンプルプロジェクト

〒100-000

支払期限

2022/5/31

東京都千代

区千代田1-1-1

があか

サンプル銀行 本店 普通 1111111

サンプルビル3階

サンプル (カ

TEL : 03-0000-0000

担当: サンプル太郎

154,000 円 (税込)

間

摘要

和

3

上

各

単価

金額

サンプル1

10,000

10,000

サンプル2

10,000

10,000

サンプル3

10,000

10,000

サンプル4

10,000

10,000

サンプル5

10,000

10,000

サンプル6

10,000

10,000

サンプル7

10,000

10,000

サンプル8

光叶|員|音員|則|10,000

10,000

サンプル9

10,000

10,000

キモトレーアロ1

mmニコニコニロロロロロロロリロニリロ

見

ィ4n nn

44n nnn

psm:13(生の行。Tesseract固有のハックをバイパスして、画像を単一のテキスト行として扱う)、oem:3 での検証結果

をニ

まとめ

今回の画像だと、psm:4が一番精度が良く、取り込めました。
ただ完璧に読み込めたわけではなく、背景色が黒色で、白文字の箇所や、日付箇所などの一部が、うまく読み取れない状態でした。
以前検証した画像ファイルでは、psm:6が精度良く取り込めましたが、今回は背景色が黒色で、白文字の箇所が読み取れませんでした。

おわりに

最後まで読んでいただきありがとうございます!

画像に記載された文字の形状によって、psmは適宜変えていくことで、一定精度が上がりそうですが、ものによってはうまく読めない場合もあり、そのような場合は、事前に画像加工をして文字を読みやすくしたり、学習データを追加していくなどの必要がありそうで、なかなか先は長そうな感じがしています、、

ただ完璧には取り込めなくても、大部分取り込むことができれば、人力での手作業は軽減できるかと思いますので、今後もカスタマイズしていこうかと思います!

おまけ

最近、ChatGPTを使用し、色々なことを模索しています。
もしよければ、以下の記事も見て頂けると嬉しいです!



この記事が気に入ったらサポートをしてみませんか?