こんにちは、プロダクトAI開発の宮後(miya10kei)です。 先日、数年遅れで初コロナにかかってしまいダウンしていました(コロナ辛いですね、、、)😷
生成AIで画像やPDFのOCR(文字認識)を試したことはあるでしょうか?
ニーリーでは事業で様々な形式の書類を扱っており、如何にしてオフラインのデータを構造化されたオンラインデータに変換するかが業務効率化の重要な要素となっています。
今回は、画像やPDFのOCRに生成AIを用い場合に、どれくらいの精度がでるかを検証した結果を紹介します!
⚠️ 読む前の注意点 ⚠️
- OCR(Optical Character Recognition/Reader)は光学文字認識ですので、既にデジタル化された画像やPDFの文字認識をOCRと呼ぶことに違和感がある方もいるかと思います。ただ、画像やPDFに対する文字認識もOCRと一般的に呼ばれているので、本記事でもOCRと呼ぶこととします。(「Omnipresent(どこにでもある)Character Recognition」ですね)
- 精度検証には実業務で扱うPDFファイルを使用しました。実際のPDFファイルや読み取る項目などを公開できないため、抽象化した上での紹介になることをご承知おきください🙇♂️。(同様の理由で検証に試用したプロンプトも非公開となります。)
- 今回の検証結果はあくまでニーリーで扱う書類を対象に行った結果になります。読者の方々の環境では異なる結果になる可能性があることをご承知おきください。
それでは予防線🛡️をはり終えたので、さっそく本題に入っていきます!
なんでAI OCR?
まずは何でOCRをAIで実施するに至ったかについてです。私たちが画像やPDFに対してOCRを行うにあたって、次の3つの手段を検証しました。
- ベンダー製品(SaaSを含む)の利用
- OSSライブラリーの利用
- 生成AIの利用
それぞれ、一長一短ありますが、次の理由で生成AIを採用しました。
- コスト:トークン数による完全従量課金である
- 柔軟性:プロンプトを変更するだけで、様々なフォーマットの書類を扱うことができる
- 読み取り精度:
- 課題はありつつも、活用できるレベルの精度であることが検証できた
- モデルの進化を待つだけで一定の精度向上を享受できる
精度検証について
検証対象PDFファイルについて
前述の通り、検証には実業務で扱うPDFを使用したため、詳細をお伝えすることはできません🙇♂️ 一般的によくある契約書などの「印字された文字」と「手書き文字」が混在した書類をイメージいただければと思います。そして、読み取る項目も「印字された文字」と「手書き文字」の両方となります。
検証指標について
381件のPDFに対して、1 PDFあたり12項目を読み込み、項目ごとの正解率を算出することで精度検証を行なっています。
検証内容について
今回は次の3項目 + α の内容で検証を行いました。
# | 検証項目 | 説明 |
---|---|---|
1 | モデルの違いによる検証 | 各プロバイダーが提供するマルチモーダル対応モデルでどれくらい精度に差があるのかを検証します |
2 | 前処理の違いによる検証 | グレースケールやノイズ除去、回転といった前処理が精度に影響を及ぼすのかを検証します |
3 | 対象項目を絞ることによる違いの検証 | 生成AIでは1度に行うタスクを絞ることで精度が向上することが多々あるかと思います。1度に複数の項目を読み取るのと、単一の項目を読み取るので精度に差があるのかを検証します |
4 | 正立判定(番外編) | 検証項目#2の回転を複数の方法で判定した場合に、どの方法が最も精度が良いのかを検証します |
検証結果について
それでは各検証項目の結果について紹介していきます。
モデルの違いによる検証
まず初めに使用するモデルでどれくらい精度に違いがあるのかを検証しました。今回は次の8つのモデルを対象としています。
検証結果ではGeminiシリーズが他モデルと比較して頭一つ抜けた正解率となりました。(圧倒的な精度ですね!)Geminiは他モデルと比較してもトークンあたりの料金が安いため嬉しい結果です。また、Geminiシリーズ内でも上位のモデルほど、正解率が高い傾向となったため順当な結果と言えると思います。
そのため、以降は全てGemini 2.5 Proでの検証結果ととなります。
前処理の違いによる検証
続いて、前処理の違いによる検証です。画像解析の前処理でよく行われる次の変換をおこなうことで精度に違いがでるかを検証しました。変換処理には Pillow(Python Imaging Library)を使用しています。
- グレースケール
- ノイズ除去
- 回転(PDFを正立状態に回転させる処理)
グレー化を適用することで、多少の精度改善が見られる結果となりました。
一方、ノイズ除去と回転を適用しても精度に変化は見られないという結果となりました。
(Gemini以外のモデルでは画像を正立化するかどうかで精度に大きな違いが見られました)
対象項目を絞ることによる違いの検証
続いて、1度に実施するOCR対象の項目を絞ることで精度改善が見られるかの検証結果です。
項目の絞り込みよる精度の違いは特段見られないという結果となりました。個人的には意外な結果でしたが、一方で一回のリクエストで全ての項目を読み取ることで、消費トークン数を抑えることができるのでホッとしました😅
正立判定(番外編)
最後に番外編として画像の正立判定の精度について紹介します。 画像処理の自動化を目指す中で、人の目を介さず画像が正しい向きになっているかを判定する必要があります。判定の手法としてLLMとOCR Engineである Tesseract OCR で比較を行いました。
少し母数が少ないですが、それでもTesseract OCR が100%の正解率となったため、正立判定はLLMを使用しない方が現状は精度が高いという結果となりました。
まとめ
今回はニーリーでのAI OCRの精度検証の結果を紹介しました!
個人的には現時点では「Gemini最強」という感想を持っていますし、ニーリーでもAI OCRにはGeminiを採用しています!
かなりぼかした内容での紹介となってしまい「よくわからん🤔」という感想を持たれた方もいるかもしれません。自分の環境でも検証してみようというモチベーションのきっかけになればと思っていますので、こうすると精度上がったよなどの情報を共有いただけると大変嬉しいです🙌