做文档处理的兄弟们,应该都经历过 Tesseract 的折磨:CPU 单核跑满,风扇狂转,结果出来的单页耗时还在秒级。后来 PaddleOCR 出来了,效果确实好,但那个复杂的依赖树和模型转换流程,有时候真让人头大。
Surya 的出现,走的是一条**“纯粹的深度学习工程化”**路线。它不是对传统 OCR 的修补,而是基于 Transformer(Segformer)重构了整个流水线。
1. 核心差异:它为什么快?
很多 OCR 慢,是因为它们是“逐字”或者“逐行”串行处理的。
Surya 的底座是 PyTorch。这意味着它天生就是为 GPU 批处理(Batching) 设计的。
- Tesseract:典型的 CPU 密集型,并行化很难,只能靠多进程(Multiprocessing)硬堆。
- Surya:将图像扔进 Tensor,直接在显存里并发计算。
所谓的“快 4 倍”,其实是在 GPU 环境下的对比。如果你在纯 CPU 环境跑,Surya 的优势在于它的模型结构更现代(Segformer),对于并行指令集的利用率更高。
2. 杀手锏:阅读顺序与行检测
做 RAG(检索增强生成)最怕什么?最怕 PDF 是双栏排版的。 普通 OCR 经常会跨栏识别,把左边一行的后半截拼到右边一行的前半截,出来的文字完全是乱序的。
Surya 在训练时就引入了 Reading Order(阅读顺序) 的预测。它不仅仅是识字,它还能吐出每个文本块的 bbox 以及它们在人类阅读逻辑中的顺序。
3. 代码实战:跑起来看看
Surya 的 API 设计非常 Pythonic,没有那么多复杂的 Config 对象。
安装: 注意,因为它依 PyTorch,建议先装好对应 CUDA 版本的 Torch。
Bash
pip install surya-ocr
基础文字识别(OCR):
Python
from PIL import Image
from surya.ocr import run_ocr
from surya.model.detection import segformer
from surya.model.recognition.model import load_model
from surya.model.recognition.processor import load_processor
# 1. 加载模型
# 第一次运行会自动从 HuggingFace 下载权重
det_processor, det_model = segformer.load_processor(), segformer.load_model()
rec_model, rec_processor = load_model(), load_processor()
# 2. 读取图片
image = Image.open("benchmark_doc.jpg")
# 3. 执行预测
# langs=["en"] 只是提示,实际上它是多语言通用的
predictions = run_ocr([image], [["en"]], det_model, det_processor, rec_model, rec_processor)
# 4. 解析结果
for idx, line in enumerate(predictions[0].text_lines):
print(f"Line {idx}: {line.text}")
print(f"Box: {line.bbox}") # [x1, y1, x2, y2]
行检测与阅读顺序(这是它的强项):
如果你只想要布局信息(比如做版面分析),可以只跑检测模型,速度极快。
Python
from surya.detection import batch_text_detection
from surya.layout import batch_layout_detection # 提取布局
# 仅加载检测模型
model, processor = segformer.load_model(), segformer.load_processor()
# 批处理:一次扔进去 5 张图
images = [image1, image2, image3, ...]
# 预测文本行
line_preds = batch_text_detection(images, model, processor)
# 预测布局(Header, Caption, Text, Section...)
layout_preds = batch_layout_detection(images, model, processor)
# 结果包含了 heatmap 和 affinity map,可以用来做复杂的后处理
4. 性能与资源占用的真实情况
别只看官方 Benchmark,工程落地要看短板。
- 显存占用(VRAM):Surya 是吃显存的。如果你并发开得太高(Batch Size > 16),在 8GB 显存的 T4 上可能会 OOM。你需要根据显存大小调整 Batch Size。
- 冷启动时间:因为它要加载 PyTorch 模型(几百 MB),冷启动比 Tesseract 慢得多。它不适合那种“一天调用一次”的 Lambda 函数,适合常驻内存的 Worker。
- 中文支持:目前的版本(v0.4+)对中文的支持已经不错了,但相比 PaddleOCR 这种专门针对中文微调过的模型,Surya 在生僻字和竖排文本上还有差距。
5. 什么时候该用 Surya?
作为程序员,选型要客观:
- 场景:PDF 转 Markdown / RAG 预处理
- 强推 Surya。它的
Reading Order和Line Detection简直是为 RAG 诞生的。它能帮你把复杂的 PDF 拆解成逻辑通顺的文本块。
- 强推 Surya。它的
- 场景:高并发服务端 OCR
- 推荐 Surya。只要你有 GPU,它的吞吐量(Throughput)非常可观,而且代码维护成本比 Paddle 低(纯 PyTorch 生态)。
- 场景:嵌入式设备 / 树莓派
- 别用。还是老老实实优化 Tesseract 或者用 NCNN/MNN 跑 Paddle 吧。Surya 在没有 CUDA 的 ARM 芯片上跑不出速度优势。
总结
Surya 不是什么“魔法”,它是 Transformer 在视觉领域落地 的又一个优秀范本。它证明了在 2024 年,OCR 不再是单纯的 CV 问题,而是 CV + NLP(序列建模)的综合问题。
如果你手头有大量的 PDF 需要清洗,或者正在构建一个需要理解文档结构的 RAG 系统,pip install surya-ocr 值得一试。它可能不是最准的(中文),但它绝对是目前架构最现代、对开发者最友好的 OCR 库之一。