news 2026/9/13 9:09:58

表格识别:从「一行行文字」到「一格一格的表」--OnnxOCRRapidTable

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
表格识别:从「一行行文字」到「一格一格的表」--OnnxOCRRapidTable

表格识别:从「一行行文字」到「一格一格的表」–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 再跑一遍TableRecognizertable_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表格识别

参考

  1. OnnxOCR 上游:https://github.com/jingsongliujing/OnnxOCR
  2. RapidTable:https://github.com/RapidAI/RapidTable
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/2 0:32:59

大厂语音算法岗笔试怎么考?网易2018真题考点拆解与备战指南

每年这个时候都有不少准备投语音方向的同学来问我&#xff0c;说网易这类大厂的算法工程师笔试卷到底考什么、难不难、怎么准备。翻到当年的网易2018校招语音算法工程师笔试卷&#xff0c;说实话&#xff0c;哪怕放到现在来看&#xff0c;这份卷子的考点覆盖和出题思路依然很有…

作者头像 李华
网站建设 2026/9/1 13:02:58

GradCuit:测试时推理的梯度流与信用分配机制解析

第一眼看到 GradCuit 这个题目&#xff0c;我最大的感受是&#xff1a;它把测试时推理从“搜多少条文本路径”变成了“在连续潜在空间里按梯度流优化状态”&#xff0c;再通过信用分配告诉每个中间潜在步骤&#xff0c;你该为最终结果承担多少责任。这不算一个和思维链完全对立…

作者头像 李华
网站建设 2026/9/1 14:11:13

LoRaWAN入网失败Code 14排查:ST例程与ChirpStack配置不匹配

如果你在用 NUCLEO-WL55JC1 这颗板子跑 ST 官方的 LoRaWAN_End_Node_LBM 例程&#xff0c;调试时在串口日志里看到Join Accept Failed with Code 14&#xff0c;然后去 ChirpStack 那边翻网关日志又什么都看不出来&#xff0c;大概率已经在论坛和 issue 里泡了两三天了。先说结…

作者头像 李华
网站建设 2026/9/2 4:05:10

捷联惯导动基座传递对准:速度+姿态匹配MATLAB仿真平台

简介&#xff1a;本资源是一个面向惯性导航领域初学者与工程实践者的MATLAB仿真平台&#xff0c;聚焦于INS传递对准中的核心算法——速度与姿态匹配&#xff0c;并深度融合卡尔曼滤波进行误差估计与校正&#xff0c;适用于导航制导、无人系统定位等场景的算法验证与教学研究。压…

作者头像 李华
网站建设 2026/9/7 12:25:29

单片机裸机复习2/3

接上次有介绍过频率低的好处1.电机起步用低频&#xff0c;因为低频时感抗小&#xff08;XL2πfL&#xff09;&#xff0c;电流容易通过&#xff0c;驱动能力强&#xff1b;而高频时&#xff0c;感抗太大&#xff0c;电流不易通过&#xff0c;启动扭矩不足。名词&#xff1a; V/…

作者头像 李华