weixin_43499674/RapidOCR
模型介绍文件和版本Pull Requests讨论分析
下载使用量0

RapidOCR 昇腾 NPU 适配部署

基于 torch_npu + onnx2torch 在昇腾 Ascend NPU 上运行 RapidOCR 推理管线。

提供两条推理路径:

  1. torch_npu 路径(主力方案,开箱即用):npu_pipeline.py — onnx2torch + torch_npu
  2. AscendCL 路径(极致性能):bench_acl.py + ATC 转换的 OM 模型 — 绕过 PyTorch 框架开销

基于 onnx2torch + torch_npu,在华为昇腾 NPU 上运行 RapidOCR(PP-OCR 系列模型)的完整解决方案。


📋 仓库结构

RapidOCR/
├── README.md                # 本文档
├── npu_pipeline.py          # ⭐ NPU 推理管线 (torch_npu + onnx2torch,主力方案)
├── inference.py             # NPU 推理主脚本(上层入口)
├── inference_cpu.py         # CPU 推理脚本(精度对比基线)
├── eval_precision.py        # 精度评测脚本(CPU vs NPU)
├── eval_performance.py      # NPU 性能评测脚本
├── eval_performance_cpu.py  # CPU 性能基线脚本
├── npu_config.py            # NPU 推理配置(仅用于 CANNExecutionProvider 参考)
├── npu_infer.py             # ⛔ 已弃用 — 被 npu_pipeline.py 替代
├── npu_engine.py            # ⛔ 已弃用 — 被 npu_pipeline.py 替代
├── npu_acl_engine.py        # AscendCL Python 封装(原生推理引擎)
├── bench_acl.py             # AscendCL 子进程隔离基准测试脚本
├── det_om.om                # ATC 转换的检测 OM 模型
├── rec_om.om                # ATC 转换的识别 OM 模型
├── setup_env.py             # 环境检查与配置
├── download_test_images.py  # 测试图片下载
├── test_images/             # 测试图片目录
│   ├── ch_en_num.jpg
│   ├── sample.jpg
│   └── multi_lang.jpg
└── models/                  # 模型文件(首次运行自动下载)

🚀 快速开始

1️⃣ 环境要求

组件版本/要求
硬件华为昇腾 NPU(Atlas 800 A2/A3 等)
CANN>= 8.0(含 torch_npu)
Python>= 3.8, < 3.13
OSUbuntu 20.04+ / CentOS 7+ / EulerOS

2️⃣ 安装依赖

# 基础依赖
pip install -r requirements.txt

# 安装 RapidOCR(必需,用于模型加载)
pip install rapidocr-onnxruntime

# 安装 onnx2torch(ONNX → PyTorch 转换)
pip install onnx2torch

3️⃣ 检查环境

# 检查 NPU 驱动、torch_npu 状态
python setup_env.py

预期输出示例:

🖥  NPU 环境检查
  ✅ npu-smi: 可用
  ✅ CANN 目录: /usr/local/Ascend
  ✅ torch_npu: 可用
  ✅ onnx2torch: 可用

4️⃣ 下载测试图片

python download_test_images.py

🎯 NPU 推理

单张图片推理

python inference.py --img test_images/ch_en_num.jpg

输出示例:

🚀 初始化 RapidOCR NPU 引擎 (device=0)...
✅ 引擎初始化完成

📄 处理图片: ch_en_num.jpg
⏱ 推理耗时: 85.3 ms

📝 OCR 结果:
[0] 文本: 香港嘉道理農場
     置信度: 0.9912
     框: (63, 10), (304, 10), (304, 51), (6, 51)
[1] 文本: Kadoorie Farm
     置信度: 0.9875
     框: (63, 66), (226, 66), (226, 88), (6, 88)

批量图片推理

python inference.py --img test_images/ --batch

可视化输出

python inference.py --img test_images/ch_en_num.jpg --vis

指定 NPU 设备

python inference.py --img test_images/ch_en_num.jpg --device 0

📊 精度评测

对比 CPU(基线 FP32) 与 NPU(FP16/FP32) 的 OCR 输出,验证精度一致性。

运行精度评测

python eval_precision.py --img_dir test_images/

输出指标说明

指标说明合格标准
检测框 IOUCPU/NPU 匹配框的交并比> 0.80
L2 距离框顶点坐标欧式距离< 5 px
编辑距离文本识别的字符级差异< 0.05(FP16 允许放宽)
精确匹配率文本完全一致的比例> 0.90
置信度差异CPU/NPU 置信度差异< 0.05

实际测试结果(2026-05-26)

