1
0

AzureAIVision+GPT4VでOCRする

Last updated at Posted at 2024-05-20

はじめに

GPT4Vで日本語のOCRしてみたのですが精度がイマイチでした。
そこでAzureAIVisionと組み合わせることで、改善しないか試したところうまくいったので共有します。

実験

以下のニュースサイトから、新着記事を画像として保存し、その画像から出典、タイトル、時刻を抽出しようと思います。

image.png

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を用いて改善する方法を紹介しました。

1
0
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
1
0