はじめに
GPT4Vで日本語のOCRしてみたのですが精度がイマイチでした。
そこでAzureAIVisionと組み合わせることで、改善しないか試したところうまくいったので共有します。
実験
以下のニュースサイトから、新着記事を画像として保存し、その画像から出典、タイトル、時刻を抽出しようと思います。
GPT4Vでテキスト抽出
以下のプロンプトと画像をGPT4Vに渡すと、日付と出典はうまく抽出できていますが、内容がところどころおかしいです。
prompt = """
あなたは画像に記載された文章を抽出するエージェントです。
記載された文章の時刻、出典、内容を抽出し、構造化して出力してください。
#出力は以下の形式に従ってください。
[{{"time": str, "source":str, "content":str}}]
Answer:
"""
[
{
"time": "5月20日 12時43分",
"source": "ITmedia NEWS",
"content": "言語の壁をなぐり壊すAI AppleのCM動画制作は「日本がお題材で」始まった"
},
{
"time": "5月20日 12時00分",
"source": "ITmedia AI+",
"content": "思考を背負額帯、医師が全員AI 病院のシミュレーションを検証、中国の研究チームが提案"
},
{
"time": "5月20日 08時00分",
"source": "@IT",
"content": "Google、LLM「Gemini 1.5 Pro」の改良と「Gemini 1.5 Flash」「Gemma」の新モデルを発表"
},
{
"time": "5月20日 07時00分",
"source": "ITmedia エンタープライズ",
"content": "攻撃者たちはAI特有の攻撃ベクトルを駆使している NSAが推奨する対抗策"
},
{
"time": "5月20日 07時00分",
"source": "キーマンズネット",
"content": "AIはERPの未来をどう変える SAP、Microsoft、Oracleの取り組みが事始め"
}
]
AzureAIVisionでテキスト抽出
以下のコードで画像のテキストを抽出します。AzureAIVisionは文章を正確に抽出できますが、構造化することがやや手間です。(文章のバウンディングボックスも取得できるので、ルールベースで構造化しようと思えばできます)
def ocr(image_path, threshold=0.8):
subscription_key = "key"
endpoint = "endpoint"
computervision_client = ComputerVisionClient(
endpoint, CognitiveServicesCredentials(subscription_key)
)
with Image.open(image_path) as img:
buffered = BytesIO()
img.save(buffered, format="PNG")
img_bytes = buffered.getvalue()
image = base64.b64encode(img_bytes).decode("utf-8")
image_data = base64.b64decode(image)
image_stream = BytesIO(image_data)
read_response = computervision_client.read_in_stream(image_stream, raw=True)
read_operation_location = read_response.headers["Operation-Location"]
operation_id = read_operation_location.split("/")[-1]
while True:
read_result = computervision_client.get_read_result(operation_id)
if read_result.status.lower() not in ["notstarted", "running"]:
break
time.sleep(10)
results = []
if read_result.status == OperationStatusCodes.succeeded:
for text_result in read_result.analyze_result.read_results:
for line in text_result.lines:
la = line.appearance
if la and la.style and la.style.confidence >= threshold:
results.append(line.text)
return results
results = ocr("sample.png")
for result in results:
print("[" + result + "]")
[新着記事]
[ITmedia NEWS]
[言語の壁をぶっ壊すAI AppleのCM動画批判は「日本から英語で」始まった]
[5月20日 12時43分]
[ITmedia AI+]
[患者や看護師、医師が全員AI 病院のシミュレーション技術、中国の研究チー]
[1211]
[ムが提案]
[5月20日 12時00分]
[@IT]
[2M]
[Google、LLM 「Gemini 1.5 Pro」の改良と「Gemini 1.5 Flash」「Gemma」]
[--]
[の新モデルを発表]
[5月20日 08時00分]
[ITmedia エンタープライズ]
[攻撃者たちはAI特有の攻撃ベクトルを駆使している NSAが推奨する対抗策]
[5月20日 07時00分]
[キーマンズネット]
[AIはERPの未来をどう変える SAP、Microsoft、Oracleの取り組みから考え]
[NO]
[5月20日 07時00分]
AzureAIVision+GPT4Vでテキスト抽出
AzureAIVisionで抽出した文章を、先ほどのGPTのプロンプトに追加して実行すると、正しい文章で構造化してくれます。
prompt = """
あなたは画像に記載された文章を抽出するエージェントです。
記載された文章の時刻、出典、内容を抽出し、構造化して出力してください。
#抽出した文章
[新着記事]
[ITmedia NEWS]
[言語の壁をぶっ壊すAI AppleのCM動画批判は「日本から英語で」始まった]
[5月20日 12時43分]
[ITmedia AI+]
[患者や看護師、医師が全員AI 病院のシミュレーション技術、中国の研究チー]
[1211]
[ムが提案]
[5月20日 12時00分]
[@IT]
[2M]
[Google、LLM 「Gemini 1.5 Pro」の改良と「Gemini 1.5 Flash」「Gemma」]
[--]
[の新モデルを発表]
[5月20日 08時00分]
[ITmedia エンタープライズ]
[攻撃者たちはAI特有の攻撃ベクトルを駆使している NSAが推奨する対抗策]
[5月20日 07時00分]
[キーマンズネット]
[AIはERPの未来をどう変える SAP、Microsoft、Oracleの取り組みから考え]
[NO]
[5月20日 07時00分]
#出力は以下の形式に従ってください。
[{{"time": str, "source":str, "content":str}}]
Answer:
"""
[
{
"time": "5月20日 12時43分",
"source": "ITmedia NEWS",
"content": "言語の壁をぶっ壊すAI AppleのCM動画批判は「日本から英語で」始まった"
},
{
"time": "5月20日 12時00分",
"source": "ITmedia AI+",
"content": "患者や看護師、医師が全員AI 病院のシミュレーション技術、中国の研究チームが提案"
},
{
"time": "5月20日 08時00分",
"source": "@IT",
"content": "Google、LLM 「Gemini 1.5 Pro」の改良と「Gemini 1.5 Flash」「Gemma」の新モデルを発表"
},
{
"time": "5月20日 07時00分",
"source": "ITmedia エンタープライズ",
"content": "攻撃者たちはAI特有の攻撃ベクトルを駆使している NSAが推奨する対抗策"
},
{
"time": "5月20日 07時00分",
"source": "キーマンズネット",
"content": "AIはERPの未来をどう変える SAP、Microsoft、Oracleの取り組みから考える"
}
]
まとめ
GPT4Vで精度がイマイチな日本語のOCRをAzureAIVisionを用いて改善する方法を紹介しました。