2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

猿でもわかるAIプログラミングシリーズ 🐵💻 AIでレシートの文字を読み取ってみた!(OCR入門)

Posted at

1. はじめに

「毎月の経費精算でレシートの数字をひたすら入力するのが面倒...」
「紙の資料をデジタル化したいけど手作業は非効率...」

こんな悩みを解決するのがOCR(Optical Character Recognition)技術です。
本記事ではPythonを使い、AIでレシートの文字を自動認識するシステムをゼロから構築します。

実際に私がプロジェクトで導入したノウハウや、
「ここでハマった!」というトラブル事例も交えながら解説します。

2. OCR技術の基礎知識

OCRとは?

OCRは画像中の文字を検出・認識する技術で、以下のプロセスから構成されます:

  1. 前処理:画像の傾き補正、ノイズ除去
  2. 文字領域検出:テキストが存在する領域を特定
  3. 文字認識:検出した領域の文字を解読

主要ライブラリ比較

ライブラリ 特徴 適したケース
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 → 経費カテゴリ『接待』自動分類」のような
さらに高度な処理が可能に!


「実際に試してみたい!」という方は、
こちらのGoogle Colabサンプルをご利用ください:
Open In Colab

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?