👁️

OpenAIのGPT-4 Turbo with visionを日本語OCRとして使ってみる

2023/11/09に公開

先日のOpenAI DevDayで、GPT-4 Turbo with visionというものが発表されました。Chat Completions APIで画像ファイルをインプットとして渡して、画像解析をしてくれるAPIです。

私は以前、「Azure Computer Vision APIの日本語OCR機能を使ってみる」や「Google Cloud Vision APIの日本語OCR機能を使ってみる」で、各クラウドの画像認識APIの日本語OCR機能を検証するエントリーを書きました。OpenAIも画像認識APIが使えるようになったので、まったく同じ検証方法で評価してみました。

GPT-4 Turbo with vision OCR機能の利用

OpenAIのAPI Keyを準備します。API Keyを取得されていない方は、「OpenAI API Key取得」で検索してください。

今回の検証コードは、OpenAI API Document: VisionのQuick StartのNode.js(node)版を活用します。上述したエントリーのコードがNode.jsだったので、今回もNode.jsにしましたが、Pythonでも大差はないと思います。

Node.jsとnpmはインストール済みの前提です。npmでopenaiパッケージをインストールしてください。

$ npm install openai

OpenAIのAPI Keyを環境変数OPENAI_API_KEYに設定します。以下はMacのターミナルでの実行例です。値はダミーです。

$ export OPENAI_API_KEY='sk-Y9z2x8j7w6e5t4r3u2i1o0pQ6y5t8z2u9v1w4x7r3e0a5t4r'

サンプルコードではmax_tokensの指定がありませんが、デフォルトの16ではトークン数が足りずに回答が途中で切れるので、今回は1024に設定しました。また、純粋に抽出した文字だけ出力して欲しいので、systemメッセージとして、「あなたはOCRマシンで、抽出した文字以外は回答できません」という指示を追加しておきます。画像ファイルはurlの値としてリンクとして渡します。

index.js
import OpenAI from "openai";

const openai = new OpenAI();

async function main() {
  const response = await openai.chat.completions.create({
    model: "gpt-4-vision-preview",
    max_tokens: 1024,
    messages: [
      {
        role: "system",
        content: "You are an Optical Character Recognition (OCR) machine. You will extract all the characters from the image file in the URL provided by the user, and you will only privide the extracted text in your response. As an OCR machine, You can only respond with the extracted text."
      },
      {
        role: "user",
        content: [
          { type: "text", text: "Please extract all characters within the image. Return the only extacted characters." },
          {
            type: "image_url",
            image_url: {
              "url": "https://sample.com/images/01.jpg",
            },
          },
        ],
      },
    ],
  });
  console.log(response.choices[0].message.content);
}
main();

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

$ node index.js
一行目はようこそいます
二行目とんにちは
三行目こんばんは

認識精度はともかくとして、文字認識結果が返ってくることが確認できました。

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

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

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

フォント 画像 文字認識率
游ゴシック 画像 93.7% (358/382)
メイリオ 画像 78.8% (301/382)
MS P明朝 画像 81.2% (310/382)
あんずもじ2020 画像 50.8% (194/382)

フォントによって認識精度に結構な差が付きました。游ゴシックは多少のミスはあるものの文意は十分に読み取れる程度に文字認識してくれています。メイリオ以降の3つのフォントについては読み物としてはちょっと厳しいかなと感じる程度には乱れています。日本語を含む画像ファイルに対して、各クラウドの画像認識APIとOCR機能という観点で比較した場合、少なくとも現時点では各クラウドの画像認識APIに軍配が上がると言えます。ここは餅は餅屋の問目躍如と言えると思います。

以上、GPT-4 Turbo with visionを日本語OCRとして使ってみた結果です。

GPT-4 Turbo with visionはOCR機能を前面に押し出したAPIではないので、この検証自体が少し意地悪だったかもしれません。例えば、OCR機能だけを実行させるのではなく、「画像ファイルの文字列を抽出して、その内容を一言でまとめて」のようにこのAPIに指示を出すと、「内容を一言でまとめると、『大男の庭で遊ぶ子どもたち』です。」と回答してくれるので、一連の手続きを少ない行数のコードで実行させる場合に役立つ、非常にパワフルで柔軟なAPIであるという点は疑いようがありません。

