業界・業務から探す
導入目的・課題から探す
データ・AIについて学ぶ
News
Hakkyについて
ウェビナーコラム
◆トップ【ビジネス】
AI

執筆者:Hakky AI

Python×OCR|領収書を80%効率化!自動データ化の全手順

tip
記事のポイント
  • PythonとOCRで領収書管理を自動化し、経費処理を効率化。Tesseract, EasyOCR等の活用法を解説。
  • OpenCVで画像の前処理を徹底し、Tesseract OCRでテキストを抽出し、正規表現でデータ整形。
  • FlaskでOCR APIを構築し、データベースと連携。領収書管理システムを構築し業務を効率化。

はじめに

この記事では、PythonとOCR(光学文字認識)技術を活用して、領収書管理を自動化する方法を解説します。日々の経費処理で発生する領収書の整理やデータ入力作業を効率化したい方に向けて、具体的な実装手順とAPI構築についてご紹介します。

PythonのOCRライブラリであるTesseractやEasyOCR、画像処理ライブラリのOpenCVなどを活用し、領収書からのテキスト抽出、データ整形、データベース連携までの一連の流れを、コード例を交えながら丁寧に解説していきます。

また、Flaskを用いたOCR APIの構築方法や、領収書管理システムの構築についても触れ、より実践的な知識とスキルを習得できる内容となっています。

【完全無料】Hakky HandbookメルマガでAIのトレンドを見逃さない | 詳細はこちら

領収書OCRの基礎知識とPythonライブラリ

このセクションでは、領収書OCRの基本概念とPythonで利用可能な主要ライブラリについて解説し、Tesseract、EasyOCR、OpenCVなどの特徴と用途を理解を深めます。

OCR技術の概要と領収書への応用

OCR(Optical Character Recognition)技術は、画像内の文字をデジタルテキストに変換する技術であり、領収書の自動処理において重要な役割を果たします。領収書OCRでは、スキャンされた領収書画像から文字情報を抽出し、データベースに記録したり、会計システムへ自動入力したりできます。

OCR技術は、レイアウト解析、文字認識、後処理というステップを経てテキストデータに変換されます。レイアウト解析では、画像内のテキスト領域を特定し、文字認識では、特定された領域内の文字を認識します。後処理では、認識されたテキストを整形し、必要な情報を抽出します。

領収書はフォーマットが統一されていない場合が多く、手書き文字や印字の乱れも含まれるため、OCRの精度が課題となります。精度を高めるためには、画像の前処理が重要です。具体的には、ノイズ除去、二値化、傾き補正などを行い、文字認識しやすい状態にします。

また、AI-OCRを活用することで、手書き文字や複雑なレイアウトにも対応できるようになります。OCR技術を領収書管理に応用することで、手作業による入力ミスを減らし、業務効率を大幅に向上させることができます。領収書データの活用により、経費分析や不正検知など、高度な分析も可能になります。

Python OCRライブラリの比較:Tesseract, EasyOCR, OpenCV

Pythonには、OCR処理に利用できる様々なライブラリが存在します。代表的なものとして、Tesseract、EasyOCR、OpenCVが挙げられます。

Tesseractは、Googleが開発したオープンソースのOCRエンジンであり、多言語に対応しています。特に印刷された文字の認識に強く、コマンドラインツールとしても利用可能です。

EasyOCRは、比較的新しいライブラリであり、深層学習ベースのOCRエンジンを使用しています。多言語対応に加え、GPUを利用することで高速な処理が可能です。

OpenCVは、画像処理ライブラリであり、OCRの前処理に利用されます。ノイズ除去、二値化、傾き補正などの処理を行うことで、OCRの精度を向上させることが可能です。

各ライブラリのメリット・デメリットを比較すると、Tesseractは、実績があり、安定した動作が期待できますが、手書き文字や複雑なレイアウトには弱いという欠点があります。EasyOCRは、手書き文字や複雑なレイアウトにも対応できますが、Tesseractに比べて処理速度が遅い場合があります。OpenCVは、OCRエンジンではありませんが、画像処理において強力な機能を提供します。

