👁️

AnthropicのClaude 3 OpusのVision機能を日本語OCRとして使ってみる

2024/03/08に公開

今月4日、AnthropicがClaude 3を発表しました。Anthropicの発表している評価結果では、OpenAI GPT-4やGoogleのGemini 1.0 Ultraを上回る高い性能を示しています。私もClaude 3 Sonnetを使って、翻訳やテストケース作成などの作業をいくつかやってもらいましたが、私の体感でもGPT-4と同等かそれを上回る高い性能だと感じました。

最近の生成AIは画像認識系機能を組み込んでおり、Claude 3もVision機能が提供されています。具体的には写真やグラフ、図などを読み込んで処理する用途が想定されているそうです。

私は以前から、「Azure Computer Vision APIの日本語OCR機能を使ってみる」、「Google Cloud Vision APIの日本語OCR機能を使ってみる」、「OpenAIのGPT-4 Turbo with visionを日本語OCRとして使ってみる」というエントリーを書き、画像認識APIの日本語OCR機能を評価しています。Claude 3も日本語OCRは出来そうなので、まったく同じ検証方法で評価してみました。

Claude 3 Opus Vision機能の利用

AnthropicのAPI Keyを準備します。Claude APIのページから「Get API Access」をクリックし、ログイン後に「Get API Keys」→「Create Key」でAPI Keyを作成してください。今回の用途はデフォルトのEvaluation Planで問題ありません。今回初めてAnthropicのAPI Keyを作成したのですが、電話番号認証で5米ドル分の利用枠を無料でもらったので、API利用によるお金はかかりませんでした。

今回の検証コードは、Anthropic Client SDKsClaude User Manual: VisionのPythonコードをベースにプロンプト部分などを修正しました。実行環境にないPythonパッケージはpip install anthropicなどを実行してください。

AnthropicのAPI Keyはコード内のapi_keyに直接記入します。以下のコード内のAPI Keyはダミーです。画像ファイルはimage_urlの値として実行のたびに書き換えて渡します。

ocr.py
import anthropic
import base64
import httpx

client = anthropic.Anthropic(
    # defaults to os.environ.get("ANTHROPIC_API_KEY")
    api_key="sk-ant-Zy9X-Jw7V_Qr6FTvBn8LCs2DUp3EYtMiGk7ONm5P1Lq2Mn0Eo3Dp4Ht5Kx6Ry7Sz8Tn9Pu0Iv1Jw2Kx3Ly4Mz5Nx6Oy7Pz8Qv9Rw0Sx1Ty2",
)

image_url = "https://sample.com/images/01.jpg"
image_media_type = "image/png"
image_data = base64.b64encode(httpx.get(image_url).content).decode("utf-8")

message = client.messages.create(
    model="claude-3-opus-20240229",
    max_tokens=4096,
    messages=[
        {
            "role": "user",
            "content": [
                {
                    "type": "image",
                    "source": {
                        "type": "base64",
                        "media_type": image_media_type,
                        "data": image_data,
                    },
                },
                {
                    "type": "text",
                    "text": "Please extract all characters within the image. They might be several lines. Return the only extracted characters."
                }
            ],
        }
    ],
)
print(message.content[0].text)

準備が出来たら、python ocr.pyでスクリプトを実行します。過去と同様に最初はテストとして、こちらの画像を文字認識させてみます。

$ python ocr.py
一行目おはようございます
二行目こんにちは
三行目こんばんは

文字認識結果が正しく返ってくることが確認できました。

文字認識テストと文字認識率の測定

以前のエントリーと同様に、オスカー・ワイルド原作、結城浩翻訳の『わがままな大男』の冒頭部分の文章を使い、游ゴシック、メイリオ、MS P明朝、あんずもじ2020の4種類のフォントを使った画像(以前のエントリーと全く同じ画像)を使用します。改行や半角スペースは除去した上で、文字認識率も同じ計算式((正答の文字数 - 正答と文字認識結果のレーベンシュタイン距離 ) / 正答の文字数)で計算しました。

結果は下記表のとおりです。このエントリーの最後に実際に出力された文字列もつけておきます。

フォント 画像 文字認識率
游ゴシック 画像 97.4% (372/382)
メイリオ 画像 99.2% (379/382)
MS P明朝 画像 98.7% (377/382)
あんずもじ2020 画像 99.5% (380/382)

どれも素晴らしい文字認識精度を見せてくれました。特にフォントごとに認識精度に差がなく、標準フォントではない特徴的なフォントであるあんずもじ2020の精度が一番高いのは驚きました。元のテキストで全角数字の箇所を半角数字だと認識した場合に間違いと分類してしまう機械的な測定方法を使っているので、認識率が100%になるのはほぼ不可能ですので、実質的にほぼ満点の高い精度だと思います。

多少とは言え差がついた箇所としては、游ゴシックの画像では一行目の「わがままな大男」が認識対象にならなかったことぐらいです。これは数回試しても同じだったので理由は不明です。他のフォントの画像ではこの行も正しく認識してくれました。