一方で、OCRの認識精度にタスク実行結果の正確性が依存している場合は、OCR機能としては認識精度に制約がありそうという点は意識した方が良さそうです。上記の結果だとゴシック体のフォントの方が現状では認識精度が高そうなので、OpenAIに渡す画像のフォントはできるだけゴシック体にする(メイリオや明朝は避ける)みたいな工夫は考えても良さそうです。あるいは、OCR機能だけはAzureやGoogle Cloudなどの画像認識APIを使い、その認識結果をOpenAIのAPIにコンテキストとして与えるというAPIの組み合わせも考えられるかもしれません。

出力結果
游ゴシック
わがままな大男

子どもたちは毎日、午後になって学校から帰ってくると、大男の庭に行って遊ぶのが常でした。
そしては、柔らかい豪の実が生えた、広くて素敵な庭でした。昔おじのあちこちには、星に似た美しい花が咲っておりました。その庭には十二本の桜の木があり、春になると樹皮もと真珠色の樹液が花があふれるように咲き、秋には豊かな果実が実ります。彼たちは木の上でたいそうない
歌声を響かせるので、子どもたちは好ぶのをやめて聞きいるのでした。「ここで遊ぶのはなんて楽しいんだろう!」と、くちぐちは声をあげました。

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

テビビたちは毎日、午後になって学校から帰ってくると、大男の庭に行って遊ぶのが習いだった。

そしては、家づかい櫻の守が稽古を、庭くて素振り煽てました。草むらのあちこちには、星に似た美しい花が咲っておりました。その庭にはキー本の桜の木があり、春になると蜜蜂と自然恋の蝶
紋紋がかぶれるように呼さ、桜には豊かな果実が実ります。皇たちは木々の上でいそう自い
語有を糾かせるので、テビビたちは嬉ぷのをやめて聞きいるのでした。「ここで遊ぶのはなんて
楽しいんだろう!! と、くちぐち語をあふました。

ある日、大男が帰ってきました。彼はコーツウォールに住む蘭の友人を訪問し、そこて7年間
いっしょに訥しくいました。7年が過ぎ、話したいことは全部話したし、もう話額もなくなって赴ので、自分の故に帰ることに決のでした。大男が戻ると、テビビたちが遊て遊んでいる
のが見えました。
MS P明朝
わがままな大男

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

そしては、柔らかい霧の中点が生えた、広くて蔓莪な庭でした。草むらのあちこちには、星に似た美しい花が立って咲いていました。その庭には十二本の桜の木があり、春になると華麗な色と甘い香りの絨毯を法があふれるように咲き、秋には世間がな果実が実ります。葉たちは大木の上でたいそうな囀を競争するので、子どもたちは遊ぶのをやめて聞きいるのでした。「ここで遊ぶのはなんて楽しいんだろう!」と、彼らは声をあげました。

ある日、大男が湧いてきました。彼はコーリャンゴールに佇む背の大きな蒼間凛、そこで7年間いっしょに過ごしていました。7年が過ぎ、言葉をいっとは全粒話したし、お互い話なくなってきたので、自分の故郷に帰ろうと思ったのでした。大男が戻ると、子どもたちは湧で遊んでいるのが見えました。
あんずもじ2020
わかりますか課

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

そこは、森とかい霊安の草むらになった、広くて素敵な広場でした。草むらのなかっちょちょには、黄色い花たくさんいたかいていました。その広場には二本の巨木があり、森になると遥か北とを連結させる鉄塔との繋牙布で木男がふんばるようにそそり立っていました。その広場のはずれには、木男の木があり、森になると遥か北とを連結させる鉄塔がふんばっていました。温もりは木男の足の上でだいぶうわもい温声を辺時なきあのです。子どもたちは温ものをわかり間いとのです。「ここで温ものはなんで素しいんだろう?」と、くっきりとた声をあげました。

ぬる日、木男が帰ってきました。彼はコークナーボルに住む魚の木人も訪問し、えって7年間いっしょに過ごしていました。7年が過ぎ、詰もたいさとは全員お亡したし、もう話題もなくなってきたのです。自分の腹に帰ってきたのです。木男が戻ると、子どもたちが広場で遊んでいるのが見えました。

Discussion