Taste of Tech Topics

Acroquest Technology株式会社のエンジニアが書く技術ブログ

GPT-4Vのモデルを利用してOCRできるか試してみた

こんにちは、安部です。

気温の上下に翻弄されて最近風邪をひいてしまいましたが、皆さま元気にお過ごしでしょうか。

今回は、GPT-4Vのモデルを利用して、OCRができるか試していきます。

GPT-4Vによって、「ChatGPTに目ができた」などと騒がれましたが、文字認識はどれくらいできるのでしょうか? 得意分野ではなさそうですが、GPTも進化が目覚ましいので分かりませんね。

検証では、日本語(漢字/ひらがな/カタカナ)・英語の2言語で精度など比較していきます。 また、手書き・活字での違いも見ていきましょう。

一番簡単に試せるChatGPT(Web版)でOCRをさせようとするとエラーになることが多かったので、 ここではAPIを使っていくこととします。

APIを呼び出すプログラム

以下のコードを使い、gpt-4-vision-previewというモデルを呼び出しています。 画像は個人のgithubリポジトリにアップロードしておき、URLをモデルに渡します。 余計なことをして欲しくないので、読み取った文章のみを返答するよう指示します。

from openai import OpenAI

def main():
    client = OpenAI(
        api_key= 'API Keyを入れる'
    )

    response = client.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 provide 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 extracted characters."},
                    {
                        "type": "image_url",
                        "image_url": {
                            "url": "画像のURL",
                        },
                    },
                ],
            },
        ]
    )

    print(response.choices[0].message.content)


if __name__ == "__main__":
    main()

それでは、試していきましょう!

英語の活字を認識させる

まずは、一番簡単そうな英語・活字を認識できるか見ていきます。 題材は、チューリングの有名論文の最初の1ページです。

これを読み取らせる

読み取り結果は以下の通りです。間違っているところは赤い字にしています(ほとんどありませんが)。

ON COMPUTABLE NUMBERS, WITH AN APPLICATION TO THE ENTSCHEIDUNGSPROBLEM By A. M. TURING.

[Received 28 May, 1936.—Read 12 November, 1936.]

The “computable” numbers may be described briefly as the real numbers whose expressions as a decimal are calculable by finite means. Although the subject of this paper is ostensibly the computable numbers, it is almost equally easy to define and investigate computable functions of an integral variable or a real or computable variable, computable predicates, and so forth. The fundamental problems involved are, however, the same in each case, and I have chosen the computable numbers for explicit treatment as involving the least cumbrous technique. I hope shortly to give an account of the relations of the computable numbers, functions, and so forth to one another. This will include a development of the theory of functions of a real variable expressed in terms of computable numbers. According to my definition, a number is computable if its decimal can be written down by a machine.

In §§ 9, 10 I give some arguments with the intention of showing that the computable numbers include all numbers which could naturally be regarded as computable. In particular, I show that certain large classes of numbers are computable. They include, for instance, the real parts of all algebraic numbers, the real parts of the zeros of the Bessel functions, the numbers π, e, etc. The computable numbers do not, however, include all definable numbers, an example is given of a definable number which is not computable.

Although the class of computable numbers is so great, and in many ways similar to the class of real numbers, it is nevertheless enumerable. In §§ I examine certain arguments which would seem to prove the contrary. By the correct application of one of these arguments, conclusions are reached which are superficially similar to those of Gödel’s. These results

  • Gödel, “über formal unentscheidbare Satze der Principia Mathematica und verwandter Systeme I,” Monatshefte Math. Phys., 38 (1931), 173-198.

ほぼ、完璧ですね。 ウムラウトやセクションマーク(§)、πなどのギリシャ文字も読み取れています。 間違っているのは、"§8"が"§§"になっている点と、"Gödel † (ダガー記号)"が"Gödel’s"になっている点くらいでしょうか。

期待通り、英語の活字はかなりの精度で認識してくれました。

英語の手書き文字を認識させる

次に、手書き文字を認識させてみます。 あまり長い文章を書くのは大変なので、短い文章ですがご容赦ください。

以下の画像を読み込ませてみます。 "My handwriting is very legible, so you should be able to recognize it."と書いてあります、念のため。

読み取り結果は以下の通りです。

My handwriting's very legible, so you should be able to recognize it.

isが短縮形にされてしまっている点以外、正しく認識されています (グニャグニャの筆記体で書いたら精度が下がるのかもしれませんが)。

日本語の活字を認識させる

では、日本語の認識精度はどうでしょうか?

まずは短い文章を認識させてみましょう。

こちらの画像を読み込ませました。

読み取り結果はこちら。

高齢者がつまずきやすい文字が認識できるかをテストする。

やはり、日本語は難しいようです。 漢字だけでなく、ひらがなも読み違えていますね。

「認識」という文字が認識できているのに「大」が認識できないのは何故なんでしょうか...。

念のため、もう少し長い文章も試してみましょう。 オー・ヘンリーの有名短編小説「賢者の贈り物」の冒頭部分の日本語版キャプチャを読み込ませます。

読み取り結果はこちら。

1ドル87セント。それで頂点。しかしもそのうちの2セントは小銭でした。
小銭は一回の買い物につき一枚か二枚づつ減り続けたものです。乾物屋や小倉屋 や肉屋に無理強打はしませんでので、しまいに、こんなに値打あるという無 言の押売満腹分をはぼさせでした。デ回数えてみました。でもやっぱ
り1ドル87セント。明日はクリスマスだというのに。

これでは、またくのところ、精神性な小子に窮しちまいかも試練です
ですからデはそうしませんで。そうしているうちに、人生というものは、
わあわあ泣くのと、しくしく泣くのと、微笑みとで済まそうか、しかも、しく
しく泣くのが大部分を占めていると思うようになりました。

かなり認識ミスが多いですね。日本語部分はともかく、"60セント"が"2セント"になってしまうのは想定外でした。

日本語の手書き文字を認識させる

日本語だと活字でも上手く認識されないので、手書き文字だとなおさらダメだと予想が付きますが、一応試してみます。

こちらの画像を読み込ませます。

結果は以下の通り。

記憶切なの文字を選びてコピーする e

...確かに、私の"。"は小さな"e"に見えなくもないですね笑。

大変な悪筆という訳でもないと思うので、日本語の認識が難しいということなのでしょう。

まとめ

今回は、GPT-4Vのモデル(gpt-4-vision-preview)を使ってOCRを試してみました。

結論としては、英語であれば手書き・活字ともにかなりの精度でOCRできますが、日本語はまだまだ難しそうでした。

活字 手書き
英語
日本語 ×

クラウドベンダーが出している他のAIモデルなど、選択肢は豊富にあるので適材適所でやっていくのがよさそうですね。

それでは。

Acroquest Technologyでは、キャリア採用を行っています。
  • ディープラーニング等を使った自然言語/画像/音声/動画解析の研究開発
  • Elasticsearch等を使ったデータ収集/分析/可視化
  • マイクロサービス、DevOps、最新のOSSクラウドサービスを利用する開発プロジェクト
  • 書籍・雑誌等の執筆や、社内外での技術の発信・共有によるエンジニアとしての成長
  少しでも上記に興味を持たれた方は、是非以下のページをご覧ください。 www.wantedly.com