Datalab Indra 实测:1M 参数 OCR 模型在 CPU 上跑出每秒 49 页

Datalab Indra 实测:1M 参数 OCR 模型在 CPU 上跑出每秒 49 页

一百万参数之外还有什么

Datalab 于 2026 年 10 月 13 日发布 Indra OCR。标题中的 1M 指文字识别模型规模,不代表整个安装包只有一百万参数。实际流水线还包含方向、倾斜、行检测、版面分块和阅读顺序等组件,运行时依赖 ONNX Runtime、OpenCV 与 pypdfium2,不依赖 PyTorch。

Indra 会优先读取数字 PDF 可用的文本层,对缺失或不可用的内容再做 OCR。它能输出 Markdown、纯文本或 JSON;JSON 中包含行框、置信度、版块标签、阅读顺序、来源和分阶段耗时。默认移除页眉页脚,--keep-furniture 可保留。这个混合策略是速度的重要来源,因此不能把默认模式的成绩等同于纯图像识别成绩。

官方实测数据怎样复核

49 页每秒的准确数字是 49.4 页每秒。官方在同一台无 GPU 的 AMD EPYC x86 机器上处理 300 个 OmniParseBench 页面,每个核心运行一个单线程工作进程,使用 OCR 模式和默认设置;32 核结果是三次运行均值,而且不含模型加载。把加载计入一个 300 页短任务后,吞吐下降到 37.7 页每秒。

核心数扩展数据为 4 核 7.3 页每秒、8 核 14.2、16 核 27.2、32 核 49.4。相同条件下,PaddleOCR PP-OCRv6 small 为 4.28 页每秒,Tesseract 5 为 2.92,官方计算的倍率分别是 11.5 倍和 16.9 倍。这是项目方可复现数据,不应写成所有 CPU 都能达到 49 页每秒。

准确率测试使用 OmniParseBench 的 2937 页和 16288 个通过或失败测试。默认文本层加 OCR 模式总分 62.1、文本 41.3、表格 56.4、版面 88.6,中位延迟 228 毫秒。关闭文本层后的纯 OCR 文本分数为 33.5,低于 PP-OCR 文本模型的 35.8,但速度仍明显更快。这一差异说明混合文档与扫描件要分开评估。

业务复测可以把样本按数字 PDF、清晰扫描件、倾斜照片、表格和手写页分层,每层至少记录成功页数、字符错误、结构保留率和每页耗时。吞吐测试应先完成一次预热,再同时报告冷启动与稳态结果。还要固定 DPI、核心数和进程数,因为提高渲染分辨率会增加前处理成本,多进程过多也可能争抢内存带宽。中文票据还应单独统计数字、日期和金额字段的准确率。只有测试集构成与参数公开,结果才可横向比较。

安装与命令复现

下面流程会在首次运行时从 Hugging Face 下载模型,适合 Python 3.10 及以上环境。官方仓库测试了 Linux x86_64、Linux aarch64 和 Apple Silicon macOS;Windows 未列入已测试平台,生产采用前应自行验证多进程行为。

python -m venv .venvsource .venv/bin/activate
pip install indra-ocr
indra-ocr paper.pdf
indra-ocr "docs/*.pdf" --out results/
indra-ocr scan.png --format json > scan.json

Windows PowerShell 激活命令应替换为 .venv\Scripts\Activate.ps1。如果启用数学识别,可添加 --math;该模式会额外下载模型,32 核吞吐约降到每秒 30 页,表格分数也可能因数字被识别成公式而下降。

Python 批处理代码

下面代码使用官方 convert_many 接口并让程序按可用核心派生工作进程。入口保护在 Windows 和 macOS 上不可省略,否则库会退回单进程并给出警告。

import indra_ocrif __name__ == "__main__":files = ["invoice-a.pdf", "invoice-b.pdf"]for path, result in indra_ocr.convert_many(files, cores=None):if isinstance(result, indra_ocr.InputError):print(path, "读取失败")continuefor page_no, page in result:print(path, page_no, page.source, page.timings["total_ms"])print(page.markdown[:120])

单文档低延迟调用可以先加载转换器,避免每页重复初始化。

import indra_ocrconverter = indra_ocr.load(threads=4, mode="auto")for page_no, page in converter.convert("paper.pdf"):print(page_no, page.markdown)

适用脚本与结构化输出

对扫描件和图片,官方列出的 OCR 脚本包括拉丁、西里尔、希腊、天城、孟加拉以及简繁中文;数字 PDF 只要文本层可读,则可处理更多脚本。竖排文字暂不支持,阿拉伯文、日文假名和韩文等在扫描图上也不属于当前 OCR 覆盖范围。

简单表格能保留为 HTML,但多级表头、合并单元格和无框线表格容易丢结构。手写识别约只有 8% 的 OmniParseBench 测试通过率。用于 RAG 入库时,建议把 page.source、置信度和耗时一起存储;低置信度页进入更强模型复核,而不是让所有页面都走昂贵 VLM。

许可与生产决策

代码采用 Apache-2.0,模型权重却是修改版 OpenRAIL-M。仓库说明其免费范围包括研究、个人用途以及融资或营收低于两千万美元的初创企业,并禁止与 Datalab API 竞争性使用;更广商业用途需要另行许可。部署前必须分别审查代码与权重条款,不能只看代码仓库的 Apache 标识。

Indra 的最佳场景是大量清晰印刷文档、CPU 预算明确、先追求检索可用文本的流水线。若核心目标是复杂表格、手写档案或高精度公式,应把它作为快速首层,再接专用模型。复现实验时至少记录 CPU 型号、核心数、是否包含加载、数字 PDF 占比和 OCR 模式,否则单独报告每秒 49 页没有比较价值。