做过文档数字化的兄弟都知道,单纯的 OCR(文字识别)其实只解决了 50% 的问题。
当你面对的是一张复杂的 财务报表、双栏排版的论文、或者带有合并单元格的采购单 时,普通的 ocr_system 跑出来的结果就是一堆乱序的字符串。你虽然拿到了字,但丢失了“结构”。
这时候你需要的是 PP-Structure。
很多开发者只盯着 PaddleOCR 的识别模型看,却忽略了这个放在 ppstructure 目录下的神器。它不是简单的 OCR,而是一套 Layout Analysis(版面分析) + Table Recognition(表格还原) 的组合拳。
1. 它是怎么工作的?(Pipeline 拆解)
PP-Structure 的工作流其实是一个串行+并行的 Pipeline,逻辑很符合人类阅读习惯:
- 版面分析(Layout Analysis):先别急着识字。用一个目标检测模型(基于 PicoDet)把图扫一遍,搞清楚哪块是标题,哪块是正文,哪块是表格,哪块是图片。
- 分发处理(Router):
- 如果是文本块 -> 扔给标准的 OCR 引擎识别内容。
- 如果是表格块 -> 扔给专门的表格识别模型(SLANet 或 TableMaster),它不仅识字,还要回归出单元格坐标和 HTML 结构(tr, td)。
- 结果重组(Recovery):把识别到的内容,按照版面坐标拼回去,直接生成 Word 或者 Excel。
2. 核心痛点解决:表格还原
这是 PP-Structure 最强悍的地方。
以前我们要还原表格,得自己写 heuristic 规则:检测横竖线、计算交点、根据坐标聚合文字……这代码写起来又臭又长,而且遇到无线表格(只有空隙没有线)直接歇菜。
PP-Structure 用的是端到端的思路。它预测的直接是表格的 HTML 源码 和 单元格坐标。这意味着哪怕表格有合并单元格、或者线框模糊,模型也能“脑补”出结构来。
3. 代码实战:一行代码转 Excel
咱们直接上代码。目标是:把一张复杂的表格截图,直接转成可编辑的 Excel 文件。
首先确保安装了依赖(除了 paddleocr,还需要 layoutparser 相关):
Bash
pip install paddleocr>=2.7.0
pip install protobuf==3.20.2 # 版本兼容性要注意,新版 protobuf 有时会坑
下面是 Python 脚本:
Python
import os
import cv2
from paddleocr import PPStructure, save_structure_res
# 初始化 PPStructure 引擎
# layout=True: 开启版面分析(必选,否则就是普通OCR)
# table=True: 开启表格识别
# ocr=True: 表格里的字也要识别出来
# recovery=True: 开启版面恢复,如果你想直接生成 docx/xlsx
engine = PPStructure(table=True, ocr=True, show_log=True, layout=True)
img_path = './complex_table.jpg'
print(f"开始分析图片: {img_path} ...")
# 1. 推理
# 这里的 img 既可以是路径,也可以是 numpy array
img = cv2.imread(img_path)
result = engine(img)
# result 是一个 list,每个元素代表版面上的一块区域(Region)
# 结构示例:
# [
# {
# 'type': 'table',
# 'bbox': [x1, y1, x2, y2],
# 'res': { 'html': '<table>...</table>', 'cell_bbox': ... }
# },
# {
# 'type': 'text',
# 'bbox': [...],
# 'res': [...]
# }
# ]
print(f"检测到 {len(result)} 个区域")
# 2. 结果保存与可视化
# 这步很关键,Paddle 封装好了 save_structure_res
# 它会自动把 'table' 类型的区域转换成 excel 文件
save_folder = './output'
if not os.path.exists(save_folder):
os.makedirs(save_folder)
save_structure_res(result, save_folder, os.path.basename(img_path).split('.')[0])
print(f"处理完成,结果已保存至 {save_folder}")
# 最终你会得到一个 .xlsx 文件,里面的表格结构和原图基本一致
4. 几个技术人员视角的“坑”
虽然好用,但 PP-Structure 在工程落地时有几个需要注意的点,别被官方 Demo 忽悠了:
- 速度问题(Latency): PP-Structure 极其吃资源。因为它相当于跑了:
检测模型 + 识别模型 + 表格结构模型。如果不做 Batch 处理,单张 1080P 的复杂文档处理时间可能在秒级(CPU 上甚至更久)。- 建议:如果你的业务只需要提取表格,就把
layout的阈值调高,或者训练一个轻量级的分类器先判断“这图里有没有表格”,没有就别调起 PP-Structure。
- 建议:如果你的业务只需要提取表格,就把
- 版面分析的误判: PicoDet 模型虽然泛化性不错,但对于“密集文本段落”和“无框表格”经常傻傻分不清。
- 建议:如果你的场景很固定(比如身份证、特定格式合同),不要用通用的版面分析模型。直接根据固定坐标切图,然后只调表格识别模块,既准又快。
- HTML 转换限制: 它生成的 HTML 结构有时候会比较 dirty,比如多余的
<thead>或者嵌套。如果你后续要解析这个 HTML 入库,建议用 BeautifulSoup 做一次清洗,不要直接信赖模型的输出。 - 显存爆炸: 如果你开启了
layout+ocr+table,模型加载到显存里还是挺大的。如果你是多进程部署(User Request -> Process),要注意显存 OOM(Out Of Memory)的问题。建议采用服务化模式,模型常驻内存。
5. 总结
PP-Structure 最大的价值在于它打通了“视觉感知”到“文档结构”的最后一公里。
以前我们做文档解析,OCR 只是第一步,后面要写几千行正则代码来拼凑结构。现在 PP-Structure 把这个工作量接管了过去。虽然它重、慢,但在处理非结构化文档(PDF转Word、报表数字化)这种对实时性要求不高的场景下,它是目前 Python 生态里最好用的开源方案,没有之一。