AIベースのOCRとは?
AI駆動のOCRは、従来型のOCRよりも進化しており、人工知能を活用して文脈を理解し、さまざまなレイアウトに対応し、複雑なドキュメントから高品質な構造化データ抽出を実現します。従来のOCRは固定フォーマットのテキスト認識しかできませんが、AI OCRは請求書やビジネス文書に多い多様なレイアウトや構成にも柔軟に対応できます。
AIベースOCRの主な特徴
- 文脈理解: AI OCRはNLPを用いてドキュメントの文脈を理解。「合計金額」「請求日」「顧客名」など、項目が異なる場所にあっても正確に識別します。
- 柔軟性: 従来のOCRは不規則なレイアウトでエラーが出やすいですが、AI OCRは様々な請求書フォーマットから情報抽出が可能です。
- データ構造化: 多くの場合、AI OCRは従来のOCRの生テキスト出力よりも、そのまま後処理しやすい構造化データを直接提供します。
請求書処理にAI OCRを使う理由
請求書は経理・物流・購買などで正確かつ効率的に処理する必要があります。AI OCRはデータ抽出の自動化とワークフローの効率化を実現し、データ精度も向上します。
請求書向けAI OCRのメリット
- スピードと効率: AI OCRなら大量の請求書も短時間で処理可能。リソースや人手の削減に寄与します。
- 精度向上: 多様なドキュメントでトレーニングされたAIモデルにより、手入力時のミスを大幅に軽減します。
- データ管理の容易さ: データが構造化されているため、データベースや分析システム、ERPなどにも簡単に統合できます。
- スケーラビリティ: AI OCRは人手を増やさず大量ドキュメント処理が可能。大企業や急成長企業にも最適です。
FlowHuntのAI OCRツール利用によるROI
多くの企業は従来、従業員が手作業で請求書データを抽出していました。これは非常に時間とコストがかかる作業であり、税務・法務・金融など幅広い分野・企業で自動化の余地があります。
このプロセスは5〜15秒程度で完了し、0.01〜0.02クレジットのコストで済みます。従業員が同じ作業を行う場合、時給15〜30ドルが必要です。

