基于 csg800/simple_symbol_det 的华为昇腾(Ascend)NPU 适配推理方案。原模型是一个基于 DBNet 架构的英文字母、数字、标点符号、数学符号、拼音、音标与 Emoji 检测模型,使用四千余种字体与随机背景合成数据集训练而成。本仓库提供其在 Ascend 910 NPU 上的完整推理脚本、精度验证与性能基准。
| 项目 | 说明 |
|---|---|
| 原始模型 | csg800/simple_symbol_det |
| 架构 | DBNet (Differentiable Binarization Network) |
| 输入 | 单通道灰度图 (1, H, W),[0, 1] 归一化,固定 640×640 |
| 输出 | 概率图 (H, W),Sigmoid 激活 |
| 原始框架 | PyTorch → ONNX (opset 16) |
| 适配框架 | ONNX → onnx2torch → torch_npu |
| 任务类型 | OCR 文字检测 / 符号检测 |
| 许可证 | Apache 2.0 |
| 组件 | 版本要求 | 备注 |
|---|---|---|
| NPU 硬件 | Ascend 910B / 910B2 / Atlas 800T A2 及以上 | 本验证基于 Ascend 910 (Ascend910_9362) |
| CANN | ≥ 8.0.RC1 | 本验证使用 CANN 8.5.1 |
| Python | ≥ 3.10 | 本验证使用 3.11 |
| torch | ≥ 2.1 | 需配合 torch_npu |
| torch_npu | ≥ 2.1 | Ascend NPU PyTorch 插件 |
| onnx | ≥ 1.14 | ONNX 模型解析 |
| onnx2torch | ≥ 1.5 | ONNX → PyTorch 模型转换 |
| opencv-python | ≥ 4.5 | 图像预处理与后处理 |
# 安装依赖
pip install torch torch_npu onnx onnx2torch opencv-python modelscopepip install modelscope
modelscope download --model csg800/simple_symbol_det# 单图推理(NPU)
python inference.py --image test_image.png --device npu --output result.png
# 单图推理(CPU,精度对照)
python inference.py --image test_image.png --device cpu --output result_cpu.png
# 性能基准测试
python inference.py --benchmark --device npu
# 详细输出模式
python inference.py --image test_image.png --device npu -vimport cv2
from inference import load_model, detect, draw_boxes, get_default_onnx_path
# 加载模型到 NPU
model = load_model(get_default_onnx_path(), device="npu:0")
# 读图并推理
image = cv2.imread("your_image.png")
boxes, prob_map = detect(image, model, device="npu:0", threshold=0.3)
# 可视化
vis = draw_boxes(image, boxes)
cv2.imwrite("output.png", vis)
print(f"检测到 {len(boxes)} 个文字区域")在 6 种不同输入尺寸和随机种子下,NPU 与 CPU 推理输出的精度对比:
| 测试配置 | 平均相对误差 | 最大绝对误差 | 余弦相似度 | 结论 |
|---|---|---|---|---|
| (1,1,640,640) seed=42 | 0.1920% | 0.00297 | 1.00000016 | PASS |
| (1,1,640,640) seed=123 | 0.2254% | 0.00387 | 0.99999942 | PASS |
| (2,1,640,640) seed=7 | 0.2097% | 0.00397 | 0.99999841 | PASS |
| (4,1,320,320) seed=99 | 0.1698% | 0.00256 | 0.99999948 | PASS |
| (1,1,1280,704) seed=55 | 0.1855% | 0.00296 | 0.99999945 | PASS |
| (1,1,1024,1024) seed=77 | 0.2013% | 0.00299 | 0.99999970 | PASS |
平均相对误差: 0.1973%,所有测试用例均满足精度要求(误差 < 1%),99.9% 以上像素的相对误差 < 1%。
运行精度验证:
python eval_precision.py在 Ascend 910 (Ascend910_9362) 上,不同 Batch Size 下的推理性能:
| 配置 | CPU 延迟 (ms) | NPU 延迟 (ms) | 加速比 | NPU 吞吐 (FPS) |
|---|---|---|---|---|
| batch1_640x640 | 865.83 | 6.68 | 129.70x | 149.80 |
| batch2_640x640 | 1918.05 | 8.36 | 229.55x | 119.68 |
| batch4_640x640 | 5238.78 | 27.68 | 189.29x | 36.13 |
| batch1_320x320 | 308.08 | 13.64 | 22.59x | 73.32 |
平均加速比: 142.78x。单图推理(640×640)NPU 延迟仅 6.68ms,吞吐约 150 FPS。
运行性能基准:
python eval_performance.py| 文件 | 说明 |
|---|---|
inference.py | NPU 推理主脚本,支持单图推理与性能基准 |
eval_precision.py | NPU vs CPU 精度验证脚本 |
eval_performance.py | NPU vs CPU 性能基准脚本 |
precision_report.json | 精度验证报告(JSON) |
performance_report.json | 性能基准报告(JSON) |
README.md | 本部署文档 |
本模型适配方案采用 ONNX → PyTorch 图转换 + torch_npu 后端 的技术路线:
onnx2torch 将原始 ONNX 模型转换为 PyTorch FX GraphModule.to("npu:0") 加载至 Ascend NPU适配过程中无需修改原始模型结构或权重,转换后模型在 NPU 上的输出与 CPU 参考输出高度一致。