AzureAIVision+GPT4VでOCRする

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

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

<meta property="og:title">

https://www.itmedia.co.jp/aiplus/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3354079/d1f2e14b-8e29-b458-9283-861eabe017ba.png)


# GPT4Vでテキスト抽出
以下のプロンプトと画像をGPT4Vに渡すと、日付と出典はうまく抽出できていますが、内容がところどころおかしいです。

```python
prompt = """
あなたは画像に記載された文章を抽出するエージェントです。
記載された文章の時刻、出典、内容を抽出し、構造化して出力してください。

#出力は以下の形式に従ってください。
[{{"time": str, "source":str, "content":str}}]

Answer:
"""
```

```json
[
    {
        "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は文章を正確に抽出できますが、構造化することがやや手間です。（文章のバウンディングボックスも取得できるので、ルールベースで構造化しようと思えばできます）

```python
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 + "]")
```

```terminal
[新着記事]
[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のプロンプトに追加して実行すると、正しい文章で構造化してくれます。

```python
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:
"""
```



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