オープンソース OCR モデルガイド – 現代のビジョン・ランゲージ OCR の選択、実行、拡張
TL;DR
Hugging Face は、最新のオープンソース OCR モデルをカタログ化し、その強み(多言語サポート、レイアウト認識、出力フォーマット)を説明し、ベンチマークでの評価方法を示し、ローカルおよびリモート推論のためのすぐに使えるツールを提供するガイドをリリースしました。
1. 現代の OCR の全体像 – 今日のモデルができること
1.1 基本機能
- Transcription – 手書きテキスト、複数のスクリプト(ラテン文字、アラビア文字、日本語) 、数式、化学式、ページ番号タグを処理します。
- Complex Document Elements – 画像、チャート、テーブルを認識し、座標抽出、キャプション生成、またはビジュアルデータを構造化フォーマット(HTML テーブル、Markdown テーブル、JSON)に変換できます。
- Output Formats – モデルは以下のいずれか、または複数を出力します:
- DocTag – Docling モデルで使用される XML に似たレイアウト保持マークアップ。
- HTML – デジタル再構築に適した完全な構造表現。
- Markdown – 人が読みやすいテキストで、オプションの画像キャプションを含み、LLM への入力に最適。
- JSON – テーブルやチャート用の構造化スニペット。
- Locality Awareness – 現代の OCR モデルはバウンディングボックスの「アンカー」メタデータを埋め込み、読順を保持し、幻覚を減少させます。
- Prompting – 一部のモデル(例:
granite-docling)は "Convert this formula to LaTeX" のようなタスク切替プロンプトをサポートし、他のモデルは固定システムプロンプトで条件付けられます。
1.2 適切なフォーマットの選択
| ユースケース | 推奨出力 |
|---|---|
| デジタル再構築 | DocTag または HTML |
| LLM 主導の Q&A | キャプション付き Markdown |
| プログラムによる分析 | テーブル/チャート用 JSON |
2. 最先端オープン OCR モデル
2.1 モデル比較スナップショット
| モデル | 出力 | 主な特徴 | サイズ | 多言語対応? | 平均 OlmOCR‑Bench スコア |
|---|---|---|---|---|---|
| Nanonets‑OCR2‑3B | Markdown + HTML テーブル | キャプション、透かし抽出、チェックボックス、フローチャート | 4 B | ✅ (EN, ZH, FR, AR, …) | N/A |
| PaddleOCR‑VL | Markdown、JSON、HTML | 手書き、古い文書、プロンプト対応、画像挿入 | 0.9 B | ✅ (109 languages) | N/A |
| dots.ocr | Markdown、JSON | グラウンディング、画像挿入、手書き | 3 B | ✅ (multilingual) | 79.1 ± 1.0 |
| OlmOCR‑2 | Markdown、HTML、LaTeX | グラウンディング、バッチ最適化 | 8 B | ❌ (English only) | 82.3 ± 1.1 |
| Granite‑Docling‑258M | DocTag | プロンプトベースのタスク切替、位置トークン | 258 M | ✅ (EN, JA, AR, ZH) | N/A |
| DeepSeek‑OCR | Markdown、HTML | 汎用ビジュアル理解、手書き、メモリ効率 | 3 B | ✅ (~100 languages) | 75.4 ± 1.0 |
| Chandra | Markdown、HTML、JSON | グラウンディング、画像抽出 | 9 B | ✅ (40+ languages) | 83.1 ± 0.9 |
| Qwen3‑VL | すべてのフォーマット(プロンプト経由) | 古文、手書き、画像挿入 | 9 B | ✅ (32 languages) | N/A |
Note: スコアは英語のみの OlmOCR ベンチマークで評価されたモデルカードから取得しています。
2.2 評価ベンチマーク
- OmniDocBenchmark – 書籍、雑誌、教科書など多様な文書タイプを対象とし、HTML/Markdown テーブルを受け入れ、編集距離とツリー編集指標を使用します。
- OlmOCR‑Bench – 英語 PDF に焦点を当てたユニットテスト形式の評価で、テーブルセルの関係やその他のレイアウト要素をチェックします。
- CC‑OCR (Multilingual) – 英語・中国語以外のデータを含む唯一のベンチマークで、文書品質は低めですが多言語のサニティチェックに有用です。
Recommendation: ベンチマークカバレッジがユースケースを必ずしも反映しない可能性があるため、導入前に小規模かつドメイン固有のデータセットでモデルをテストしてください。
3. コスト効率の考慮事項
- パラメータ数は <1 B(PaddleOCR‑VL)から 9 B(Chandra、Qwen3‑VL)まで幅があります。
- 推論コストは最適化ランタイム(vLLM、SGLang)とハードウェア価格に大きく依存します。例: OlmOCR‑2 を H100($2.69/h)で実行すると、100 万ページあたり約 US$178 かかります。
- 量子化バリアントやバッチ処理スクリプトを使用すれば、ページあたりのコストをさらに削減でき、スケール時には多くのクローズドソース代替品よりもオープンモデルの方が安価になります。
4. 入門 – モデルの実行
4.1 vLLM を用いたローカル推論
vllm serve nanonets/Nanonets-OCR2-3B
from openai import OpenAI
import base64
client = OpenAI(base_url="http://localhost:8000/v1")
model = "nanonets/Nanonets-OCR2-3B"
def encode_image(path):
with open(path, "rb") as f:
return base64.b64encode(f.read()).decode()
def infer(img_b64):
resp = client.chat.completions.create(
model=model,
messages=[{"role": "user", "content": [{"type": "image_url", "image_url": {"url": f"data:image/png;base64,{img_b64}"}}, {"type": "text", "text": "Extract the text from the above document as if you were reading it naturally."}] }],
temperature=0.0,
max_tokens=15000,
)
return resp.choices[0].message.content
print(infer(encode_image("/path/to/doc.png")))
4.2 Transformers API の例
from transformers import AutoProcessor, AutoModelForImageTextToText
model = AutoModelForImageTextToText.from_pretrained(
"nanonets/Nanonets-OCR2-3B",
torch_dtype="auto",
device_map="auto",
attn_implementation="flash_attention_2",
)
processor = AutoProcessor.from_pretrained("nanonets/Nanonets-OCR2-3B")
prompt = "Extract the text ..." # see blog for full prompt
image = Image.open("doc.png")
messages = [{"role": "system", "content": "You are a helpful assistant."},
{"role": "user", "content": [{"type": "image", "image": image}, {"type": "text", "text": prompt}]}]
text = processor.apply_chat_template(messages, tokenize=False, add_generation_prompt=True)
inputs = processor(text=[text], images=[image], padding=True, return_tensors="pt").to(model.device)
output_ids = model.generate(**inputs, max_new_tokens=15000, do_sample=False)
print(processor.batch_decode(output_ids, skip_special_tokens=True)[0])
4.3 Apple Silicon と MLX‑VLM
pip install -U mlx-vlm
python -m mlx_vlm.generate \
--model ibm-granite/granite-docling-258M-mlx \
--max-tokens 4096 \
--temperature 0.0 \
--prompt "Convert this chart to JSON." \
--image chart.png
4.4 Hugging Face Inference Endpoints を用いたマネージドデプロイ
- モデルページを開く(例:
nanonets/Nanonets-OCR2-3B)。 - Deploy → HF Inference Endpoints をクリック。
- GPU サイズを設定。エンドポイントは数分で利用可能になります。
- 上記と同じ OpenAI クライアントスニペットを使用し、エンドポイント URL を指すようにします。
5. バッチジョブでのスケーリング
Hugging Face Jobs と uv-scripts/ocr リポジトリを組み合わせることで、GPU を所有せずに数千枚の画像に対して OCR を実行できます。
hf jobs uv run --flavor l4x1 \
https://huggingface.co/datasets/uv-scripts/ocr/raw/main/nanonets-ocr.py \
your-input-dataset your-output-dataset \
--max-samples 100
スクリプトは自動的に vLLM バッチ処理を行い、OCR 結果を新しい markdown 列として書き戻します。
6. 純粋な OCR を超えて – ドキュメント AI 拡張
6.1 ビジュアルドキュメント検索
- テキストクエリから直接上位 k 件の PDF を取得します。
- VLM と組み合わせてマルチモーダル RAG パイプラインを構築できます(ブログでリンクされている ColPali + Qwen2 VL ノートブック参照)。
- シングルベクトル(メモリ効率)またはマルチベクトル(リコール向上)モデルを選択できます。ほとんどがエンドポイント対応です。
6.2 ドキュメント QA のためのビジョン・ランゲージモデル
- まずテキストに変換する代わりに、元の文書画像と質問を Qwen3‑VL などの VLM に入力します。
- これにより、テーブル、図、キャプションといったレイアウトコンテキストが保持され、LLM のみのパイプラインで失われがちな情報を補完できます。
7. オープンデータセット – 将来のモデルの燃料
- olmOCR‑mix‑0225 (AllenAI) – 70 以上の Hub モデルの学習に使用。
isl_synthetic_ocrのような合成パイプライン。- ヒューリスティックでフィルタリングされた VLM 生成文字起こし。
- ドメイン固有の修正コーパス(例: Medical History of British India)を再利用して学習データにできます。
8. 終わりに
Hugging Face のガイドは、OCR モデル選択のための明確な意思決定マトリックス、具体的なベンチマーク参照、コスト分析、ローカルおよびクラウドで即座に実行できるツールを提供します。オープンウェイトモデルと公開データセットを活用することで、プライバシーを保護しつつスケーラブルな文書理解パイプラインを構築でき、プロプライエタリサービスに依存する必要がなくなります。
さらに読む
- ビジョン・ランゲージモデルの解説
- ビジョン・ランゲージモデル 2025 アップデート
- PP‑OCR‑v5 ブログ
- Grounded OCR での Kosmos2.5 ファインチューニング(ノートブック)
- DocVQA での Florence‑2 ファインチューニング(ノートブック)
- Core ML と
dots.ocrを用いたデバイス上 SOTA OCR