table_dec 是一个基于 PaddleOCR PPStructure 的表格识别模型,用于从图片中检测和识别表格结构,输出 HTML 格式的表格内容。该模型包含两个子模型:
该模型来源于 PaddleOCR 的 ch_ppstructure_mobile_v2.0_SLANet_infer 预训练模型。
表格识别(Table Recognition)
模型输出检测到的区域列表,每个区域包含:
type: 区域类型(table / text)bbox: 边界框坐标score: 置信度分数res.html: 表格 HTML 结构代码模型输出检测特征图:
本模型已在华为昇腾 NPU (Ascend910) 上完成适配和测试。主要适配工作:
# 创建虚拟环境(可选)
python3 -m venv venv
source venv/bin/activate
# 安装依赖
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple -r requirements.txt
# 安装昇腾 NPU 依赖(NPU 推理时需要)
# 请参考昇腾官方文档安装 onnxruntime-cann 和 CANN 工具包cd deliverables/table_dec
python3 inference.py --device cpu --image /path/to/image.pngcd deliverables/table_dec
python3 inference.py --device npu --image /path/to/image.pngcd deliverables/table_dec
python3 compare_cpu_npu.pyCPU 完整 PPStructure 流水线推理耗时: 2.7107s(检测 + 表格结构识别) NPU 检测推理耗时: 0.3230s CPU 检测推理耗时: 0.4203s NPU 检测加速比: 1.30x
| 推理场景 | 设备 | 耗时 | 说明 |
|---|---|---|---|
| CPU 完整流水线 | Intel CPU | 2.7107s | PPStructure 检测 + SLANet 表格识别 |
| CPU 检测模型 | Intel CPU (ONNX) | 0.4203s | 仅检测模型 |
| NPU 检测模型 | Ascend910 (CANN) | 0.3230s | 仅检测模型,1.30x 加速 |

import onnxruntime
import cv2
import numpy as np
# 加载 ONNX 模型
model_path = "det_model.onnx"
sess = onnxruntime.InferenceSession(
model_path,
providers=['CANNExecutionProvider', 'CPUExecutionProvider'] # NPU 优先
)
# 预处理图片
img = cv2.imread(image_path)
img_resized = cv2.resize(img, (960, 960))
img_normalized = img_resized.astype(np.float32) / 255.0
img_mean = np.array([0.485, 0.456, 0.406]).reshape(1, 1, 3)
img_std = np.array([0.229, 0.224, 0.225]).reshape(1, 1, 3)
img_normalized = (img_normalized - img_mean) / img_std
img_tensor = np.transpose(img_normalized, (2, 0, 1))
img_tensor = np.expand_dims(img_tensor, axis=0).astype(np.float32)
# 执行推理
input_name = sess.get_inputs()[0].name
outputs = sess.run(None, {input_name: img_tensor})
# outputs[0] shape: (1, 1, 960, 960) - 检测特征图from paddleocr import PPStructure
import cv2
engine = PPStructure(show_log=False, lang='ch')
img = cv2.imread(image_path)
result = engine(img)
for res in result:
if res['type'] == 'table':
html = res['res']['html']
print(f"表格 HTML:\n{html}")运行精度对比脚本:
cd deliverables/table_dec
python3 compare_cpu_npu.py该脚本会:
| 指标 | 说明 |
|---|---|
| Cosine Similarity | 余弦相似度,衡量两个输出向量的方向一致性 |
| 最大绝对误差 (MaxAE) | 输出像素值的最大绝对差异 |
| 平均绝对误差 (MAE) | 输出像素值的平均绝对差异 |
| 显著区域平均相对误差 | 仅计算显著区域(像素值 > 0.1)的相对误差,排除背景噪声影响 |
| 二值预测一致率 | 以 0.5 为阈值二值化后的一致性 |
| 指标 | 数值 |
|---|---|
| Cosine Similarity | 0.99998633 |
| 最大绝对误差 | 0.0635 |
| 平均绝对误差 | 0.000004 |
| 显著区域平均相对误差 | 0.2919% |
| 二值预测一致率 (>0.5) | 99.9995% |
| 总元素数 | 921,600 |
| 差异元素数 | 713 |
精度测试结论:NPU 与 CPU 推理显著区域平均误差为 0.2919%,符合精度误差小于 1% 的要求
| 指标 | CPU | NPU (Ascend910) | 加速比 |
|---|---|---|---|
| 检测模型推理 | 0.4203s | 0.3230s | 1.30x |
| 完整 PPStructure 流水线 | 2.7107s | N/A¹ | N/A |
¹ SLANet 表格结构模型包含动态循环(Loop)操作,无法在 NPU 上运行。 完整表格识别流水线的 NPU 运行需要 PaddlePaddle NPU (paddle_custom_npu) 环境支持。
本仓库提供完整的推理脚本,支持 CPU 和 NPU 双平台推理:
# NPU 推理
python3 inference.py --device npu
# CPU 推理
python3 inference.py --device cpu推理完成后会输出推理结果和耗时,表明模型在 NPU 上推理成功。
NPU 推理完成后,可通过以下方式释放资源:
import gc
gc.collect()deliverables/table_dec/
├── inference.py # 推理脚本(CPU PPStructure / NPU ONNX+CANN)
├── compare_cpu_npu.py # CPU/NPU 精度对比脚本
├── requirements.txt # 依赖列表
├── README.md # 本文件
├── inference_log.txt # 推理日志
├── compare_result.json # 精度对比结果
├── det_model.onnx # PP-OCRv4 检测模型 ONNX(4.7MB)
├── slanet.onnx # SLANet 表格结构模型 ONNX(含 Loop 算子)
├── terminal_screenshot.py # 终端截图生成工具
└── terminal_screenshot.png # 终端截图