これらのライブラリを組み合わせることで、より高度なOCR処理を実現することができます。例えば、OpenCVで画像の前処理を行い、TesseractまたはEasyOCRで文字認識を行うといった実装が考えられます。ライブラリの選択は、対象とする領収書の品質やレイアウト、必要な精度、処理速度などを考慮して決定することが重要です。

領収書OCRにおける課題と対策

領収書OCRの実装においては、いくつかの課題が存在します。まず、領収書のレイアウトは企業や店舗によって異なり、統一されたフォーマットが存在しないことが挙げられます。また、手書きの領収書や印字が不鮮明な領収書も存在し、文字認識の精度を低下させる要因となります。さらに、領収書にはノイズや歪み、傾きなどが含まれている場合があり、OCR処理の妨げとなります。

これらの課題に対処するために、様々な対策を講じる必要があります。まず、画像の前処理を徹底することが重要です。OpenCVなどの画像処理ライブラリを利用して、ノイズ除去、二値化、傾き補正などの処理を行うことで、OCRの精度を向上させることができます

また、OCRエンジンのパラメータ調整も有効です。TesseractやEasyOCRなどのライブラリでは、様々なパラメータを設定することができ、領収書の特性に合わせて調整することで、認識精度を向上させることが可能です。

さらに、AI-OCRを活用することで、手書き文字や複雑なレイアウトにも対応できるようになります。AI-OCRは、大量の領収書データを学習することで、より高度な文字認識を実現します。

これらの対策を組み合わせることで、領収書OCRの精度を向上させ、業務効率を大幅に改善することができます。定期的な検証と改善を行いましょう

Pythonによる領収書OCRの実装手順

ここでは、Pythonで領収書OCRを実装する手順を解説します。画像の前処理からテキスト抽出、データ整形まで、具体的なコード例を交えながらステップごとに説明します。

画像の前処理:OpenCVによるノイズ除去と二値化

領収書OCRの精度を高めるためには、画像の前処理が不可欠です。ここでは、OpenCVを用いて領収書画像のノイズを除去し、二値化処理を行う方法を解説します。まず、画像をグレースケールに変換し、ノイズを除去するためにガウシアンフィルタを適用します。

次に、二値化処理を行い、テキスト領域を明確にします。以下に具体的な手順とコード例を示します。

  1. 画像のロード:OpenCVで画像を読み込みます。
import cv2
img = cv2.imread('receipt.png')
  1. グレースケール化:画像をグレースケールに変換します。
gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
  1. ノイズ除去:ガウシアンフィルタを適用してノイズを除去します。
blur_img = cv2.GaussianBlur(gray_img, (5, 5), 0)
  1. 二値化:テキストを強調するために二値化処理を行います。ここでは、大津の手法を使用します。
_, binary_img = cv2.threshold(blur_img, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)

これらの前処理を行うことで、OCRエンジンの認識精度が向上し、より正確なテキスト抽出が可能になります。特に、領収書のような背景が複雑な画像に対しては、ノイズ除去二値化が非常に有効です。

テキスト抽出:TesseractによるOCR実行と結果の検証

画像の前処理が完了したら、次はTesseract OCRを用いて領収書画像からテキストを抽出します。Tesseractは、様々な言語に対応したOCRエンジンであり、Pythonのpytesseractライブラリを通じて簡単に利用できます。以下に、テキスト抽出の手順と結果の検証方法を示します。

  1. pytesseractのインストール:まだインストールしていない場合は、以下のコマンドでインストールします。
pip install pytesseract
  1. Tesseract OCRのパス設定:Tesseractの実行可能ファイルのパスを設定します。
import pytesseract
from PIL import Image

