🔖

LLM APIでのOCRの精度を向上するためのPythonライブラリ 3選 + Tips

2025/03/12に公開

生成AIを活用することで、柔軟なフォーマットに対応可能なOCRを簡単に実装することが可能になりました。しかし、精度を担保するためにはデータの前処理を行うことが重要です。この記事では、生成AIを使って請求書のOCRをするための前処理についてご紹介します。

生成AIを使ったOCRのメリット

従来のOCRは、画像から文字を抽出する際に主に事前に定義されたアルゴリズムやルールベース、あるいは機械学習を用いて文字の形状パターンを認識します。しかし、「想定外のレイアウト」や「特殊なフォーマット」、「ノイズ」などに弱いという課題が一般的に存在していました。

一方、生成AIを応用したOCRは、画像の情報をより包括的に理解してテキストを抽出できる点が大きな特徴です。そのため、従来のOCRが苦手としていた「複雑なレイアウト」「手書き文字」「表や図表が混在した書類」など、多種多様なフォーマットに対しても高い柔軟性を持ち、誤字補正や解釈を含めた読み取りが可能です。

生成AIを使ったOCRの精度を向上するために

生成AIを使ったOCRは多様なフォーマットに対応できる一方で、従来のOCRと比較すると精度面での不安定なケースがあります。
ここで非常に重要になるのが、データの前処理です。
本記事では、Pythonのライブラリや機械学習のアプローチを用いたデータ処理の方法をご紹介します。

PythonのPillowライブラリを用いた画像のトリミング

生成AIに画像を渡す場合、極力関係のない情報を排除することで精度の向上が見込めます。
請求書など、ある程度フォーマットが決まっている文書であれば、PythonのPillowライブラリを使い、自動で画像をトリミングする処理を挟むことが可能です。
https://pypi.org/project/pillow/
また、トリミングした画像をそのままOCRさせるのではなく、生成AIを用いてトリミングした画像をマークダウンに変換させることで、精度の向上がみられました。

from PIL import Image

# 画像を開く
image = Image.open('invoice_sample.jpg')

# トリミングする領域を指定 (左, 上, 右, 下)
crop_area = (100,2400,1962,3100)

# トリミング実行
cropped_image = image.crop(crop_area)

# トリミングした画像を保存
cropped_image.save('invoice_sample_cropped.jpg')

# トリミング後の画像を表示 (任意)
cropped_image.show()

さらにトリミングした画像をマークダウンに変換すると、下記のように出力されます。数字も正しく変換できていることが確認できます。

| Description              | Units       | Rate (USD) | Amount (USD) |
|--------------------------|-------------|------------|--------------|
| Basic Service Charge     | 1 month     | 850        | 850          |
| Electricity Usage        | 320 kWh     | 25/kWh     | 8,000        |
| Fuel Adjustment Charge   | 320 kWh     | 1.5/kWh    | 480          |
| Renewable Energy Fee     | 320 kWh     | 2.2/kWh    | 704          |
| Environmental Fee        | Flat rate   | 150        | 150          |

PythonのOpenCVライブラリを用いた画像のコントラスト調整

OpenCVライブラリを用いて、画像のコントラストを調整することで読み取り易く加工をすることが可能です。
一つ一つ手動で補正をするのでは大変なため、画像の平均輝度や中央値などを目標値に近づけるように自動的に最適化することができます。たとえば「画像の平均輝度を128(0〜255の中間)に近づける」という方針でガンマを探すことが可能です。
読み取る画像の傾向などに合わせて、設定値を調整することで、読み取り精度を高めることにつながります。

import cv2
import numpy as np

# 画像を読み込む
image = cv2.imread('invoice_sample_dark.png')

# 輝度調整のためのパラメータ(正の値で明るく、負の値で暗くなります)
brightness = 70  # 例: +50明るくする

# 輝度を変更(各ピクセルに値を加算)
bright_image = cv2.convertScaleAbs(image, alpha=1.0, beta=brightness)

# 輝度変更後の画像を保存
cv2.imwrite('invoice_sample_bright.png', bright_image)

# 元画像と輝度変更後の画像を表示
cv2.imshow('Original Image', image)
cv2.imshow('Brightness Adjusted Image', bright_image)

