Hugging Face 发布开源 OCR 模型选型指南
Supercharge your OCR Pipelines with Open Models
Hugging Face 发布开源 OCR 模型指南,并新增 Chandra 和 OlmOCR-2 及其在 OlmOCR Benchmark 上的分数(Chandra 83.1±0.9,OlmOCR-2 82.3±1.1)。
这篇指南梳理了主流开源 OCR 模型的能力、输出格式与成本对比,并给出按使用场景选型的具体方法。
我们已将 Chandra 和 OlmOCR-2 添加到本博客中,并附上了这些模型的 OlmOCR 分数 🫡
TL;DR:强大的视觉语言模型的兴起改变了文档 AI。每个模型都有其独特的优势,因此选择合适的模型并非易事。开放权重模型具有更好的成本效益和隐私性。为了帮助你开始使用它们,我们整理了这份指南。
在本指南中,你将了解到:
- 当前模型的格局及其能力
- 何时微调模型 vs. 直接使用开箱即用的模型
- 为你的用例选择模型时需要考虑的关键因素
- 如何通过多模态检索和文档问答超越 OCR
读到最后,你将知道如何选择合适的 OCR 模型、开始用它构建应用,并对文档 AI 获得更深入的见解。让我们开始吧!
目录
现代 OCR 简介
光学字符识别(OCR)是计算机视觉中最早且持续时间最长的挑战之一。AI 的许多首批实际应用都专注于将印刷文本转换为数字形式。
随着视觉语言模型(VLM)的激增,OCR 取得了显著进步。最近,许多 OCR 模型都是通过微调现有的 VLM 开发出来的。但如今的能力已远超 OCR:你可以通过查询检索文档,或直接针对文档提问。得益于更强大的视觉功能,这些模型还能处理低质量扫描件,解读表格、图表和图像等复杂元素,并将文本与视觉信息融合,以回答跨文档的开放式问题。
模型能力
转录
最新的模型可将文本转录为机器可读格式。
输入可以包括:
- 手写文本
- 拉丁文、阿拉伯文和日文字符等各种文字
- 数学表达式
- 化学式
- 图像/布局/页码标签
OCR 模型将它们转换为机器可读文本,格式多种多样,如 HTML、Markdown 等。
处理文档中的复杂组件
除文本外,一些模型还能识别:
- 图像
- 图表
- 表格
一些模型知道图像在文档中的位置,提取其坐标,并将其适当地插入文本之间。其他模型则为图像生成说明文字,并插入到它们出现的位置。如果你要将机器可读输出输入到 LLM 中,这尤其有用。示例模型有 AllenAI 的 OlmOCR,或 PaddlePaddle 的 PaddleOCR-VL。
模型使用不同的机器可读输出格式,例如 DocTags、HTML 或 Markdown(将在下一节 Output Formats 中说明)。模型处理表格和图表的方式通常取决于它们所使用的输出格式。有些模型将图表视为图像:原样保留。其他模型则将图表转换为 markdown 表格或 JSON,例如,条形图可以按如下方式转换。
同样地,对于表格,单元格会被转换为机器可读格式,同时保留来自标题和列的上下文。
输出格式
不同的 OCR 模型有不同的输出格式。简而言之,以下是现代模型使用的常见输出格式。
DocTag:DocTag 是一种类似 XML 的文档格式,用于表达位置、文本格式、组件级信息等。下面是一篇论文被解析为 DocTags 的示意图。这种格式被开源的 Docling 模型所采用。
- HTML:HTML 是用于文档解析的最流行的输出格式之一,因为它能正确地编码结构和层级信息。
- Markdown:Markdown 是最便于人类阅读的格式。它比 HTML 更简单,但表达力不如 HTML。例如,它无法表示分栏表格。
- JSON:JSON 并不是模型用于整个输出的格式,但它可用于表示表格或图表中的信息。
合适的模型取决于你计划如何使用其输出:
- 数字重建:要以数字方式重建文档,请选择具有保留布局格式的模型(例如 DocTags 或 HTML)。
- LLM 输入或问答:如果用例涉及将输出传递给 LLM,请选择输出 Markdown 和图像说明文字的模型,因为它们更接近自然语言。
- 程序化使用:如果你想将输出传递给程序(例如数据分析),请选择能生成 JSON 等结构化输出的模型。
位置感知
文档可能具有复杂的结构,例如多栏文本块和浮动图形。较旧的 OCR 模型处理这些文档的方式是检测单词,然后在后处理中手动进行页面布局,以便按阅读顺序呈现文本,这种方式很脆弱。另一方面,现代 OCR 模型会纳入布局元数据,以帮助保持阅读顺序和准确性。这种元数据被称为“anchor”,它可以以边界框的形式出现。这个过程也被称为“grounding/anchoring”,因为它有助于减少幻觉。
模型提示
OCR 模型可以接收图像和可选的文本提示,这取决于模型架构和预训练设置。
一些 OCR 模型支持基于提示的任务切换,例如 granite-docling 可以用提示“Convert this page to Docling”解析整个页面,同时它也可以接收诸如“Convert this formula to LaTeX”之类的提示以及一整页公式。
然而,其他模型仅针对解析整个页面进行训练,它们通过系统提示被条件化为执行此任务。
例如,OlmOCR by AllenAI 接收一个很长的条件提示。与许多其他模型一样,OlmOCR 在技术上是一个经过 OCR 微调的 VLM(此处为 Qwen2.5VL),因此你可以提示它执行其他任务,但其性能将无法与 OCR 能力相媲美。
前沿开源 OCR 模型
过去一年,我们见证了新模型涌现的惊人浪潮。由于大量工作都在开放环境中进行,这些参与者相互借鉴、彼此受益。一个很好的例子是 AllenAI 发布的 OlmOCR,它不仅发布了模型,还发布了用于训练它的数据集。有了这些,其他人可以在新的方向上基于它们继续构建。这个领域异常活跃,但要用哪个模型并不总是那么显而易见。
比较最新模型
为了让事情稍微简单一些,我们整理了一份当前我们最喜欢的一些模型的非详尽比较。下面所有模型都能感知布局,可以解析表格、图表和数学公式。每个模型支持的语言完整列表详见于其模型卡,如果你感兴趣,请务必查看。下面所有模型都采用开源许可证,除了 Chandra 采用 OpenRAIL 许可证,而 Nanonets 的许可证尚不明确。平均分数取自 Chandra、OlmOCR 的模型卡,在 OlmOCR Benchmark 上评估,该基准仅限英语。 这个集合中的许多模型都是从 Qwen2.5-VL 或 Qwen3-VL 微调而来,因此我们也在下面提供了 Qwen3-VL 模型。
| 模型名称 | 输出格式 | 特性 | 模型大小 | 多语言? | OlmOCR Benchmark 上的平均分数 |
|---|---|---|---|---|---|
| Nanonets-OCR2-3B | 带语义标记的结构化 Markdown(外加 HTML 表格等) | 为文档中的图像生成说明文字 签名与&水印提取 处理复选框、流程图和手写内容 |
4B | ✅支持英语、中文、法语、阿拉伯语等。 | 不适用 |
| PaddleOCR-VL | Markdown、JSON、HTML 表格和图表 | 处理手写内容、旧文档 允许提示 将表格和&图表转换为 HTML 直接提取并插入图像 |
0.9B | ✅支持 109 种语言 | 不适用 |
| dots.ocr | Markdown、JSON | 定位 提取并插入图像 处理手写内容 |
3B | ✅多语言,但语言信息不可用 | 79.1 ± 1.0 |
| OlmOCR-2 | Markdown、HTML、LaTeX | 定位 针对大规模批处理优化 |
8B | ❎仅限英语 | 82.3 ± 1.1 |
| Granite-Docling-258M | DocTags | 基于提示的任务切换 能够用位置标记提示元素位置 丰富输出 |
258M | ✅支持英语、日语、阿拉伯语和中文。 | 不适用 |
| DeepSeek-OCR | Markdown、HTML | 支持通用视觉理解 可以将所有图表、表格等解析并重新渲染为 HTML 处理手写内容 内存高效,通过图像解决文本 |
3B | ✅支持近 100 种语言 | 75.4 ± 1.0 |
| Chandra | Markdown、HTML、JSON | 定位 按原样提取并插入图像 |
9B | ✅支持 40 多种语言 | 83.1 ± 0.9 |
| Qwen3-VL | 视觉语言模型可以输出所有格式 | 可以识别古代文本 处理手写内容 按原样提取并插入图像 |
9B | ✅支持 32 种语言 | 不适用 |
虽然 Qwen3-VL 本身是一个强大且多才多艺的视觉语言模型,经过后训练用于文档理解和其他任务,但它并未针对单一、通用的 OCR 提示进行优化。相比之下,其他模型是使用一个或几个专为 OCR 任务设计的固定提示进行微调的。因此,要使用 Qwen3-VL,我们建议尝试不同的提示。
这里有一个小型演示,供你试用一些最新模型并比较它们的输出。
评估模型
基准测试
没有单一的最佳模型,因为每个问题的需求各不相同。表格应该用 Markdown 还是 HTML 渲染?我们应该提取哪些元素?如何量化文本准确率和错误率?👀
虽然有很多评估数据集和工具,但很多都无法回答这些问题。因此我们建议使用以下基准:
- OmniDocBenchmark:这个被广泛使用的基准以其多样化的文档类型而著称:书籍、杂志和教科书。它的评估标准设计得很好,同时接受 HTML 和 Markdown 格式的表格。一种新颖的匹配算法评估阅读顺序,公式在评估前会被规范化。大多数指标依赖于编辑距离或树编辑距离(表格)。值得注意的是,用于评估的标注并非完全由人工生成,而是通过 SoTA VLM 或传统 OCR 方法获取的。
- OlmOCR-Bench:OlmOCR-Bench 采取了不同的方法:他们将评估视为一组单元测试。例如,表格评估是通过检查给定表格中所选单元格之间的关系来完成的。他们使用来自公开来源的 PDF,标注则使用各种闭源 VLM 完成。这个基准在英语评估上相当成功。
- CC-OCR(多语言):与之前的基准相比,CC-OCR 在选择模型时不太受青睐,因为文档质量和多样性较低。然而,它是唯一一个包含英语和中文之外评估的基准!虽然评估远非完美(图像是文字很少的照片),但它仍然是多语言评估中你能做到的最好选择。
在测试不同的 OCR 模型时,我们发现不同文档类型、语言等之间的性能差异很大。你的领域在现有基准中可能没有得到很好的体现!为了有效利用这一代基于 VLM 的新型 OCR 模型,我们建议收集一个包含你任务领域代表性示例的数据集,并测试几个不同的模型来比较它们的性能。
成本效益
大多数 OCR 模型都很小,参数量在 3B 到 7B 之间;你甚至可以找到参数量少于 1B 的模型,比如 PaddleOCR-VL。然而,成本还取决于是否有针对专用推理框架的优化实现。例如,OlmOCR-2 附带了 vLLM 和 SGLang 实现,每百万页的成本为 178 美元(假设在 H100 上,每小时 2.69 美元)。DeepSeek-OCR 可以在单张 40GB 显存的 A100 上每天处理 20 万页以上。粗略计算一下,我们发现每百万页的成本与 OlmOCR 大致相似(尽管这取决于你的 A100 提供商)。如果你的用例不受影响,你也可以选择模型的量化版本。运行开源模型的成本很大程度上取决于实例的每小时成本以及模型包含的优化,但在更大规模上,它肯定比市面上许多闭源模型更便宜。
开放 OCR 数据集
虽然过去一年开放 OCR 模型激增,但开放的训练和评估数据集却没有同样多。一个例外是 AllenAI 的 olmOCR-mix-0225,它已被用于训练 Hub 上至少 72 个模型——可能更多,因为并非所有模型都会记录其训练数据。
共享更多数据集可以为开放 OCR 模型带来更大的进步。有几种有前景的方法可以创建这些数据集:
- 合成数据生成(例如 isl_synthetic_ocr)
- VLM 生成的转录文本,通过人工或启发式方法过滤
- 使用现有 OCR 模型为新模型生成训练数据,这些新模型在特定领域可能更高效
- 利用现有的已校正数据集,如 Medical History of British India Dataset,其中包含对历史文档进行大量人工校正的 OCR
值得注意的是,许多此类数据集已经存在但未被使用。将它们作为“可直接用于训练”的数据集更广泛地提供,对开源社区具有相当大的潜力。
运行模型的工具
我们收到了许多关于如何开始使用 OCR 模型的问题,因此这里介绍几种使用本地推理工具以及通过 Hugging Face 远程托管的方法。
本地
大多数前沿模型都支持 vLLM 并提供了 transformers 实现。你可以从模型自己的卡片中获取有关如何为每个模型提供服务的更多信息。为方便起见,我们在此展示如何使用 vLLM 在本地进行推理。下面的代码可能因模型而异,但对大多数模型来说大致如下。
vllm serve nanonets/Nanonets-OCR2-3B
然后你可以使用例如 OpenAI 客户端进行如下查询。
from openai import OpenAI
import base64
client = OpenAI(base_url="http://localhost:8000/v1")
model = "nanonets/Nanonets-OCR2-3B"
def encode_image(image_path):
with open(image_path, "rb") as image_file:
return base64.b64encode(image_file.read()).decode("utf-8")
def infer(img_base64):
response = client.chat.completions.create(
model=model,
messages=[
{
"role": "user",
"content": [
{
"type": "image_url",
"image_url": {"url": f"data:image/png;base64,{img_base64}"},
},
{
"type": "text",
"text": "Extract the text from the above document as if you were reading it naturally.",
},
],
}
],
temperature=0.0,
max_tokens=15000
)
return response.choices[0].message.content
img_base64 = encode_image(your_img_path)
print(infer(img_base64))
Transformers
Transformers 提供了标准的模型定义,便于推理和微调。transformers 中可用的模型带有官方 transformers 实现(库内的模型定义)或“远程代码”实现。后者由模型所有者定义,以便轻松将模型加载到 transformers 接口中,因此你无需深入了解模型实现。下面是一个使用 transformers 实现加载 Nanonets 模型的示例。
# make sure to install flash-attn and transformers
from transformers import AutoProcessor, AutoModelForImageTextToText
model = AutoModelForImageTextToText.from_pretrained(
"nanonets/Nanonets-OCR2-3B",
torch_dtype="auto",
device_map="auto",
attn_implementation="flash_attention_2"
)
model.eval()
processor = AutoProcessor.from_pretrained("nanonets/Nanonets-OCR2-3B")
def infer(image_url, model, processor, max_new_tokens=4096):
prompt = """Extract the text from the above document as if you were reading it naturally. Return the tables in html format. Return the equations in LaTeX representation. If there is an image in the document and image caption is not present, add a small description of the image inside the <img></img> tag; otherwise, add the image caption inside <img></img>. Watermarks should be wrapped in brackets. Ex: <watermark>OFFICIAL COPY</watermark>. Page numbers should be wrapped in brackets. Ex: <page_number>14</page_number> or <page_number>9/22</page_number>. Prefer using ☐ and ☑ for check boxes."""
image = Image.open(image_path)
messages = [
{"role": "system", "content": "You are a helpful assistant."},
{"role": "user", "content": [
{"type": "image", "image": image_url},
{"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=max_new_tokens, do_sample=False)
generated_ids = [output_ids[len(input_ids):] for input_ids, output_ids in zip(inputs.input_ids, output_ids)]
output_text = processor.batch_decode(generated_ids, skip_special_tokens=True, clean_up_tokenization_spaces=True)
return output_text[0]
result = infer(image_path, model, processor, max_new_tokens=15000)
print(result)
MLX
MLX 是面向 Apple Silicon 的开源机器学习框架。MLX-VLM 构建在 MLX 之上,便于轻松服务视觉语言模型。你可以在这里探索所有以 MLX 格式提供的 OCR 模型。它们也提供量化版本。
你可以按如下方式安装 MLX-VLM。
pip install -U mlx-vlm
wget https://huggingface.co/datasets/merve/vlm_test_images/resolve/main/throughput_smolvlm.png
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 throughput_smolvlm.png
远程
用于托管部署的 Inference Endpoints
你可以在 Hugging Face Inference Endpoints 上部署兼容 vLLM 或 SGLang 的 OCR 模型,既可以通过模型仓库的“Deploy”选项,也可以直接通过 Inference Endpoints 界面。Inference Endpoints 在完全托管的环境中提供前沿模型,具备 GPU 加速、自动扩缩容和监控,无需手动管理基础设施。
以下是使用 vLLM 作为推理引擎部署 nanonets 的简单方法。
- 导航到模型仓库
nanonets/Nanonets-OCR2-3B - 点击“Deploy”按钮并选择“HF Inference Endpoints”
- 在几秒钟内配置部署设置
- 端点创建后,你可以使用我们在上一节中提供的 OpenAI 客户端代码片段来调用它。
你可以在这里了解更多相关信息。
使用 Hugging Face Jobs 进行批量推理
对于许多 OCR 应用,你希望进行高效的批量推理,即以尽可能低成本和高效的方式在数千张图像上运行模型。一个不错的方法是使用 vLLM 的离线推理模式。如上所述,许多近期基于 VLM 的 OCR 模型都受到 vLLM 支持,它能够高效地对图像进行批处理并大规模生成 OCR 输出。
为了让这更加简单,我们创建了 uv-scripts/ocr,这是一组可直接运行的 OCR 脚本,可与 Hugging Face Jobs 配合使用。这些脚本让你无需自己的 GPU 即可在任何数据集上运行 OCR。只需将脚本指向你的输入数据集,它就会:
- 使用多种不同的开源 OCR 模型处理数据集列中的所有图像
- 将 OCR 结果作为新的 markdown 列添加到数据集中
- 将带有 OCR 结果的更新数据集推送到 Hub
例如,要对 100 张图像运行 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 无需基础设施设置即可使用。
超越 OCR
如果你感兴趣的是文档 AI,而不仅仅是 OCR,以下是我们的一些建议。
视觉文档检索器
视觉文档检索是在给定文本查询时检索最相关的 top-k 文档。如果你以前使用过检索器模型,区别在于你直接在 PDF 堆栈上进行搜索。除了单独使用它们之外,你还可以将它们与视觉语言模型结合来构建多模态 RAG 流水线(了解如何操作见此处)。你可以在 Hugging Face Hub 上找到所有这些模型。
视觉文档检索器有两种类型:单向量和多向量模型。单向量模型更节省内存但性能较低;而多向量模型更耗内存但性能更高。这些模型大多通常带有 vLLM 和 transformers 集成,因此你可以使用它们对文档进行索引,然后使用向量数据库轻松进行搜索。
使用视觉语言模型进行文档问答
如果你手头的任务只需要基于文档回答问题,你可以使用一些在训练任务中包含文档任务的视觉语言模型。我们观察到用户尝试将文档转换为文本并将输出传递给 LLM,但如果你的文档布局复杂,并且转换后的文档以 HTML 输出图表等,或者图像被错误地添加了标题,LLM 就会遗漏信息。相反,将你的文档和查询提供给像 Qwen3-VL 这样的先进视觉语言模型之一,以免遗漏任何上下文。
总结
在这篇博客文章中,我们想为你概述如何选择 OCR 模型、现有的前沿模型和能力,以及帮助你入门 OCR 的工具。
如果你想了解更多关于 OCR 和视觉语言模型的信息,我们鼓励你阅读以下资源。
来源:Hugging Face:Blog · huggingface.co




