開源 OCR 模型指南 – 選擇、執行與擴展現代視覺語言 OCR

TL;DR

Hugging Face 發布了一份指南,目錄列出最新的開源 OCR 模型,說明它們的優勢(多語言支援、版面感知、輸出格式),展示如何在基準測試上評估它們,並提供可直接使用的本地與遠端推論工具。


1. 現代 OCR 生態 – 模型今日能做什麼

1.1 核心能力

  • Transcription – 處理手寫文字、多種文字系統(Latin、Arabic、Japanese)、數學式、化學式以及頁碼標籤。
  • Complex Document Elements – 辨識圖像、圖表與表格;可抽取座標、產生說明文字,或將視覺資料轉換為結構化格式(HTML 表格、Markdown 表格、JSON)。
  • Output Formats – 模型可輸出以下一種或多種:
    • DocTag – 類 XML 的版面保留標記,由 Docling 模型使用。
    • HTML – 完整結構化表示,適合數位重建。
    • Markdown – 人類可讀文字,支援可選的圖像說明,適合餵給 LLM。
    • JSON – 用於表格或圖表的結構化片段。
  • Locality Awareness – 現代 OCR 模型嵌入邊框「錨點」中繼資料,保留閱讀順序並減少幻覺。
  • Prompting – 部分模型(例如 granite-docling)支援任務切換提示,如 "Convert this formula to LaTeX";其他模型則以固定系統提示為條件。

1.2 選擇合適的格式

用例 首選輸出
數位重建 DocTag 或 HTML
LLM 驅動的問答 含說明文字的 Markdown
程式化分析 表格/圖表的 JSON

2. 前沿開源 OCR 模型

2.1 模型比較快照

模型 輸出 顯著特點 大小 多語言? 平均 OlmOCR‑Bench 分數
Nanonets‑OCR2‑3B Markdown + HTML tables 說明文字、浮水印提取、核取方塊、流程圖 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 All formats (via prompting) 古文、手寫、圖像插入 9 B ✅ (32 languages) N/A

註: 分數取自模型卡在僅英文的 OlmOCR 基準測試中的評估結果。

2.2 評估基準

  • OmniDocBenchmark – 多樣化文件類型(書籍、雜誌、教科書);接受 HTML/Markdown 表格;使用編輯距離與樹編輯指標。
  • OlmOCR‑Bench – 單元測試式評估,聚焦英文 PDF;檢查表格儲存格關係與其他版面元素。
  • CC‑OCR (Multilingual) – 唯一包含非英文/中文資料的基準;文件品質較低,但對多語言健全性檢查有用。

建議: 在正式採用前,先在小規模、領域特定的資料集上測試模型,因為基準覆蓋範圍未必符合你的使用情境。


3. 成本效益考量

  • 參數量從 <1 B(PaddleOCR‑VL)到 9 B(Chandra、Qwen3‑VL)不等。
  • 推論成本高度依賴最佳化執行環境(vLLM、SGLang)與硬體價格。例如:OlmOCR‑2 在 H100($2.69/h)上每百萬頁約需 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‑client 程式碼,將 base_url 指向端點 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 notebook)。
  • 可選單向向量(記憶效率)或多向量(召回率較高)模型;大多已支援端點部署。

6.2 視覺語言模型進行文件 QA

  • 不先轉成文字,而是將原始文件影像與問題一起餵給 VLM(如 Qwen3‑VL)。
  • 這樣可保留版面上下文(表格、圖示、說明),避免純 LLM 流程遺失資訊。

7. 開放資料集 – 未來模型的燃料

  • olmOCR‑mix‑0225(AllenAI)– 用於訓練超過 70 個 Hub 模型。
  • 合成管線如 isl_synthetic_ocr
  • VLM 產生的轉錄文字,經過啟發式過濾。
  • 領域特定的校正語料(例如 British India 醫療史),可重新作為訓練資料。

8. 結語

Hugging Face 的指南為實務工作者提供了清晰的決策矩陣,協助選擇 OCR 模型、參考基準、成本分析,並提供本地與雲端即用的工具。透過開放權重模型與公開資料集,團隊能建構具隱私保護、可擴展的文件理解管線,而不必依賴專有服務。


延伸閱讀

  • Vision Language Models Explained
  • Vision Language Models 2025 Update
  • PP‑OCR‑v5 Blog
  • Fine‑tuning Kosmos2.5 on Grounded OCR (notebook)
  • Fine‑tuning Florence‑2 on DocVQA (notebook)
  • SOTA OCR on‑device with Core ML and dots.ocr

Sources