开源 OCR 模型指南 – 选择、运行与扩展现代视觉语言 OCR
TL;DR
Hugging Face 发布了一份指南,列举了最新的开源 OCR 模型,解释了它们的优势(多语言支持、布局感知、输出格式),展示了如何在基准上评估它们,并提供了可直接使用的本地和远程推理工具。
1. 现代 OCR 生态 – 模型今日能做的事
1.1 核心能力
- Transcription – 处理手写文本、多种文字(拉丁文、阿拉伯文、日文)、数学表达式、化学式以及页码标签。
- 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)和硬件定价。例如:在 H100($2.69/小时)上运行 OlmOCR‑2 的成本约为每百万页 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 推理端点进行托管部署
- 打开模型页面(例如
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 文档问答的视觉语言模型
- 与其先转换为文本,不如将原始文档图像和问题直接输入 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