夜雨聆风学习资料网

ARTICLE · 1219716

Indra OCR 教程:CPU 本地文档解析实战与 Tesseract 对比评测

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 个测试),同一台机器同一批页面跑的:

引擎
headline
text
layout
单页中位耗时
Indra OCR(auto)
66.7
46.7
92.2
212 ms
Indra OCR(--math)
71.4
62.7
92.0
357 ms
PaddleOCR PP-StructureV3
58.4
55.6
71.7
约 41 s
PaddleOCR PP-OCR 文本模型
—
35.8
—
2685 ms
Tesseract 5
—
19.3
—
5496 ms

吞吐量(同一批 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 入库这一步的成本能砍掉一大截。

相关学习资料