pytesseract.pytesseract.tesseract_cmd = r'C:\Program Files\Tesseract-OCR\tesseract.exe'
  1. テキスト抽出の実行:前処理済みの画像からテキストを抽出します。
img = Image.open('binary_image.png')
text = pytesseract.image_to_string(img, lang='jpn')
print(text)
  1. 抽出結果の検証:抽出されたテキストを検証し、必要に応じてパラメータを調整します。例えば、--psmオプションでページ分割モードを指定できます。
config = '--psm 6'
text = pytesseract.image_to_string(img, lang='jpn', config=config)

抽出結果が不正確な場合は、画像の解像度を上げたり、コントラストを調整したりすることで、精度が向上する場合があります。また、Tesseractのパラメータ調整も有効です。

データ整形:正規表現による必要な情報の抽出

Tesseract OCRで抽出したテキストから、正規表現を用いて必要な情報(日付、金額など)を抽出します。領収書から特定の情報を効率的に抽出するために、正規表現は非常に強力なツールとなります。以下に、具体的な手順とコード例を示します。

  1. 必要な情報のパターン定義:日付や金額など、抽出したい情報の正規表現パターンを定義します。
import re

text = "領収書 2023年10月01日 1000円"
date_pattern = r'\d{4}年\d{1,2}月\d{1,2}日'
amount_pattern = r'\d+円'
  1. 正規表現による抽出:定義したパターンを用いて、テキストから情報を抽出します。
date = re.search(date_pattern, text).group()
amount = re.search(amount_pattern, text).group()
print(f'日付: {date}, 金額: {amount}')
  1. データ整形とクレンジング:抽出したデータを整形し、不要な文字や記号を削除します。例えば、金額から「円」を取り除くなどが考えられます。
amount = amount.replace('円', '')
print(f'金額(数値): {amount}')
  1. 抽出結果の利用:抽出した情報をデータベースに保存したり、APIで利用したりします。

正規表現を使用することで、柔軟かつ正確に領収書から必要な情報を抽出できます。また、データ整形を行うことで、抽出した情報をより扱いやすくすることができます。

OCR APIの構築とFlask連携

このセクションでは、OCR機能をAPI化し、Flaskと連携させる方法をステップごとに解説し、APIの設計から実装、デプロイまでを説明します。

FlaskによるAPIエンドポイントの作成

Flaskを使用してOCR処理を行うAPIエンドポイントを作成する手順を説明します。まず、Flaskと必要なライブラリ(pyocrPillowなど)をインストールします。

次に、Flaskアプリケーションを初期化し、OCR処理を行う関数を定義します。この関数は、クライアントから送信された画像データを受け取り、pyocrを使用してテキストを抽出します。抽出されたテキストはJSON形式でクライアントに返されます。

APIエンドポイントは、@app.routeデコレータを使用して定義され、HTTPメソッド(通常はPOST)を指定します。リクエストを処理し、レスポンスを作成するコード例を以下に示します。

from flask import Flask, request, jsonify
import pyocr
from PIL import Image

app = Flask(__name__)

@app.route('/ocr', methods='POST')
def ocr():
    if 'image' not in request.files:
        return jsonify({'error': 'No image provided'}), 400
    image = request.files'image'
    try:
        text = pyocr.get_text_from_image(Image.open(image))
        return jsonify({'text': text})
    except Exception as e:
        return jsonify({'error': str(e)}), 500

if __name__ == '__main__':
    app.run(debug=True, port=5000)

このコードでは、/ocrエンドポイントがPOSTリクエストを受け付け、リクエストに含まれる画像ファイルからテキストを抽出してJSON形式で返します。エラーが発生した場合は、エラーメッセージをJSON形式で返します。APIキーによる認証を追加することで、APIのセキュリティを強化できます。

APIのテストとデバッグ

APIの動作確認とデバッグは、開発プロセスにおいて非常に重要です。APIのテストには、Postmanのようなツールを使用すると便利です。Postmanを使用すると、APIエンドポイントにリクエストを送信し、レスポンスを確認できます。