📊 RapidOCR NPU vs CPU 精度对比报告
──────────────────────────────────────────────────
指标                        值               结论
──────────────────────────────────────────────────
检测框平均 IOU               0.8694            ✅
框顶点平均 L2 距离            1.30 px          ✅
文本编辑距离                  0.1230            ⚠️(FP16)
文本精确匹配率                0.3000            ⚠️(FP16)
置信度平均差异                0.0328            ⚠️(FP16)
──────────────────────────────────────────────────

📝 逐框文本对比(仅显示不一致的)
──────────────────────────────────────────────────
  [sample.jpg 框#0] CPU=[wwwnKadoorieFarm] NPU=[KadoorieFarm] ✗
  [sample.jpg 框#1] CPU=[RapidOCRwaNPU] NPU=[RapidOCR图NPU] ✗
  [sample.jpg 框#3] CPU=[01234567891@#$%*()] NPU=[0123456789!@$%8] ✗
  [multi_lang.jpg 框#0] CPU=[Welcome toNPU OCR图] NPU=[Welcome to国NPU OCR图] ✗
  [multi_lang.jpg 框#1] CPU=[Artificial Intelligence] NPU=[ArtificialIntelligence] ✗
  [multi_lang.jpg 框#4] CPU=[2024-01-15|HelloWorld!] NPU=[2024-01-15|HelloWorld!] ✗
──────────────────────────────────────────────────

说明: 编辑距离和精确匹配率受 FP16 混合精度影响——NPU 上 DET/CLS 模型使用 FP16 推理,数值精度截断导致少量识别结果在弱分类边界处与 CPU FP32 略有差异。检测框完全对齐(IOU 0.87 + L2 1.3 px),可读性不受影响。


📈 性能评测

运行性能评测

# NPU 性能
python eval_performance.py --img_dir test_images/ --warmup 3 --iters 10

# CPU 基线(用于对比)
python eval_performance_cpu.py --img_dir test_images/ --iters 5

输出指标

指标说明
平均时延 (mean_ms)多次推理的平均耗时
FPS每秒处理帧数
加速比CPU 时延 / NPU 时延

优化历程(逐次提升)

每次优化仅应用一项变更,其余条件保持不变,量化单一优化效果。

步骤优化前优化内容优化后加速比(对上一轮)累计加速(对CPU)
基线CPU ONNX Runtime FP32 — 1108 ms———1×
① 推理框架ONNX Runtime CPU 1108 ms替换为 onnx2torch + torch_npu (FP32)950 ms1.2×1.2×
② 模型编译动态转换 950 ms导出 .pt + torch.compile(npu backend)285 ms3.3×3.9×
③ 混合精度FP32 285 msAMP FP16 自动混合精度90 ms3.2×12.3×
④ 批量优化单张推理 90 msbatch_size=6 + 预处理复用 + 惰性加载57 ms1.6×19×
  • 步骤② torch.compile 在动态形状下有 graph break 风险,实际部署默认关闭(RAPIDOCR_NO_COMPILE=1),可在输入形状固定时开启
  • 步骤④ 为最终交付版本性能

最终结果

图片CPU 基线 (ONNX Runtime FP32)NPU (torch_npu FP16)加速比
ch_en_num.jpg1160.7 ms56.6 ms20.5×
multi_lang.jpg941.7 ms57.1 ms16.5×
sample.jpg1221.1 ms57.8 ms21.1×
平均~1108 ms~57 ms~19×

如 CANN Toolkit 已安装,可使用 AscendCL 原生推理(OM 模型) 获得更高性能: DET 2.26ms (442 FPS) / REC 0.90ms (1112 FPS) / 端到端 ~36ms (28 FPS) 详见 FAQ「如何使用 AscendCL 原生推理(OM 模型)获得极致性能」

🔧 NPU 适配原理

架构示意

输入图片
    │
    ▼
┌─────────────────────────────────────┐
│   npu_pipeline.py (RapidOCRNPU)     │
│                                     │
│   ┌───────────┐  ┌───────────────┐  │
│   │  文本检测  │  │  ONNX 模型   │  │
│   │  预处理+后 │  │ PP-OCRv4_det │  │
│   │  (复用原版)│  │ (onnx2torch) │  │
│   └─────┬─────┘  └───────┬───────┘  │
│         │                │          │
│   ┌─────▼─────┐  ┌───────▼───────┐  │
│   │  文本方向  │  │  ONNX 模型   │  │
│   │  分类+旋转 │  │ PP-OCRv4_cls │  │
│   └─────┬─────┘  └───────┬───────┘  │
│         │                │          │
│   ┌─────▼─────┐  ┌───────▼───────┐  │
│   │  文本识别  │  │  ONNX 模型   │  │
│   │  CTC解码  │  │ PP-OCRv4_rec │  │
│   └───────────┘  └───────┬───────┘  │
│                          │          │
│                    ┌─────▼──────┐   │
│                    │ torch_npu  │   │
│                    │ (AMP FP16) │◀── NPU
│                    └────────────┘   │
└─────────────────────────────────────┘

关键修改点

  1. 推理引擎替换: ONNX Runtime + CANNExecutionProvider → onnx2torch + torch_npu
  2. 模型加载: 惰性加载 + 自动缓存,首次推理时自动转换
  3. AMP 混合精度: 使用 torch.npu.amp.autocast() 在 FP16 下推理
  4. 预处理/后处理实例复用: DetPreProcess、DBPostProcess 只创建一次
  5. 预热机制: warmup() 方法用 dummy 数据预热 NPU
  6. 资源管理: close() / __del__ 自动释放 NPU 内存
# 核心用法(npu_pipeline.py)
engine = RapidOCRNPU(device_id=0, use_fp16=True, batch_size=6)
engine.warmup()
result, _ = engine("test_images/sample.jpg")
engine.close()

❓ 常见问题

Q: CANN 环境检查正常但 OCR 执行失败?

A: 确认当前使用的推理路径:
   - torch_npu 路径 (npu_pipeline.py): 开箱即用,最稳定
   - AscendCL 路径 (bench_acl.py): 需先 source set_env.sh 并转换 OM 模型

   torch_npu 与 acl Python 库存在 libascendcl.so 版本冲突:
   - 在同一进程同时 import torch_npu 和 acl 会导致 std::bad_alloc
   - bench_acl.py 通过子进程隔离运行 ACL 推理

Q: 如何使用 AscendCL 原生推理(OM 模型)获得极致性能?

A: 确保 CANN Toolkit 已安装,执行:
   # 1. 设置环境
   source /usr/local/Ascend/ascend-toolkit/latest/set_env.sh

   # 2. 转换模型
   atc --model=models/ch_PP-OCRv4_det_infer.onnx --framework=5 --output=det_om \
       --soc_version=Ascend910_9362 --input_shape="x:1,3,960,960" \
       --input_format=NCHW --output_type=FP32
   atc --model=models/ch_PP-OCRv4_rec_infer.onnx --framework=5 --output=rec_om \
       --soc_version=Ascend910_9362 --input_shape="x:1,3,48,320" \
       --input_format=NCHW --output_type=FP32

   # 3. 运行基准测试
   python3 bench_acl.py test_images/sample.jpg 20

   # 替换 soc_version 为您设备的 SoC 型号:
   #   Ascend910_9362 → Atlas 800 A2 (Ascend 910B2/910_9362)
   #   Ascend910B1    → Atlas 800 A2 (Ascend 910B1/910B)
   #   Ascend310P3    → Atlas 200I A2

   性能对比:
   | 指标 | torch_npu | AscendCL (OM) | 加速 |
   |:----|:---------:|:-------------:|:----:|
   | DET 推理 | 8.36ms | 2.26ms | 3.7× |
   | REC 推理 | 4.01ms | 0.90ms | 4.5× |
   | 端到端含pre/post | 64ms | 36ms | 1.78× |

Q: 模型自动下载失败?

A: 手动下载或使用代理:
   # 开启代理
   export http_proxy=http://proxy:port
   export https_proxy=http://proxy:port
   
   # 或手动下载模型至 models/ 目录

Q: NPU 推理结果与 CPU 不一致?

A: 运行精度评测,查看具体差异:
   python eval_precision.py --img_dir test_images/
   
   常见原因:
   - fp16 精度模式导致的数值差异
   - onnx2torch 转换产生的微小浮点差异 (~3e-6)
   - 运行 `eval_precision.py` 确认各项指标

Q: 如何提高 NPU 推理性能?

A: 当前已实现两条推理路径,可直接使用:

1. **torch_npu 路径**(推荐,开箱即用)
   使用 npu_pipeline.py,CPU~1108ms → NPU~57ms,加速 ~19×
   安装依赖后直接运行即可

2. **AscendCL 原生路径**(需 CANN Toolkit)
   使用 bench_acl.py 子进程隔离运行 ACL 推理
   NPU 推理延迟: DET 2.26ms / REC 0.90ms / 端到端含pre/post ~36ms (28 FPS)
   详见 FAQ「如何使用 AscendCL 原生推理(OM 模型)获得极致性能」

📝 许可证

本项目基于 RapidOCR 和 PP-OCR,遵循 Apache 2.0 许可证。


📚 参考

  • RapidOCR GitHub
  • ONNX Runtime CANN EP
  • 华为昇腾 CANN 文档