本项目基于 RapidOCR 轻量化模型,完成检测(det)、方向分类(cls)、识别(rec)三阶段模型在华为昇腾 NPU 上的适配、精度验证与性能优化。
| 组件 | 版本/要求 |
|---|---|
| 硬件 | Ascend 910B / 310P 系列 NPU |
| CANN | >= 8.0 |
| Python | 3.8 - 3.11 |
| PyTorch | >= 2.1 |
| torch_npu | 与 CANN 版本匹配 |
| OpenCV | >= 4.5 |
| Pillow | >= 9.0 |
| NumPy | >= 1.21 |
# 基础依赖
pip install torch torchvision torch-npu
pip install opencv-python pillow numpy将以下模型文件放置于项目根目录(或 --model-dir 指定目录):
| 文件 | 阶段 | 说明 |
|---|---|---|
rapidocr_det_mobile.pt | 检测 | 文本区域检测(DBNet) |
rapidocr_cls_mobile.pt | 分类 | 文本方向分类(0/180度) |
rapidocr_rec_mobile.pt | 识别 | 文本内容识别(CRNN) |
模型由 ONNX 经
fix_hardswish_onnx.py修复后转换得到,确保 HardSwish 算子在 NPU 上正确执行。
# 1. 克隆/拷贝项目代码到目标环境
# 2. 确认模型文件已到位
ls *.pt
# 3. 验证 NPU 可用
python -c "import torch; print(torch.npu.is_available())"
# 4. 运行单图推理
python inference.py -i sample.jpg -o ./results --visualize
# 5. 运行批量推理
python inference.py -i ./images/ -o ./resultsinference.py面向生产环境的推理入口,支持单图/批量输入、可视化输出、JSON 结构化结果。
python inference.py \
--input ./images/ \
--output ./results \
--det-batch 32 \
--rec-batch 512 \
--cls-batch 512 \
--workers 8 \
--visualize \
--warmup 2参数说明:
| 参数 | 默认值 | 说明 |
|---|---|---|
--input / -i | 必填 | 输入图片路径或目录 |
--output / -o | ./results | 输出目录 |
--det-batch | 32 | 检测模型 batch size |
--rec-batch | 512 | 识别模型 batch size |
--cls-batch | 512 | 分类模型 batch size |
--workers | 8 | 预处理/后处理并行线程数 |
--visualize / -v | 关闭 | 保存带检测框的可视化图片 |
--warmup | 2 | NPU warmup 轮数 |
--model-dir | 脚本所在目录 | 模型文件目录 |
输出结构:
results/
├── results.json # 结构化推理结果
└── visualized/ # 可视化图片(--visualize 时生成)results.json 包含每张图片的检测框坐标、分类/识别预测索引及性能元数据。
eval_precision.py端到端精度对比脚本,CPU 作为基准,NPU 作为目标,对比 det/rec/cls 三阶段输出。
python eval_precision.py评测指标与通过标准:
| 指标 | 通过阈值 |
|---|---|
| 检测框数量匹配率 | >= 99% |
| 检测框坐标平均误差 | < 2 px |
| 分类准确率 | >= 99% |
| 识别准确率 | >= 99% |
结果同时输出到终端与 logs/precision_eval.log。
eval_performance.py固定最优 batch size(det=32, rec=512, cls=512),在测试集上运行多轮取平均,输出完整性能报告。
python eval_performance.py关键性能指标:
| 指标 | 说明 |
|---|---|
| 总 wall-clock 时间 | 端到端耗时(含预处理/推理/后处理) |
| 吞吐量 | images/sec |
| 各阶段耗时拆解 | det/rec/cls 预处理、推理、后处理 |
结果同时输出到终端与 logs/performance_eval.log。
以下数据基于 Ascend 910B 单卡,batch size det=32/rec=512/cls=512,ICDAR2015 测试集(500 张图),测试时间 2026-05-28。
| 场景 | 耗时 | 吞吐 | 备注 |
|---|---|---|---|
eval_performance.py | 6.54s | 77.68 images/sec | 纯 NPU 性能评测,5 次平均 |
eval_precision.py(优化后) | 10.87s | 46.01 images/sec | 含 CPU vs NPU 对比开销 |
eval_precision.py(优化前) | 22.90s | 21.83 images/sec | 顺序预处理/后处理 |
| CPU 基准 | 439.73s | 1.14 images/sec | 纯 CPU 推理 |
NPU vs CPU 加速比:40.47x
优化收益:端到端时间从 22.9s 降至 10.9s(-52%),精度结果保持一致。
| 阶段 | 平均耗时 | 占比 |
|---|---|---|
| det_total(检测) | 4.38s | 40% |
| det_inference | 3.38s | 31% |
| rec_cls_total(分类+识别并行) | 1.99s | 18% |
| det_preprocess_wait | 0.58s | 5% |
| det_postprocess | 0.26s | 2% |
| 其他(crop、preprocess 等) | 0.40s | 4% |
实际数值请运行 eval_performance.py 获取。
以下将本方案 NPU 实测数据与 RapidOCR 官方 CPU 基线(i5-10400F,16GB,800×600 常规图文)进行横向对比。
| 指标 | 官方 CPU 基线 | 本方案 NPU(Ascend 910B) | 达标判定 |
|---|---|---|---|
| 单图推理耗时 | 85–212 ms/张(均值 ~120 ms) | ~13 ms/张(wall-clock,500 图平均) | ✅ 达标。NPU 端到端速度约为官方 CPU 的 9.2 倍。 |
| 端到端吞吐 | ~8.3 images/sec(按 120 ms 推算) | 77.68 images/sec | ✅ 达标。吞吐提升约 9.4 倍。 |
| 准确率(中文场景) | 98.5%–99.2%(印刷体/清晰屏幕) | 检测 100% / 分类 99.8% / 识别 97.0%(CPU vs NPU argmax 一致性,ICDAR2015) | ⚠️ 部分达标。检测与分类完全达标;识别端到端一致性 97%,略低于 99% 阈值。注意:当前测试集为 ICDAR2015(英文为主),且无标注真值,绝对准确率需在实际中文业务场景下进一步验证。 |
| 模型体积(Det+Rec) | ~10 MB(v5 mobile) | ~15.7 MB(Det ~4.9 MB + Rec ~10.8 MB,不含 Cls) | ⚠️ 基本达标。体积略大于官方 v5 mobile,主要因 .pt 格式及 Rec 模型差异,仍在轻量级范畴。 |
| 内存占用(稳态) | 220–280 MB(CPU) | 未测量 | ❓ 待补充。需在 NPU 环境补充 torch_npu 显存+系统内存占用数据。 |
| 速度 vs PaddleOCR | 快 1.6–2×(同环境,v5 vs v4) | 未与 PaddleOCR NPU 版直接对比 | ❓ 待补充。如需对标,建议补充 PaddleOCR + CANN 的 NPU 基准。 |
rapidocr_npu_verify.py 验证通过),但端到端 argmax 一致性为 97%,存在 3% 的单字符差异。若业务场景对识别准确率要求 ≥ 99%,建议尝试调整 ACL_PRECISION_MODE 或 ACL_OP_SELECT_IMPL_MODE 进一步调优(参考 test_npu_precision_opts.py)。.
├── inference.py # 生产推理入口
├── eval_precision.py # 精度评测脚本
├── eval_performance.py # 性能评测脚本
├── rapidocr_npu_verify.py # 单图精度验证(开发调试用)
├── rapidocr_npu_e2e_batch.py # 端到端批量验证(开发调试用)
├── rapidocr_npu_e2e_optimized.py # 优化版端到端验证(开发调试用)
├── batch_size_tuning.py # Batch size 调优(开发调试用)
├── test_npu_precision_opts.py # NPU 精度选项探索(开发调试用)
├── fix_hardswish_onnx.py # ONNX HardSwish 修复工具
├── logs/ # 评测日志输出目录
├── results/ # 推理结果输出目录
├── *.pt # 模型文件
└── readme.md # 本文档ACL_PRECISION_MODE 或 ACL_OP_SELECT_IMPL_MODE(参考 test_npu_precision_opts.py)--rec-batch 或 --cls-batch。fix_hardswish_onnx.py 修复后的模型。模型与代码遵循各自原始许可证。本项目适配代码仅供昇腾 NPU 部署参考。