ARTICLE · 1219716
Indra OCR 教程:CPU 本地文档解析实战与 Tesseract 对比评测
做 RAG 的朋友最近都在骂同一件事:知识库入库那一步,Tesseract 一页要好几秒,PaddleOCR 完整流水线一页能跑几十秒,上视觉大模型吧,又贵、又偶尔一本正经地胡说八道。做文档数字化的、批量处理发票合同的,卡的也是同一个地方:OCR 这一步,又慢又重。
一句话讲清:Indra OCR 是做 Marker 那个团队 Datalab 在 10 月 13 日刚开源的 OCR 工具,识别模型只有约 100 万参数,纯 CPU 跑,不用 PyTorch,一条命令就能把 PDF 或图片变成带版式、带阅读顺序的 Markdown。建仓 7 天攒下 680 多个 star,今天这篇把它的真实水平、十分钟上手、四个官方亲口承认的坑,一次讲透。
datalab-to/indra
它到底快在哪:先把数字摆出来
官方把基准做得相当老实,数据来自 OmniParseBench(2937 页、16288 个测试),同一台机器同一批页面跑的:
--math) | ||||
吞吐量(同一批 300 页,单核单进程):32 核 43.9 页/秒,4 核 6.2 页/秒——是 Tesseract 的 15 倍、PaddleOCR 文本模型的 10 倍。官方博客还测了不同机型,32 核在 25~51 页/秒之间浮动。
第三方也有人实测过(Medium 上一篇 8 分钟的对比):整齐英文文档上 Indra 确实领先 Tesseract 和 PaddleOCR,表格也能用;但页面倾斜 7 度之后,它的表格结构就明显吃力了。所以"快"是真的,"准"是有边界的,往下看。
诚实说一句中文表现:官方中文测试 136 项,Indra 64.0 分,PaddleOCR 中文模型 65.4,PP-StructureV3 68.4。中文识别它略输一筹,差距不大但别吹过头。
十分钟上手:真就三步
环境要求很友好:Python 3.10 以上,Linux(x86_64/aarch64)和 macOS(Apple silicon)都行,不装 PyTorch,第一次运行自动下载约 76MB 的模型。
第一步,安装:
pip install indra-ocr
第二步,转一份 PDF 试试,Markdown 直接打到终端:
indra-ocr paper.pdf # markdown 输出到终端
indra-ocr paper.pdf --format text # 纯文本,一行一条
indra-ocr scan.png --format json # 行坐标、版式块、置信度全要
第三步,批量。把一堆 PDF 丢进文件夹,一人一核并行跑,一个长 PDF 也会吃满所有核:
indra-ocr *.pdf --out results/ # 每个输入一个 .md
indra-ocr *.pdf --out results/ --cores 8
indra-ocr paper.pdf --math # 公式转 LaTeX,默认关闭
indra-ocr paper.pdf --mode ocr --timings # 强制全页 OCR 并打印耗时
还有个我很喜欢的本地调试页,版式、阅读顺序、每行的置信度都能可视化看,调参数前先看一眼:
indra-ocr-viewer --port 8765 # 打开 http://localhost:8765
文件全在你自己机器上。顺带一提,它有个很聪明的设计:电子版 PDF 会直接读文本层,只有缺失的部分才 OCR(--mode 可切 auto/ocr/text 三档),这也是它日常用起来飞快的原因之一。
viewer 打开后建议先看三样东西,十分钟就能帮你判断这工具适不适合你的文档:第一看阅读顺序线,双栏论文、左右分栏的杂志最容易在这里翻车,线走错了后面分块全错;第二看表格块的标签,简单网格表会被标成 Table,复杂表如果被拆成一堆小 Text 块,说明这份文档不适合它;第三看每行的置信度,低置信度的行集中在页眉页脚水印区是正常的,集中在正文区就是文档质量问题。--timings 参数会把每一页"走了文本层还是 OCR、每步花了多少毫秒"打到终端,调优的时候很有用。
给 RAG 入库的一条现成管线
几千页的大批量用 convert_many,多进程并行,注意 macOS 和 Windows 下要包在 if __name__ == "__main__": 里,这是官方 README 特别提醒的:
import indra_ocr
if __name__ == "__main__": # macOS / Windows 必备
for path, result in indra_ocr.convert_many(["a.pdf", "b.pdf"], cores=None):
if isinstance(result, indra_ocr.InputError):
continue # 读不了或加密的文件跳过
for i, page in result:
print(path, i, page.source)
page.source 会告诉你这一页走了文本层(text)还是 OCR,入库时可以按这个字段打质量分;page.blocks 是版式块(标题、列表、表格、脚注都有 label),按阅读顺序排好,做 chunking 时直接按块切,比按固定字数切干净得多。
从 Tesseract 迁过来的朋友注意三处习惯差异:第一,Indra 默认输出是带版式的 Markdown,不是纯文本,下游解析器要跟着改;第二,它不下载语言包,第一次运行自动从 Hugging Face 拉约 76MB 模型,内网机器记得配代理或用 --model-dir 指定本地目录;第三,工程图纸里的标注文字常被识别成小表格,超宽的横幅式页面读得很差——这类版式先用 viewer 抽查几页再决定。
Python 里调用也很顺手,JSON 输出直接喂给分块和向量化:
import indra_ocr
conv = indra_ocr.load(threads=4)
for i, page in conv.convert("paper.pdf"):
print(page.source, page.timings["total_ms"]) # 走了文本层还是 OCR
print(page.markdown) # 标题、列表、表格
page.blocks # 版式块:label、bbox、text,按阅读顺序
page.lines # 每行的坐标与置信度
先泼四盆冷水:官方亲口承认的局限
README 里有个 Limitations 章节,写得比很多竞品的宣传页都诚实,照着翻译给你:
- 复杂表格别指望
:合并单元格、跨行文字、嵌套表头、无框线表格,单元格容易串行串列。简单网格表没问题 - 手写体很弱
:手写测试只有 25.2%,潦草和淡铅笔最惨 - 破扫描件不行
:老旧褪色、低分辨率的降质扫描,29.5% - 公式默认是纯文本
:数学公式想转 LaTeX 得加 --math,而且开了之后表格分数会掉 1.5 分、速度慢约三成
再补两个实操细节:超过 1 亿像素的大页面会被降采样,小字可能丢;竖排中文它能读(整列右到左),但竖排扫描不如横排准。
到底该不该用:一张选型清单
直接用它:RAG 入库、批量文档数字化、发票合同批量抽取——干净印刷体、量大、没 GPU、要快、要 Markdown/JSON 结构化输出。
别用它:手写病历、古旧档案、复杂财报表格、公式密集的论文(除非你开 --math 且接受变慢)。这些场景去看它哥 Chandra(Datalab 自家高精度模型,走托管 API),或者老老实实上视觉大模型。
还有个 license 的坑,商用前必看:代码是 Apache 2.0 随便用,但模型权重是改版 OpenRAIL-M——研究、个人、融资或营收 2000 万美元以下的初创免费,且不能拿来跟官方 API 竞争。大公司法务先过一遍再上生产。
一句话收尾:如果你现在的 OCR 链路是"Tesseract 凑合用",Indra 值得花十分钟替换试试;Python 里 indra_ocr.load 加 convert_many 就是现成的批量管线,RAG 入库这一步的成本能砍掉一大截。















































































