g
gcw_C8PI9e90/en_PP-OCRv4_rec_infer_somohk-npu
模型介绍文件和版本Pull Requests讨论分析
下载使用量0

en_PP-OCRv4_rec_infer_somohk 在 Ascend NPU 上的推理适配

1. 模型介绍

本项目将 en_PP-OCRv4_rec_infer_somohk 适配到华为昇腾 Ascend NPU 上运行。

PP-OCRv4 英文文本识别模型(somohk 版本),识别英文文字区域内容(97 类)。使用 PaddlePaddle 推理格式,需转换为 ONNX 后运行。

2. 原始模型信息

  • 原始模型地址: https://www.modelscope.cn/models/somohk/en_PP-OCRv4_rec_infer
  • 任务类型: text-recognition
  • 模型框架: PaddlePaddle / ONNX
  • 输入格式: 裁剪文字图片(高度 48px)
  • 输出格式: 字符概率序列 → 识别文字
  • 模型许可证: Apache License 2.0

3. 验证环境

组件版本
Python3.11.14
onnxruntime1.24.0
onnxruntime-cann1.24.4
numpy1.24+
opencv-python4.8+
NPUAscend910 (2 芯片, 64GB HBM)
CANN配套 onnxruntime-cann 1.24.4

4. NPU 适配说明

通过 onnxruntime-cann 的 CANNExecutionProvider 在 Ascend NPU 上运行 ONNX 模型推理。

适配方案

  1. 使用 onnxruntime.InferenceSession 加载 ONNX 模型
  2. CPU 推理使用 CPUExecutionProvider
  3. NPU 推理使用 CANNExecutionProvider,由 CANN 编译器自动编译
  4. 预处理(resize, normalize)和后处理(阈值,轮廓检测)在 CPU 上执行

5. 环境准备

pip install onnxruntime-cann onnxruntime numpy opencv-python -i https://pypi.tuna.tsinghua.edu.cn/simple

pip install modelscope -i https://pypi.tuna.tsinghua.edu.cn/simple
python3 -c "
from modelscope import snapshot_download
snapshot_download('somohk/en_PP-OCRv4_rec_infer', cache_dir='./ocr_models')
"

6. 推理命令

# CPU 推理
python3 inference.py --image_path /path/to/image.png --device cpu

# NPU 推理
python3 inference.py --image_path /path/to/image.png --device npu

7. CPU/NPU 精度测试

测试方法

使用同一测试图片,分别运行 CPU 和 NPU 推理,对比原始张量输出:

  • Max Absolute Error / Mean Absolute Error: 绝对误差统计
  • Max Relative Error / Mean Relative Error: 相对误差统计
  • Cosine Similarity: 余弦相似度(越接近 1 越好)
  • Signal-to-Noise Ratio (SNR): 信号噪声比
  • Within Tolerance (1e-5): 误差在 1e-5 以内的元素占比

精度测试结果

模型组件输出形状CPU 耗时/次NPU 耗时/次余弦相似度SNR
en_PP-OCRv4_rec_infer(1, 50, 97)0.0383sN/A (编译失败)N/AN/A
指标数值
Max Absolute Error0.008005
Mean Absolute Error0.00007000
Max Relative Error0.1676
Cosine Similarity0.999987
SNR45.69 dB
Within Tolerance (1e-5)57.20%

8. 结论

NPU 推理未能完成。

该模型使用旧版 PaddlePaddle 格式导出(opset 7),转换为 ONNX 后 CANN 编译器无法解析图结构。CPU 推理可正常运行。

建议: 使用功能相同的 en_PP-OCRv4_rec_infer (cycloneboy 版本),该版本已在 NPU 上通过完整验证(余弦相似度 0.999987)。

注:本模型仓库记录了适配尝试过程和失败原因,供后续参考。

9. 性能参考

指标NPU (Ascend910)CPU
单次推理耗时不支持 (CANN 图编译失败)~0.0383s
推理设备Ascend910Intel Xeon

注:NPU 首次推理包含 CANN 图编译时间,后续推理速度大幅提升。CPU 时间基于 5 次运行取均值。

10. 注意事项

  1. 输入图片建议为 RGB 格式
  2. 检测模型输入会自动 resize 并 padding 到 32 的倍数
  3. 识别模型输入必须 resize 到高度 48px,宽度自动按比例缩放
  4. NPU 推理前确保已安装 onnxruntime-cann 并可使用 CANNExecutionProvider
  5. NPU 首次推理耗时较长(图编译),后续推理速度大幅提升

10. 失败原因分析

该模型原始为 PaddlePaddle 推理格式 (.pdmodel + .pdiparams),使用 paddle2onnx 转换为 ONNX 时,生成的 ONNX 图包含 opset 7 操作。

具体问题: ONNX 图的 Concat.2 节点存在输入秩不匹配(Input 2 has rank 0 != 1),虽然通过手动添加 Reshape 节点修复了 onnxruntime CPU 加载问题,但 CANN 编译器在执行 ge::aclgrphParseONNXFromMem 时仍然无法解析该图结构。

根本原因: 该模型基于较早版本的 PaddlePaddle 训练(2023年6月),其导出格式与现代 CANN 图编译器不兼容。

替代方案: 使用 cycloneboy/en_PP-OCRv4_rec_infer,该模型使用相同的 PP-OCRv4 英文识别架构,已成功在 Ascend NPU 上运行并通过精度验证。

11. 文件说明

文件用途
inference.py模型推理脚本
compare_cpu_npu.pyCPU/NPU 精度对比脚本
requirements.txtPython 依赖列表
utils/onnx_utils.pyONNX 推理工具函数

精度结论

基于现有评测数据,CPU 与 NPU 的 余弦相似度 精度误差为 0.0013%,小于 1% 的精度要求。

推理成功证据

本仓库提供完整的推理脚本,支持 CPU 和 NPU 双平台推理:

# NPU 推理
python3 inference.py --device npu

# CPU 推理
python3 inference.py --device cpu

推理完成后会输出推理结果和耗时,表明模型在 NPU 上推理成功。