まず、Postmanをインストールし、新しいリクエストを作成します。リクエストのHTTPメソッドをPOSTに設定し、APIのエンドポイントURLを入力します。

次に、リクエストのBodyタブで、form-dataを選択し、imageというキーで画像ファイルを追加します。リクエストを送信し、レスポンスを確認します。レスポンスがJSON形式で返され、抽出されたテキストが含まれていることを確認してください。

エラーが発生した場合は、レスポンスにエラーメッセージが含まれているはずです。デバッグ時には、Flaskのデバッグモードを有効にすると、エラーが発生した際に詳細な情報が表示されます。

また、ログを記録することで、APIの動作を追跡し、問題を特定するのに役立ちます。例えば、app.logger.error()を使用して、エラーメッセージをログに記録できます。

APIキー認証を実装している場合は、リクエストヘッダーにAPIキーを含めることを忘れないでください。APIのテストとデバッグを徹底することで、安定したAPIを構築できます。

APIのデプロイと運用

APIのデプロイと運用には、いくつかの選択肢があります。AWS LambdaやGoogle Cloud Functionsのようなサーバーレス環境を使用すると、インフラの管理 overheadを削減できます。

AWS Lambdaを使用する場合、まず、Lambda関数を作成し、FlaskアプリケーションをLambda関数として実行するように設定します。API Gatewayを使用して、Lambda関数にAPIエンドポイントを作成します。

Google Cloud Functionsを使用する場合も同様に、Cloud Functions関数を作成し、FlaskアプリケーションをCloud Functions関数として実行するように設定します。Cloud Functionsには、HTTPトリガーを使用してAPIエンドポイントを作成します。

サーバーレス環境を使用しない場合は、EC2やCompute Engineのような仮想マシンにAPIをデプロイすることもできます。この場合、GunicornやuWSGIのようなWSGIサーバーを使用して、Flaskアプリケーションを実行します。

NginxやApacheのようなリバースプロキシを使用して、クライアントからのリクエストをWSGIサーバーに転送します。APIの運用時には、ログの監視やパフォーマンスの監視が重要です。

CloudWatchやStackdriver Loggingのようなツールを使用して、ログを監視し、エラーが発生した際に通知を受け取ることができます。また、New RelicやDatadogのようなツールを使用して、APIのパフォーマンスを監視し、ボトルネックを特定することができます。

領収書管理自動化のためのデータベース連携

このセクションでは、抽出した領収書データをデータベースに保存し、管理を自動化する方法について解説します。SQLite、MySQL、PostgreSQLなどのデータベースとの連携方法を紹介し、効率的な領収書管理の実現を目指しましょう。

データベース設計:領収書データモデルの定義

領収書データを効率的に管理するためには、適切なデータベース設計が不可欠です。まず、領収書データモデルを定義し、必要なカラムとデータ型を決定します。例えば、領収書テーブルにはreceipt_id(文書識別番号)、date(日付)、issued_by(発行者名)、received_by(受領者名)、amount(金額)、currency(通貨コード)、payment_method(支払い方法)、details(項目詳細)などのカラムが考えられます。

detailsはJSON形式で商品名、数量、単価、合計金額を格納できます。また、支払い履歴テーブルや顧客情報テーブルを関連付けることで、より詳細な分析が可能になります。例えば、領収書テーブル(receipts)のidをPrimary Keyとし、支払い履歴テーブル(payment_history)のreceipt_idを外部キーとして関連付けます。顧客情報テーブル(customers)も同様に、idをPrimary Key、customer_nameを顧客名として設計します。

