开源 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 推理端点进行托管部署

  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 文档问答的视觉语言模型

  • 与其先转换为文本,不如将原始文档图像和问题直接输入 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