1. はじめに
「毎月の経費精算でレシートの数字をひたすら入力するのが面倒...」
「紙の資料をデジタル化したいけど手作業は非効率...」
こんな悩みを解決するのがOCR(Optical Character Recognition)技術です。
本記事ではPythonを使い、AIでレシートの文字を自動認識するシステムをゼロから構築します。
実際に私がプロジェクトで導入したノウハウや、
「ここでハマった!」というトラブル事例も交えながら解説します。
2. OCR技術の基礎知識
OCRとは?
OCRは画像中の文字を検出・認識する技術で、以下のプロセスから構成されます:
- 前処理:画像の傾き補正、ノイズ除去
- 文字領域検出:テキストが存在する領域を特定
- 文字認識:検出した領域の文字を解読
主要ライブラリ比較
ライブラリ | 特徴 | 適したケース |
---|---|---|
Tesseract | オープンソース、多言語対応 | 汎用的なOCR |
EasyOCR | 深層学習ベース、簡単API | リアルタイム処理 |
AWS Textract | クラウドサービス、高精度 | 企業向けソリューション |
今回はEasyOCRを選択。その理由は:
- インストールが簡単(
pip install easyocr
) - 日本語対応済み
- デフォルトで高い精度
3. 実装してみよう
環境準備
!pip install easyocr opencv-python matplotlib
最小限のOCRコード
import easyocr
import cv2
from matplotlib import pyplot as plt
# リーダー初期化(日本語指定)
reader = easyocr.Reader(['ja'])
# 画像読み込み
image = cv2.imread('receipt.jpg')
# OCR実行
results = reader.readtext(image)
# 結果表示
for (bbox, text, prob) in results:
print(f'Text: {text}, Confidence: {prob:.2f}')
top_left = tuple(map(int, bbox[0]))
bottom_right = tuple(map(int, bbox[2]))
cv2.rectangle(image, top_left, bottom_right, (0, 255, 0), 2)
plt.imshow(cv2.cvtColor(image, cv2.COLOR_BGR2RGB))
plt.show()
実行例(レシート画像入力→出力)
Text: 領収書, Confidence: 0.98
Text: 2023年5月15日, Confidence: 0.95
Text: ¥12,800, Confidence: 0.93
4. 実践的なテクニックとトラブルシューティング
精度向上のための前処理
def preprocess_image(image_path):
image = cv2.imread(image_path)
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
denoised = cv2.fastNlMeansDenoising(gray, h=30)
_, thresholded = cv2.threshold(denoised, 0, 255,
cv2.THRESH_BINARY + cv2.THRESH_OTSU)
return thresholded
processed_image = preprocess_image('receipt.jpg')
よくあるエラーと解決策
問題1:縦書き文字を認識しない
→ reader = easyocr.Reader(['ja'], gpu=True)
でGPU加速を有効化
問題2:数字と日本語の混在が苦手
→ カスタム辞書を追加:
reader = easyocr.Reader(
['ja'],
recog_network='custom_model',
user_network_directory='./custom_net/'
)
5. 応用:クラウド連携システム構築
AWS Textractとの比較例
import boto3
def aws_textract_analyze(image_path):
client = boto3.client('textract')
with open(image_path, 'rb') as image:
response = client.detect_document_text(
Document={'Bytes': image.read()}
)
return [item['Text'] for item in response['Blocks'] if item['BlockType'] == 'LINE']
# コスト比較(1000ページあたり)
# EasyOCR: 無料(自前サーバー)
# Textract: $15〜(高精度モード)
実プロジェクトでのアーキテクチャ例
レシート画像 → S3バケット → Lambdaトリガー →
→ Textract処理 → DynamoDB保存 → 経費精算システム連携
6. まとめ
メリット
- 手作業の工数削減(90%時間短縮の実績)
- 既存システムと容易に連携可能
デメリット
- 特殊フォントや極端な傾きには弱い
- 個人情報取り扱いには注意が必要
今後の展望:
LLM(GPT-4等)と組み合わせ、
「¥12,800 → 経費カテゴリ『接待』自動分類」のような
さらに高度な処理が可能に!