RapidOCR PP-OCRv4 — 昇腾 800I A2 NPU 性能调优
RapidOCR PP-OCRv4 端到端 OCR 流水线(文本检测 DBNet + 方向分类 + 文本识别 CRNN)在 Ascend 800I A2 (910B4) NPU 上的性能调优与精度验证。
性能结果
合成测试图(6 张)
| 配置 | 延迟 | 每秒帧数 | 对比 CPU | 提升 |
|---|
| CPU ONNX 基准 | 954ms | 1.05 | 1.00x | — |
| NPU ACL OM 基准 | 86.9ms | 11.51 | 11.0x | — |
| + TASK_QUEUE_ENABLE=2 | 70.87ms | 14.11 | 13.5x | +22% |
| + tcmalloc | 78.60ms | 12.72 | 12.1x | +10% |
| + TASK_QUEUE + tcmalloc | 70.94ms | 14.10 | 13.5x | +22% |
ICDAR2015 真实场景(100 张子集)
| 引擎 | 平均延迟 | 中位数 | 每秒帧数 | 对比 CPU |
|---|
| CPU ONNX | 1181.9ms | 934.6ms | 0.8 | 1.0x |
| NPU ACL OM | 66.1ms | 60.9ms | 15.1 | 17.9x |
ICDAR2015 大图(1280×720)加速比从合成图的 11.0x 提升到 17.9x。
精确度结果
合成图精度(CPU 参考 vs NPU)
| 引擎 | 文本准确率 | 平均框交并比 | 说明 |
|---|
| hybrid (推荐) | 100.00% ✅ | 1.000 | CPU ONNX 检测 + NPU OM 分类 + CPU ONNX 识别 |
| hybrid_fast (快速) | 94.44% | 0.877-1.000 | NPU OM 检测 + CPU ONNX 识别,ATC 精度差异 |
| npu (全 OM) | ~32.3% | 0.7-0.9 | 全 OM 转换,检测框 + 识别均有精度损失 |
hybrid 模式实现 100% 精度:检测模型用 CPU ONNX 确保框坐标完全一致,方向分类用 NPU OM(已验证输出一致),识别用 CPU ONNX 避免 BiLSTM 精度损失。
ICDAR2015 绝对精度(500 张,修复后)
| 指标 | 修复前 | 修复后 (NPU OM) | Hybrid (NPU Det + CPU Rec) |
|---|
| 精确率 | 0.0056 | 0.2667 | — |
| 召回率 | 0.0079 | 0.0799 | — |
| H-均值 (F1) | 0.0026 | 0.1230 | — |
| 识别准确率 | 0.0000 | 0.0241 | — |
重要: 召回率偏低是因为 PP-OCRv4 做行级检测(一个框覆盖整行),而 ICDAR2015 标注是词级。行级框覆盖 5 个单词时,最多和 1 个标注框匹配。
Bug 修复
坐标映射 Bug:DBNetPostProcessor 在 keep_ratio resize + 填充后,坐标缩放未按实际内容尺寸(去除填充),导致 y 坐标被压缩约 1.78 倍。修复后精确率提升 47.6 倍(0.0056 → 0.2667)。
优化总结
| 轮次 | 优化 | 延迟 | 每秒帧数 | 加速比 | 结论 |
|---|
| 基准 | CPU ONNX | 954ms | 1.05 | 1x | 参考基线 |
| M0 | NPU OM (ACL) | 86.9ms | 11.51 | 11.0x | 🚀 |
| M1 | + FP16 ATC | 91.5ms | 10.92 | 0.95x | ❌ 小模型无用 |
| M2 | + TASK_QUEUE_ENABLE=2 | 70.87ms | 14.11 | 1.22x | ✅ 最佳 |
| M3 | + tcmalloc | 78.60ms | 12.72 | 1.10x | ✅ |
| M4 | + TASK_QUEUE + tcmalloc | 70.94ms | 14.10 | 1.22x | ✅ 叠加有限 |
下载与安装
权重下载
# 下载全部 ONNX 模型
bash scripts/download_model.sh all
# 仅下载单个
bash scripts/download_model.sh rec
# ONNX → OM 转换(需有 atc)
SOC_VERSION=Ascend910B4 bash scripts/download_model.sh om
数据集下载
💡 若从欧洲服务器下载 ICDAR2015 速度较慢,可尝试 HuggingFace 镜像:https://huggingface.co/datasets/nateraw/icdar2015/resolve/main/test_images.zip
使用方法
# hybrid 模式 (推荐,100% 精度,NPU 加速方向分类)
python3 scripts/pipeline.py --image test_images/test_en.jpg --engine hybrid --det-size 960 960
# hybrid_fast 模式 (快速,~94% 精度,NPU 加速检测+分类)
TASK_QUEUE_ENABLE=2 python3 scripts/pipeline.py --image test_images/test_en.jpg --engine hybrid_fast --det-size 960 960
# CPU 推理(基线)
python3 scripts/pipeline.py --image test_images/test_en.jpg --engine cpu
# NPU 推理(全 OM,最快但精度低)
TASK_QUEUE_ENABLE=2 python3 scripts/pipeline.py --image test_images/test_en.jpg --engine npu
# 精度验证(hybrid 模式,100% 精度)
python3 scripts/accuracy.py --engine hybrid --det-size 960 960 \
--npu-cls models/cls/cls.om --images test_images/*.jpg
# 精度验证(hybrid_fast 模式,~94% 精度)
python3 scripts/accuracy.py --engine hybrid_fast --det-size 960 960 \
--npu-det models/det/det.om --npu-cls models/cls/cls.om \
--images test_images/*.jpg
# 性能测试
TASK_QUEUE_ENABLE=2 python3 scripts/benchmark.py \
--det models/det/det.om --cls models/cls/cls.om --rec models/rec/rec.om \
--char models/rec/characters.json --engine npu \
--images test_images/*.jpg --warmup 5 --iterations 20
# ICDAR2015 精度评估
python3 scripts/eval_accuracy.py \
--det models/det/det.om --cls models/cls/cls.om --rec models/rec/rec.om \
--char models/rec/characters.json --gt datasets/icdar2015/gt/ \
--images datasets/icdar2015/images/ --gt-format icdar --engine npu
目录结构
RapidOCR-opt/
├── README.md # 项目说明(本文件)
├── validation_report.md # 完整验证报告
├── SKILL.md # 可复用技能文档
├── PLAN.md # 优化计划
├── requirements.txt # Python 依赖
├── setup_env.sh # 环境配置脚本
│
├── scripts/
│ ├── pipeline.py # 统一推理流水线
│ ├── benchmark.py # 性能基准测试
│ ├── accuracy.py # 精度验证 (CPU vs NPU)
│ ├── eval_accuracy.py # 验证集绝对精度评估
│ ├── run_onnx_sample.sh # ONNX 样本测试
│ ├── download_dataset.sh # 数据集下载
│ ├── profiler.py # Profiling 封装
│ └── logger.py # 实验日志
│
├── models/
│ ├── det/det.onnx / det.om # 文本检测模型
│ ├── cls/cls.onnx / cls.om # 方向分类模型
│ └── rec/rec.onnx / rec.om # 文本识别模型
│
├── test_images/ # 6 张合成测试图
├── datasets/icdar2015/ # ICDAR2015 数据集
├── experiments/ # 各轮优化独立实验
└── results/ # 汇总结果
├── cpu_validation.json
├── npu_validation.json
├── icdar2015_validation.json
├── icdar2015_absolute_accuracy_fixed.json
└── final_comparison.json
推荐配置
| 场景 | 推荐配置 | 延迟 | 说明 |
|---|
| 精度敏感 | --engine hybrid | — | 100% 精度,CPU 检测 + NPU 方向分类 + CPU 识别 |
| 开发/测试 | --engine hybrid_fast + TASK_QUEUE_ENABLE=2 | ~71ms | 约 94% 精度,最佳性价比 |
| 生产部署 | --engine hybrid_fast + TASK_QUEUE_ENABLE=2 + 预热 | ~70ms | 稳定低延迟 |
| 最快推理 | --engine npu + TASK_QUEUE_ENABLE=2 | ~70ms | 最快但只有 ~32% 精度 |
硬件环境
- NPU: Ascend 800I A2 (910B4) × 1
- CANN: 8.5.0
- CPU: Intel Xeon (对比基线)