| 処理者 | 年間コスト | 年間処理枚数 | 1枚あたりコスト |
|---|---|---|---|
| 人手 | $30,000 | 12,000 | $2.50 |
| FlowHunt | $162 | 12,000 | $0.013 |
| FlowHunt($30,000時) | $30,000 | 2,250,000 | $0.0133 |
FlowHuntの方が圧倒的に効率的だと言えるでしょう。
OCR導入時の課題
OCRは非常に有用ですが、いくつかの課題も存在します。
- 画像品質: OCRの精度は画像品質に大きく依存します。ぼやけた画像や低解像度画像では結果が悪化します。
- 複雑なフォーマット: 複雑なレイアウトや混在フォント、テーブル等は高度なOCR処理が必要です。
- 言語・文字セット: OCRソフトは言語対応が限定的な場合があり、非ラテン文字では専用モデルが必要です。
- エラー率: 100%正確なOCRは存在せず、とくに手書きや不規則フォントではエラーが生じやすいです。
これらの課題に対応するには、高性能かつ柔軟なOCRツールが必須です。FlowHuntのAPIは複雑なドキュメント構造にも対応できる堅牢なOCRソリューションであり、大規模OCRプロジェクトにも最適です。
Python OCRスクリプトのセットアップ
自動化には以下のPythonライブラリをインストールしてください。
pip install requests pdf2image git+https://github.com/QualityUnit/flowhunt-python-sdk.git
これにより以下が導入されます:
- requests: FlowHunt APIへのHTTPリクエスト送信とOCR出力のダウンロード用。
- pdf2image: PDFページを画像に変換。
- flowhunt: FlowHuntのPython SDKで、OCR APIとのやり取りを簡単にします。
コードのステップバイステップ解説
このコードはPDFを画像に変換し、各画像をFlowHuntへ送信してOCR処理し、出力をCSV形式で保存します。
ライブラリのインポート
import json
import os
import re
import time
import requests
import flowhunt
from flowhunt.rest import ApiException
from pprint import pprint
from pdf2image import convert_from_path
json,os,re,timeはJSON処理、ファイル管理、正規表現、タイマー制御用。requests: HTTPリクエストやOCR結果のダウンロード用。flowhunt: FlowHunt SDK。認証やOCR API通信を担当。pdf2image: PDFページを画像に変換、各ページごとにOCR可能。
PDFページを画像に変換する関数
def convert_pdf_to_image(path: str) -> None:
"""
Convert a PDF file to images, storing each page as a JPEG.
"""
images = convert_from_path(path)
for i in range(len(images)):
images[i].save('data/images/' + 'page' + str(i) + '.jpg', 'JPEG')
convert_from_path: 各PDFページを画像化。images[i].save: 各ページをJPEGで保存し、OCR処理に利用。
出力添付ファイルURLの抽出
def extract_attachment_url(data_string):
pattern = r'```flowhunt\n({.*})\n```'
match = re.search(pattern, data_string, re.DOTALL)
if match:
json_string = match.group(1)
try:
json_data = json.loads(json_string)
return json_data.get('download_link', None)
except json.JSONDecodeError:
print("Error: Failed to decode JSON.")
return None
return None
- OCR出力ダウンロード用URLを正規表現で抽出する関数です。
API設定と認証
convert_pdf_to_image("data/test.pdf")
FLOW_ID = "<FLOW_ID_HERE>"
configuration = flowhunt.Configuration(
host="https://api.flowhunt.io",
api_key={"APIKeyHeader": "<API_KEY_HERE>"}
)
- PDFを画像化。
- FlowHunt用のAPI認証情報をセット。
APIクライアントの初期化
with flowhunt.ApiClient(configuration) as api_client:
auth_api = flowhunt.AuthApi(api_client)
api_response = auth_api.get_user()
workspace_id = api_response.api_key_workspace_id
- 認証し、以降のAPI呼び出しに必要な
workspace_idを取得。
フローセッションの開始
flows_api = flowhunt.FlowsApi(api_client)
from_flow_create_session_req = flowhunt.FlowSessionCreateFromFlowRequest(flow_id=FLOW_ID)
create_session_rsp = flows_api.create_flow_session(workspace_id, from_flow_create_session_req)
- 画像アップロード・OCR処理用のセッションを開始。
画像をアップロードしOCR処理
for image in os.listdir("data/images"):
image_name, image_extension = os.path.splitext(image)
with open("data/images/" + image, "rb") as file:
try:
flow_sess_attachment = flows_api.upload_attachments(
create_session_rsp.session_id,
file.read()
)
- 画像ごとにアップロードし、OCR処理を実行。
OCR処理の呼び出しと結果のポーリング
invoke_rsp = flows_api.invoke_flow_response(
create_session_rsp.session_id,
flowhunt.FlowSessionInvokeRequest(message="")
)
while True:
get_flow_rsp = flows_api.poll_flow_response(
create_session_rsp.session_id, invoke_rsp.message_id
)
print("Flow response: ", get_flow_rsp)
if get_flow_rsp.response_status == "S":
print("done OCR")
break
time.sleep(3)
- OCR処理を実行し、3秒ごとに完了を確認。
OCR出力のダウンロードと保存
attachment_url = extract_attachment_url(get_flow_rsp.final_response[0])
if attachment_url:
response = requests.get(attachment_url)
with open("data/results/" + image_name + ".csv", "wb") as file:
file.write(response.content)
- CSV出力をダウンロードし、ローカル保存。
スクリプトの実行と出力確認
スクリプト実行方法:
- PDFファイルを
data/フォルダに配置します。 <FLOW_ID_HERE>と<API_KEY_HERE>をFlowHuntの認証情報に置き換えます。- スクリプトを実行すると、PDFの画像変換・OCRアップロード・構造化CSV取得まで自動で行えます。
まとめ
このPythonスクリプトは、大量ドキュメント処理が求められる業界でのOCR業務を効率化するソリューションです。FlowHuntのAPIを活用することで、ドキュメントからCSVへの変換を自動化し、ワークフローの最適化と生産性向上を実現します。
コード全体
import json
import os
import re
import time
import requests
import flowhunt
from flowhunt.rest import ApiException
from pprint import pprint
from pdf2image import convert_from_path
def convert_pdf_to_image(path: str) -> None:
"""
Convert a pdf file to an image
:return:
"""
images = convert_from_path(path)
for i in range(len(images)):
images[i].save('data/images/' + 'page'+ str(i) +'.jpg', 'JPEG')
def extract_attachment_url(data_string):
pattern = r'```flowhunt\n({.*})\n```'
match = re.search(pattern, data_string, re.DOTALL)
if match:
json_string = match.group(1)
try:
json_data = json.loads(json_string)
return json_data.get('download_link', None)
except json.JSONDecodeError:
print("Error: Failed to decode JSON.")
return None
return None
convert_pdf_to_image("data/test.pdf")
FLOW_ID = "<FLOW_ID_HERE>"
configuration = flowhunt.Configuration(host = "https://api.flowhunt.io",
api_key = {"APIKeyHeader": "<API_KEY_HERE>"})
with flowhunt.ApiClient(configuration) as api_client:
auth_api = flowhunt.AuthApi(api_client)
api_response = auth_api.get_user()
workspace_id = api_response.api_key_workspace_id
flows_api = flowhunt.FlowsApi(api_client)
from_flow_create_session_req = flowhunt.FlowSessionCreateFromFlowRequest(
flow_id=FLOW_ID
)
create_session_rsp = flows_api.create_flow_session(workspace_id, from_flow_create_session_req)
for image in os.listdir("data/images"):
image_name, image_extension = os.path.splitext(image)
with open("data/images/" + image, "rb") as file:
try:
flow_sess_attachment = flows_api.upload_attachments(
create_session_rsp.session_id,
file.read()
)
invoke_rsp = flows_api.invoke_flow_response(create_session_rsp.session_id, flowhunt.FlowSessionInvokeRequest(
message="",
))
while True:
get_flow_rsp = flows_api.poll_flow_response(create_session_rsp.session_id, invoke_rsp.message_id)
print("Flow response: ", get_flow_rsp)
if get_flow_rsp.response_status == "S":
print("done OCR")
attachment_url = extract_attachment_url(get_flow_rsp.final_response[0])
if attachment_url:
print("Attachment URL: ", attachment_url, "\n Downloading the file...")
response = requests.get(attachment_url)
with open("data/results/" + image_name + ".csv", "wb") as file:
file.write(response.content)
break
time.sleep(3)
except ApiException as e:
print("error for file ", image)
print(e)

