「いろんなOCRエンジンあるけど、どれが一番使えるの?」って思ったことない?僕らもそうだったんだ。特にDifyワークフローに組み込むOCRを選定する時、PaddleOCR, Tesseract, Surya, クラウドOCR...どれがいいか分からなかった。
そんな時、Claude Codeに頼んで「比較評価スクリプト」を作ってもらうのがマジで早かったから、そのやり方を紹介するよ。
一番雑な投げ方
まずはこれ投げてみて。
OCRエンジン(PaddleOCR, Tesseract, Surya, Google Document AI)の精度を比較するベンチマークスクリプトをPythonで書いて。入力は画像ファイルと正解テキストのJSONファイル、出力は各OCRエンジンの認識結果とF1スコアとかの評価指標をまとめたJSONにしてね。
これだけで動くよ。Claude Codeは、複数のOCRエンジンを呼び出す関数と、正解データ(Ground Truth)と比較して評価するロジックを、一通り書いてくれるんだ。
もうちょい具体的に投げるパターン
もうちょっと細かく指示したいなら、こんなパターンがおすすめだよ。
評価したいOCRエンジンを絞る場合
「特定のOCRだけ試したい」って時は、使いたいエンジンだけ具体的にリストアップするんだ。
PythonでOCRベンチマークスクリプトを書いてほしい。
比較対象はPaddleOCR、Tesseract (pytesseract)、それとAzure AI Visionね。
入力はJPEG/PNG画像と、各画像に対応する正解テキストのJSONファイル。
出力は、各エンジンで処理した結果のテキスト、Precision, Recall, F1スコア、文字エラー率 (CER) をCSVとJSONで保存して。
ディレクトリ構造を考慮して投げる場合
プロジェクトで使うディレクトリ構成が決まってるなら、それを伝えるとよりスムーズだね。
OCRベンチマーク用のPythonスクリプトを作って。
プロジェクト構造はこうだよ:
- `samples/` # テスト画像と正解JSON
- `scripts/` # 生成するスクリプトをここに置きたい
- `results/` # 実行結果(CSV/JSON)を保存
`samples/`内の画像を読み込み、PaddleOCRとSurya OCRを使ってOCR処理。
`results/`に各OCRエンジンの認識精度をまとめたCSVファイルを出力してね。
評価指標や出力形式を細かく指定するパターン
「この指標で見て、こんな形式で結果を出してほしい」って時も、全部言っちゃえばいいよ。
OCRのベンチマークスクリプトをPythonで書いてください。
比較するのはPaddleOCR、EasyOCR、それとAnthropic Vision(LLM Vision APIね)。
評価指標として、単語単位のPrecision, Recall, F1スコア、それから全体での文字エラー率(CER)を計算してほしい。
出力は、全画像の平均スコアをまとめたCSVファイルと、各画像ごとの詳細な認識結果・評価メトリクスを保存したJSONファイルを`results/`ディレクトリに生成して。
実践例 / 実録
僕らは「Difyワークフローに最適なOCRエンジンはどれか?」って課題を抱えてたんだ。それで、いろんな帳票を正確にOCRできるやつを探してた。
まず、社内で集めた紙帳票のテストセットを用意したよ。これをsamples/ディレクトリに置いて、それぞれの帳票から手作業で抽出した正解テキストをJSON形式で一緒に保存したんだ。これがGround Truthね。
次に、上記で紹介したプロンプトをClaude Codeに投げたんだ。僕らの場合は、PaddleOCR、Tesseract、Surya、あとGoogle Document AIを比較したかったから、そのエンジン名を具体的に伝えたよ。
投げたらこうなった:
Claude Codeは、Pythonでこんな感じのスクリプトを書いてくれたんだ。
- 各OCRエンジンのラッパー関数: PaddleOCRやTesseract、Suryaを呼び出すための関数。クラウドOCRの場合はAPIを叩くコードを書いてくれる。
- 評価ロジック: Ground Truthと各OCRの結果を比較して、F1スコアや文字エラー率(CER)を計算する部分。
- ファイルI/O:
samples/から画像とJSONを読み込み、results/に結果のCSVやJSONを書き出す処理。 - 実行スクリプト: 全体をまとめるメイン処理で、コマンドライン引数で入力パスと出力パスを指定できるようにしてくれる。
生成されたスクリプトをscripts/ocr_benchmark.pyとして保存して、実際に実行してみたんだ。
python scripts/ocr_benchmark.py --samples samples/ --output results/
実行が終わると、results/ディレクトリに各OCRエンジンの認識精度をまとめたCSVファイルと、画像ごとの詳細結果が入ったJSONファイルが生成されてたよ。
これを見たら、「PaddleOCRは日本語の活字には強いけど、特定のレイアウトや手書き文字は苦手だな」「Suryaはレイアウト解析が優秀だけど、認識精度はちょっと落ちるな」みたいな具体的な知見が得られたんだ。Difyワークフローに組み込むOCRを選定する際も、この結果をもとに最適なエンジンを判断できたから、本当に助かったよ。
つまずきポイント
いくつかハマりやすいポイントがあるから、気をつけてね。
OCRエンジンのインストールと依存関係
Claude CodeはPythonコードを書いてくれるけど、OSレベルでのインストールまではやってくれないんだ。
- Tesseract:
pytesseractを使う場合、まずシステムにTesseract OCRエンジン自体をインストールする必要があるよ。Linuxならsudo apt install tesseract-ocr、Windowsならインストーラーを使ってね。日本語を使いたいなら言語パック(tesseract-ocr-jpnとか)も必要だよ。 - PaddleOCR: 初めて実行する時にモデルのダウンロードが走ることがあるから、少し時間がかかる場合があるよ。
スクリプトが「OCRエンジンが見つからない」みたいなエラーを出したら、これらの外部依存関係を確認してみて。
クラウドOCRのAPIキー設定
Google Document AIやAzure AI Vision、AWS TextractみたいなクラウドOCRを使うときは、APIキーや認証情報が必要になるよ。Claude Codeはコードの中にプレースホルダーを書いてくれることが多いから、そこを自分のキーに置き換えるのを忘れずにね。
環境変数で設定するのが一番スマートだよ。
import os
# ...
api_key = os.getenv("GOOGLE_DOCUMENT_AI_API_KEY")
if not api_key:
raise ValueError("GOOGLE_DOCUMENT_AI_API_KEY環境変数が設定されていません。")
# ...
正解データ(Ground Truth)の準備
ベンチマーク評価で一番時間と手間がかかるのが、実は「正解データ(Ground Truth)」の準備なんだ。これがないと、どんなに良いスクリプトがあっても比較評価ができないよ。
テストしたい帳票画像に対して、正確なテキストデータ(必要ならバウンディングボックス情報も)をJSON形式で手作業で作るのは大変だよね。既存のデータセットを使ったり、半自動でアノテーションできるツールを使ったりして効率化するのを検討してみて。質の高いGround Truthが、評価の信頼性を決めるから、ここだけは手を抜かないでね。