この構造により、領収書情報、支払い履歴、顧客情報を効率的に管理できます。具体的なJSON形式の例として、{"type": "receipt", "receipt_id": "R-20241123-001", "date": "2024-11-23", "issued_by": "ABC商店", "received_by": "山田 太郎", "amount": {"currency": "JPY", "value": 1500}, "payment_method": "現金", "details": {"item_name": "商品A", "quantity": 1, "price_per_unit": 1000, "total_price": 1000}, {"item_name": "商品B", "quantity": 1, "price_per_unit": 500, "total_price": 500}, "remarks": "ご利用ありがとうございました。"}のような形式でデータを格納できます。

Pythonによるデータベース操作:データの挿入、検索、更新

Pythonを使用してデータベースにデータを挿入、検索、更新する方法を解説します。SQLAlchemyのようなORMライブラリを利用することで、データベース操作をより簡単に行えます。例えば、SQLAlchemyを使用すると、以下のようなコードでデータの挿入が可能です。

from sqlalchemy import create_engine, Column, Integer, String, DateTime, ForeignKey
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker, relationship

engine = create_engine('sqlite:///receipts.db')
Session = sessionmaker(bind=engine)
session = Session()

Base = declarative_base()

class Receipt(Base):
    __tablename__ = 'receipts'
    id = Column(Integer, primary_key=True)
    date = Column(DateTime)
    issued_by = Column(String)
    received_by = Column(String)
    amount = Column(Integer)
    details = relationship("Detail", backref="receipt")

class Detail(Base):
    __tablename__ = 'details'
    id = Column(Integer, primary_key=True)
    item_name = Column(String)
    quantity = Column(Integer)
    price_per_unit = Column(Integer)
    total_price = Column(Integer)
    receipt_id = Column(Integer, ForeignKey('receipts.id'))

new_receipt = Receipt(
    date="2024-11-23",
    issued_by="ABC商店",
    received_by="山田 太郎",
    amount=1500
)
new_detail1 = Detail(
    item_name="商品A",
    quantity=1,
    price_per_unit=1000,
    total_price=1000,
    receipt=new_receipt
)
new_detail2 = Detail(
    item_name="商品B",
    quantity=1,
    price_per_unit=500,
    total_price=500,
    receipt=new_receipt
)

session.add(new_receipt)
session.add(new_detail1)
session.add(new_detail2)
session.commit()

同様に、検索や更新もSQLAlchemyを用いて簡単に行えます。これにより、データベース操作の効率が向上し、領収書管理システムの開発がスムーズに進みます。

領収書管理システムの構築

OCR APIとデータベースを連携させ、領収書管理システムを構築する方法について解説します。まず、Flaskなどのフレームワークを用いてWebインターフェースを作成します。ユーザーが領収書画像をアップロードできるインターフェースを設け、アップロードされた画像をOCR APIに送信し、テキストデータを抽出します。

抽出されたデータは、データベースに保存され、Webインターフェース上で検索、表示、編集が可能です。例えば、領収書APIのレスポンス形式には、doc_type(文書の種類)、receipt_id(文書識別番号)、date(日付)、issued_by(発行者名)、received_by(受領者名)、amount(金額)、currency(通貨コード)、payment_method(支払い方法)、details(項目詳細)などのデータを含めることができます。

また、エラーハンドリングにはHTTPステータスコードを使用し、エラーを適切に伝えます(例:404 Not Found)。株式会社フレッシュ青果はLINE WORKS OCR APIを使用して伝票処理の効率を80%向上させました。また、江部松商事株式会社はAI-OCRを使用して販売管理システムの注文書入力を自動化し、データ統合率と処理効率を向上させました。これらの事例を参考に、自社のニーズに合わせた領収書管理システムを構築しましょう。

領収書OCRの精度向上とトラブルシューティング

ここでは、OCRの精度を向上させるための画像処理テクニックと、OCR処理でよくあるトラブルに対する解決策を詳しく解説します。エラー処理とログ出力の重要性についても説明します。

画像品質の改善:解像度、コントラスト、歪み補正

OCRの精度は、入力画像の品質に大きく左右されます。特に、解像度、コントラスト、歪みは重要な要素です。解像度が低いと文字がぼやけて認識が難しくなり、コントラストが低いと文字と背景の区別がつきにくくなります。

