e
gcw_GSiqzzLf/table_dec-npu
模型介绍文件和版本Pull Requests讨论分析
下载使用量0

table_dec-NPU

模型介绍

table_dec 是一个基于 PaddleOCR PPStructure 的表格识别模型,用于从图片中检测和识别表格结构,输出 HTML 格式的表格内容。该模型包含两个子模型:

  1. PP-OCRv4 文本检测模型:检测图片中的文本区域位置
  2. SLANet 表格结构模型:识别表格行列结构,生成 HTML 表格代码

该模型来源于 PaddleOCR 的 ch_ppstructure_mobile_v2.0_SLANet_infer 预训练模型。

原始模型地址

  • ModelScope: https://www.modelscope.cn/models/ModelBulider/table_dec
  • PaddleOCR: https://github.com/PaddlePaddle/PaddleOCR

任务类型

表格识别(Table Recognition)

模型框架

PP-OCRv4 检测模型

  • 架构: MobileNetV3 + DBNet
  • 输入尺寸: 960×960
  • 参数量: ~4.7MB (ONNX)

SLANet 表格结构模型

  • 架构: SLANet (Side-aware Layout Attention Network)
  • 输入尺寸: 动态
  • 参数量: ~7.8MB (ONNX)

输入格式

  • 图片(RGB)
  • 支持常见图片格式:PNG、JPG、JPEG

输出格式

CPU 完整流水线(PPStructure)

模型输出检测到的区域列表,每个区域包含:

  • type: 区域类型(table / text)
  • bbox: 边界框坐标
  • score: 置信度分数
  • res.html: 表格 HTML 结构代码

NPU 检测模型(ONNX + CANN)

模型输出检测特征图:

  • shape: (1, 1, 960, 960)
  • 值范围: [0, 1],表示每个像素属于文本区域的概率

依赖环境

  • Python 3.10+
  • PaddlePaddle >= 3.0.0(CPU 流水线)
  • PaddleOCR >= 2.8.0
  • ONNX Runtime >= 1.20.0(NPU 推理)
  • ONNX Runtime CANN >= 1.20.0(昇腾 NPU)
  • 昇腾 NPU: CANN 工具包

NPU 适配说明

本模型已在华为昇腾 NPU (Ascend910) 上完成适配和测试。主要适配工作:

  1. ONNX 模型导出: 将 PP-OCRv4 检测模型导出为 ONNX 格式(det_model.onnx, 4.7MB)。
  2. CANN Execution Provider: 使用 ONNX Runtime CANN Execution Provider 在 NPU 上运行检测模型。
  3. SLANet 模型限制: SLANet 表格结构模型包含 WhileOp/ConditionalBlockOp 等动态循环(Loop)操作,ONNX 导出后的模型中包含不支持的 Loop 算子,无法在 CANN 上运行。因此 NPU 推理当前仅支持文本检测模型,完整表格识别流水线需要 PaddlePaddle NPU (paddle_custom_npu) 环境支持。
  4. 精度验证: 通过对比 CPU 和 NPU 的检测模型输出特征图,验证精度误差 < 1%。

环境准备

# 创建虚拟环境(可选)
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 工具包

推理命令

CPU 推理(完整 PPStructure 流水线)

cd deliverables/table_dec
python3 inference.py --device cpu --image /path/to/image.png

NPU 推理(ONNX + CANN 检测模型)

cd deliverables/table_dec
python3 inference.py --device npu --image /path/to/image.png

CPU/NPU 精度对比

cd deliverables/table_dec
python3 compare_cpu_npu.py

推理结果

CPU 完整 PPStructure 流水线推理耗时: 2.7107s(检测 + 表格结构识别) NPU 检测推理耗时: 0.3230s CPU 检测推理耗时: 0.4203s NPU 检测加速比: 1.30x

推理场景设备耗时说明
CPU 完整流水线Intel CPU2.7107sPPStructure 检测 + 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) - 检测特征图

完整 CPU 流水线

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}")

推理流程

  1. CPU 模式: 使用 PaddleOCR PPStructure 完整流水线,包含文本检测和 SLANet 表格结构识别
  2. NPU 模式: 使用 ONNX Runtime + CANN Execution Provider 运行 PP-OCRv4 检测模型
  3. 精度对比: 在 CPU 和 NPU 上分别运行检测模型,计算输出特征图的误差

CPU/NPU 精度测试方法

运行精度对比脚本:

cd deliverables/table_dec
python3 compare_cpu_npu.py

该脚本会:

  1. 预处理图片为模型输入格式(960×960)
  2. 在 CPU 上运行 ONNX 检测模型推理
  3. 在 NPU 上运行 ONNX 检测模型推理(CANN Execution Provider)
  4. 对比输出特征图的差异
  5. 计算 Cosine Similarity、绝对误差、相对误差、二值预测一致率等指标

对比指标说明

指标说明
Cosine Similarity余弦相似度,衡量两个输出向量的方向一致性
最大绝对误差 (MaxAE)输出像素值的最大绝对差异
平均绝对误差 (MAE)输出像素值的平均绝对差异
显著区域平均相对误差仅计算显著区域(像素值 > 0.1)的相对误差,排除背景噪声影响
二值预测一致率以 0.5 为阈值二值化后的一致性

CPU/NPU 精度测试结果

指标数值
Cosine Similarity0.99998633
最大绝对误差0.0635
平均绝对误差0.000004
显著区域平均相对误差0.2919%
二值预测一致率 (>0.5)99.9995%
总元素数921,600
差异元素数713

精度测试结论:NPU 与 CPU 推理显著区域平均误差为 0.2919%,符合精度误差小于 1% 的要求

性能测试结果

指标CPUNPU (Ascend910)加速比
检测模型推理0.4203s0.3230s1.30x
完整 PPStructure 流水线2.7107sN/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
  • #+CV
  • #+表格识别
  • #+OCR
  • #+PP-OCR
  • #+昇腾
  • #+文档分析

资源释放

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      # 终端截图

已知限制

  1. SLANet 模型无法在 NPU 运行: SLANet 包含 WhileOp/ConditionalBlockOp 等动态循环操作,ONNX 导出后产生 Loop 算子,不被 CANN 支持。替代方案是使用 PaddlePaddle NPU (paddle_custom_npu) 环境运行 PaddleOCR 完整流水线。
  2. 检测模型仅支持 960×960 输入: PP-OCRv4 检测模型固定输入尺寸为 960×960,输入图片会被缩放到该尺寸。
  3. 单图片推理: 当前脚本仅支持单图片推理,不支持批量处理。