オープンソース 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 を用いたマネージドデプロイ

  1. モデルページを開く(例: nanonets/Nanonets-OCR2-3B)。
  2. Deploy → HF Inference Endpoints をクリック。
  3. GPU サイズを設定。エンドポイントは数分で利用可能になります。
  4. 上記と同じ 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

Sources