また、歪みがあると文字の形状が変わり、誤認識の原因となります。これらの問題を解決するために、OpenCVなどの画像処理ライブラリを活用しましょう。まず、解像度を調整します。スキャナーや画像処理ソフトウェアを使用し、解像度を300dpi以上に設定すると、文字の認識精度が向上します。

次に、コントラストの調整です。背景と文字色が似ている場合は、コントラストを調整することで認識精度を改善できます。OpenCVのcv2.convertScaleAbs()関数を使用すると、画像のコントラストを調整できます。

歪み補正も重要です。領収書が斜めにスキャンされた場合や、カメラで撮影した場合は、歪みが生じることがあります。OpenCVのcv2.getPerspectiveTransform()関数とcv2.warpPerspective()関数を使用すると、画像の歪みを補正できます。

これらの前処理を行うことで、OCRエンジンの認識精度を大幅に向上させることが可能です。

OCRエンジンの設定:パラメータ調整と学習

OCRエンジンの性能を最大限に引き出すためには、適切なパラメータ調整が不可欠です。特にTesseract OCRを使用する場合、パラメータ設定を調整することで、認識精度を大幅に向上させることができます。

例えば、言語設定は非常に重要です。日本語の領収書を処理する場合は、言語パラメータを「jpn」に設定する必要があります。Pytesseractでは、pytesseract.image_to_string(image, lang='jpn')のように指定します。

また、Tesseractには様々な設定オプションがあり、--psm(Page Segmentation Mode)や--oem(OCR Engine Mode)などを調整することで、特定の種類の画像に対して最適な結果を得ることができます。例えば、--psm 6は「Assume a single uniform block of text」を意味し、--oem 3は「Tesseract 4.0/4.1 neural net LSTM engine」を使用します。

さらに、カスタム学習を行うことで、特定のフォーマットの領収書に対する認識精度を向上させることができます。Tesseractは、カスタムフォントや特定のレイアウトに対応するために、追加の学習データでトレーニングすることが可能です。カスタム学習には、トレーニング画像と対応するテキストデータが必要になります。

よくあるトラブルと解決策

OCR処理では、様々なトラブルが発生することがあります。ここでは、よくあるトラブルとその解決策について解説します。

まず、文字認識エラーは最も一般的な問題です。原因としては、画像の品質が低い、フォントが特殊である、ノイズが多いなどが考えられます。解決策としては、まず画像の解像度を上げたり、ノイズ除去フィルタを適用したりすることが有効です。また、Tesseract OCRのパラメータを調整することで、認識精度が向上する場合があります。

次に、レイアウト崩れもよくある問題です。特に、表形式の領収書を処理する場合、OCRエンジンが正しくレイアウトを認識できないことがあります。解決策としては、画像の前処理で罫線を強調したり、Tesseract OCRのページセグメンテーションモードを調整したりすることが考えられます。

また、文字コードの問題も発生することがあります。OCRエンジンが認識した文字が、正しい文字コードで出力されない場合、文字化けが発生します。解決策としては、OCRエンジンの出力文字コードを確認し、必要に応じて変換処理を行うことが必要です。

これらのトラブルシューティングを行うことで、OCR処理の安定性と精度を向上させることができます。

おわりに

領収書のOCR処理と自動化について、この記事ではPythonを使った具体的な方法を解説しました。しかし、実際にシステムを構築し、業務に適用するには多くの課題があります。

もし、機械学習を活用したプロダクト開発でお困りでしたら、Hakkyにお気軽にご相談ください。お客様の課題に合わせた最適なソリューションをご提案いたします。

tip
お知らせ

領収書のOCR処理でお困りではありませんか? Hakkyでは、Pythonを活用した領収書管理自動化システム構築をご支援します。


関連記事

参考文献

2025年06月12日に最終更新
読み込み中...