cv2.waitKey(0)
cv2.destroyAllWindows()

Pythonのpytesseractライブラリを用いたオープンソースのOCRを組み合わせる

Pythonでは、pytesseractというオープンソースで利用できるOCRのライブラリが提供されています。このライブラリを使うことで、画像から文字情報をテキストで抽出することが可能です。
このテキスト情報を画像と一緒に生成AIに渡すことで、数字の間違い(小数点の桁数など)を減らすことにつながります。
手書きの文字などは読み取ることが難しいですが、無料で使えるため手軽に精度向上を試すことが可能です。

import pytesseract
from PIL import Image

# Windowsの場合のみ、Tesseractのインストールパスを指定(インストールパスを適切に修正してください)
# pytesseract.pytesseract.tesseract_cmd = r'C:\Program Files\Tesseract-OCR\tesseract.exe'

# 画像を読み込む
image = Image.open('invoice_sample.jpg')

# OCRを実行してテキストを取得(日本語の場合は lang='jpn'を追加)
text = pytesseract.image_to_string(image, lang='eng')

# 抽出したテキストを表示
print(text)

# テキストをファイルに保存(任意)
with open('invoice_sample_text.txt', 'w', encoding='utf-8') as f:
    f.write(text)

OCR結果のテキストファイル

—J+- AZU—yyayk 2025-03-07 13.42.53

Sample Invoice - Power Company

ABC Power Company
123 Energy Street, Tokyo, Japan
Phone: 03-1234-5678

nail sbcpower.co.jp

456 Residential Ave, Shibuya, Tokyo 150-0002

Account Number: 000123456789

Invoice Number: INV-20250307-00123

Billing Date: March 7, 2025 1 i i
Billing Period: February 1, 2025 — February 28, 2025

Usage Summary:

Description Units Rate (USD) Amount (USD) | \ iil |
Basic Service Charge 1 month 850 850. AAT |
Electricity Usage 320 kWh 25/kWh 8,000

Fuel Adjustment Charge 320 kWh 1.5/kKWh 480

Renewable Energy Fee 320 kWh 2.2/kKWh 704

Environmental Fee Flat rate 150 |) eo

Subtotal: $10,184
Consumption Tax (10%): $1,018
Total Amount Due: $11,202

OCRツールを組み合わせる(Azure vision AI)

前述のpytesseract ではうまく読み取れない場合は、既存のOCRサービスを活用することも可能です。
例えばAzure vision AIのOCRサービスでは、高精度で画像からテキストを読み取ってくれます。API経由でJSON形式でテキストが返ってきます。これで取得できるのはあくまでテキスト情報なので、表の情報など画像から得られる情報が落ちてしまいます。
これを生成AIが画像情報から保管した上で、正確なテキストデータと組み合わせて最終的な読み取りを行うことで、特定の情報を精度高く抽出することが可能になります。
Azure vision studioのExtract text from imagesを使った結果がこちら。

SampleInvoice-PowerCompany
ABCPowerCompany
123EnergyStreet,Tokyo,Japan
Phone:03-1234-5678
Email:billing@abcpower.co.jp
Invoiceto:
JohnDoe
456ResidentialAve,Shibuya,Tokyo150-0002
AccountNumber:000123456789
InvoiceNumber:INV-20250307-00123
BillingDate:March7,2025
BillingPeriod:February1,2025-February28,2025
UsageSummary:
Description
Unit
Rate(USD)
Amount(USD)
BasicServiceCharge
1month
850
850
ElectricityUsage
320kWh
25/kWh
8,000
FuelAdjustmentCharge
320kWh
1.5/kWh
480
+
RenewableEnergyFee
320kWh
2.2/kWh
704
EnvironmentalFee
Flatrate
150
150
Subtotal:$10,184
ConsumptionTax(10%):$1,018
TotalAmountDue:$11,202

まとめ 生成AIで手軽にOCRを業務フローに

ここまでみてきたように、データの前処理を行うことで、生成AIを活用して簡単に精度の高いOCRを実現することが可能です。
他にもPythonには強力なライブラリが様々存在します。Pythonやクラウドサービスそれぞれの強みを活かして、実務で使える生成AIの活用をしていきましょう。

Morphテックブログ

Discussion