開源 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 部署
- 開啟模型頁面(例如
nanonets/Nanonets-OCR2-3B)。 - 點選 Deploy → HF Inference Endpoints。
- 設定 GPU 規格;端點數分鐘內即可啟動。
- 使用前述 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