表格识别:从「一行行文字」到「一格一格的表」–OnnxOCR&RapidTable
1、写在前面
8月初,整个东北笼罩在穹顶之下,酷热难耐之时,我到传奇小城鹤岗的客户现场出差,算是躲过了热浪。
我对这座城市最久远的印象应该是学生时代的地理,鸡西鹤岗的煤是出名的。后来鹤岗的房价火出圈后,知名度算是更高了吧。
那些日子只要晚上有空,我就会跑到鹿林山公园的人民广场溜达。那边有巨大的观音像,也有巨幕的露天电影可以看。当我离开的时候,绿皮火车绕城而过,看着鹿林山上的观音像离我而去,我在想,不知道以后是否还有机会来到这座城。
是的,这篇文章跟鹤岗没有关系,我只是对我消失的这段时间做个简要的汇报。哈哈哈!
看到最近小伙伴留言,有许多新的需求。这很好,我后面会慢慢做起来的。今天想重点讲讲表格识别,这是在开发清单位置靠前的需求,同时我也看到有些问答经常提到这个话题。
有这样一个场景:你在外面看到一张带着表格信息的宣传报,你对里面的信息很感兴趣,而且你也想在此基础上做一些修改。那么怎么办?普通 OCR 会给你一堆文字,字都认对了,但行列关系丢了。复制进 Excel,还得人工对齐、合并单元格、补边框——表格越密,越折磨人。
表格识别要解决的,正是不光是认字,还要还原「第几行第几列、谁和谁合并了」。
2、普通 OCR 和表格识别的差异点
可以把一张表想象成两层信息:
| 层次 | 普通 OCR 给你什么 | 表格识别额外给你什么 |
|---|---|---|
| 文字层 | 「螺丝」「0.5」「100」 | 同上 |
| 结构层 | 无 | 这是第 2 行第 3 列;上面两行合并成表头 |
我看业界常见做法是「先 OCR 认字,再用结构模型还原表格」,而不是一个大模型端到端包办。OnnxOCR 走的也是这条路:底层 OCR 还是 PP-OCR 那套检测 + 识别,上面叠一层 RapidTable(结构模型默认SLANet-plus)。
3、一张图在系统里怎么流转
整条链路可以描述为:
表格图片 ↓ ① 文字检测(det)—— 找到每个字/词块的位置 ↓ ② 文字识别(rec)—— 读出具体内容 ↓ ③ 结构还原(RapidTable / slanet-plus)—— 根据框的位置关系,推断行列与合并 ↓ 输出 HTML(<table>…</table>)+ 单元格框 + 逻辑坐标 ↓ (可选)HTML → Excel表格模式 = 通用 OCR 跑一遍 + TableRecognizer 再跑一遍。TableRecognizer(table_recognition.py)把 OCR 的框、文字、分数整理成 RapidTable 需要的格式,再喂给slanet-plus.onnx。
4、Python 端:参考OnnxOCR开源项目
4.1 准备模型
表格模型不在默认小包里面,需要单独下:
python scripts/download_models.py# 确认存在:# onnxocr/models/table/slanet-plus.onnx国内走 ModelScope 即可;和国际用户一样,也可以从 HuggingFace 拉。
4.2 最小示例
仓库里tests/test_table_ocr.py就是标准入口:
fromonnxocr.onnx_paddleocrimportONNXPaddleOcr,sav2TableImgimportcv2 model=ONNXPaddleOcr(use_angle_cls=True,use_gpu=False,use_table_recognition=True,table_model_type="slanet_plus",)img=cv2.imread("onnxocr/test_images/table.jpg")result=model.ocr(img)print(result["html"][:500])# 带 <td rowspan=…> 的 HTMLsav2TableImg(img,result,name="./result_img/test_table_vis.jpg")返回字典里几个常用字段:
| 字段 | 含义 |
|---|---|
html | 可直接嵌网页、也可转 Excel 的表格 HTML |
cell_bboxes | 每个单元格在图上的框 |
logic_points | 逻辑行列坐标(第几行第几列) |
processing_time | 耗时 |
除了默认的slanet_plus,还支持ppstructure_zh/ppstructure_en两套 SLANet,按文档语言切换table_model_type即可。
4.3 WebUI 里试
本地起 WebUI 后,浏览器里切到「表格识别」标签,上传一张表就能看 HTML 和可视化——和命令行是同一套引擎。
5、为此我做了一个小程序
今年的折腾还没有结束,从C#到Android,这次终于轮到了微信小程序了。
经过一个多月的注册审核各种手续,我在微信里上架了小程序「程序员Linc表格识别」。大家可以使用下看看,还原度不够的,看看是否还能够继续优化。
我们压榨服务器性能的同时,也精进了我们的技术。
6、小结
表格识别是认字 + 还原结构两段式流水线:PP-OCR 负责「读出来」,RapidTable / SLANet 负责「排成表」,最后 HTML 一出口,复制、渲染、转 Excel 就完活了。
微信小程序搜索:程序员Linc表格识别
参考
- OnnxOCR 上游:https://github.com/jingsongliujing/OnnxOCR
- RapidTable:https://github.com/RapidAI/RapidTable