認識率計算の際に改行は一括除去しているので測定結果には関係ないのですが、元のアウトプットでは改行の入れ方にゆらぎがありました。具体的にはこのページの一番下の出力結果を見た方が分かりやすいですが、画像横幅によるテキスト折り返しの箇所について、見た目重視で改行を入れるパターンと意味重視で次の行と一続きにしてくれるパターン(改行を入れないパターン)がマチマチでした。同じ画像でも1回目と2回目で変わることもあったので、用途によっては挙動の違いが煩わしいこともあるかもしれません。

以上、Anthropic Claude 3 OpusのVision機能を日本語OCRとして使ってみた結果です。

OpenAIのGPT-4 with Visionについては、先行するクラウド画像認識APIに比べるとまだまだだなという印象でしたが、Claude 3の日本語OCR機能の精度の高さにはただただ驚嘆しました。テキスト側の処理も、画像の処理も両方ともここまで強いモデルが、AWSのBedrockやGoogle CloudのVertex AI上で使えるようになるという話ですから、OpenAIのChatGPTとAzure OpenAI Serviceの一強状態に待ったをかける強力なライバルが登場したという印象です。私個人はChatGPT Plusを契約して日常的に愛用しているのですが、今回の検証結果を見て、Claude Proを契約しClaudo 3 Opusをしばらく使ってみようと思いました。

出力結果
游ゴシック
子どもたちは毎日、午後になって学校から帰ってくると、大男の庭に行って遊ぶのが常でした。

そこは、柔らかい緑の草が生えた、広くて素敵な庭でした。草むらのあちこちには、星に似た美しい花が立っておりました。その庭には十二本の桃の木があり、春になると薄桃色と真珠色の繊細な花があふれるように咲き、秋には豊かな果実が実ります。鳥たちは木々の上でたいそう甘い歌声を響かせるので、子どもたちは遊ぶのをやめて聞きいるのでした。「ここで遊ぶのはなんて楽しいんだろう!」と、くちぐちに声をあげました。

ある日、大男が帰ってきました。彼はコーンウォールに住む鬼の友人を訪問し、そこで7年間いっしょに過ごしていました。7年が過ぎ、話したいことは全部話したし、もう話題もなくなってきたので、自分の城に帰ろうと思ったのでした。大男が戻ると、子どもたちが庭で遊んでいるのが見えました。
メイリオ
わがままな大男

子どもたちは毎日、午後になって学校から帰ってくると、大男の庭に行って遊ぶのが常でした。

そこは、柔らかい緑の草が生えた、広くて素敵な庭でした。草むらのあちこちには、星に似た美しい花が立っておりました。その庭には十二本の桃の木があり、春になると薄桃色と真珠色の繊細な花があふれるように咲き、秋には豊かな果実が実ります。鳥たちは木々の上でたいそう甘い歌声を響かせるので、子どもたちは遊ぶのをやめて聞きいるのでした。「ここで遊ぶのはなんて楽しいんだろう!」と、くちぐちに声をあげました。

ある日、大男が帰ってきました。彼はコーンウォールに住む鬼の友人を訪問し、そこで7年間いっしょに過ごしていました。7年が過ぎ、話したいことは全部話したし、もう話題もなくなってきたので、自分の城に帰ろうと思ったのでした。大男が戻ると、子どもたちが庭で遊んでいるのが見えました。
MS P明朝
わがままな大男

子どもたちは毎日、午後になって学校から帰ってくると、大男の庭に行って遊ぶのが常でした。

そこは、柔らかい緑の草が生えた、広くて素敵な庭でした。昔むらのあちこちには、星に似た美しい花が

立っておりました。その庭には十二本の桃の木があり、春になると薄桃色と真珠色の繊細な花があふれる

ように咲き、秋には豊かな果実が実ります。鳥たちは木々の上でたいそう甘い歌声を響かせるので、子ど

もたちは遊ぶのをやめて聞きいるのでした。「ここで遊ぶのはなんで楽しいんだろう!」と、くちぐちに言を

あげました。

ある日、大男が帰ってきました。彼はコーンウォールに住む鬼の友人を訪問し、そこで7年間いっしょに過

ごしていました。7年が過ぎ、話したいことは全部話したし、もう話題もなくなってきたので、自分の城に帰

ろうと思ったのでした。大男が戻ると、子どもたちが庭で遊んでいるのが見えました。
あんずもじ2020
わがままな大男

子どもたちは毎日、午後になって学校から帰ってくると、大男の庭に行って遊ぶのが常でした。

そこは、柔らかい緑の草が生えた、広くて素敵な庭でした。草むらのあちこちには、星に似に美しい花が立っておりました。その庭には十二本の桃の木があり、春になると薄桃色と真珠色の繊細な花があふれるように咲き、秋には豊かな果実が実ります。鳥たちは木々の上でたいそう甘い歌声を響かせるので、子どもたちは遊ぶのをやめて聞きいるのでした。「ここで遊ぶのはなんて楽しいんだろう!」と、くちぐちに声をあげました。

ある日、大男が帰ってきました。彼はコーンウォールに住む負の友人を訪問し、そこで7年間いっしょに過ごしていました。7年が過ぎ、話したいことは全部話したし、もう話題もなくなってきたので、自分の城に帰ろうと思ったのでした。大男が戻ると、子どもたちが庭で遊んでいるのが見えました。

Discussion