ONNXRUNTIME-CANN部署ONNX模型

Atlas Detection ONNX Project

这是一个基于华为 CANN(Compute Architecture for Neural Networks)推理引擎的 YOLOv3 目标检测项目。本项目展示了如何使用 ONNX Runtime 和 CANN 执行提供程序在昇腾 AI 处理器上运行 ONNX 模型。

License

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

项目结构

├── any_utils
│   └── __pycache__
├── kernel_meta
│   ├── kernel_meta_13542949761052527466
│   │   └── kernel_meta
│   └── kernel_meta_temp_13542949761052527466
├── labels
├── license
├── model_class
├── models
├── outputs
│   ├── images
│   └── videos
└── sources
    ├── images
    └── videos

17 directories

环境要求

  • Python 3.9+
  • ONNX Runtime
  • OpenCV
  • NumPy
  • CANN ToolKit

核心实现细节

1. 模型加载器 (ModelLoader)

ModelLoader 类实现了模型的加载和推理过程,主要包含以下功能:

class ModelLoader:
    def __init__(self, model_path, logger, device='cann', device_id=0, 
                 conf_threshold=0.5, iou_threshold=0.45):
        self.model_path = model_path
        self.device = device
        self.device_id = device_id
        self.conf_threshold = conf_threshold
        self.iou_threshold = iou_threshold
        ...

关键参数说明:

  • device: 推理设备选择(‘cann’ 或 ‘cpu’)
  • device_id: 设备ID
  • conf_threshold: 置信度阈值,用于过滤低置信度的检测框
  • iou_threshold: IoU阈值,用于非极大值抑制(NMS)

2. 预处理流程

图像预处理是保证模型性能的关键步骤,包括:

  • 图像缩放到模型输入尺寸
  • 归一化处理
  • 数据格式转换

3. 后处理算法

后处理流程包括以下主要步骤:

  1. 置信度过滤:
def postprocess(self, outputs):
    predictions = np.squeeze(outputs[0])
    obj_conf = predictions[:, 4]
    predictions = predictions[obj_conf > self.conf_threshold]
  1. 类别置信度计算:
predictions[:, 5:] *= obj_conf[:, np.newaxis]
scores = np.max(predictions[:, 5:], axis=1)
  1. 非极大值抑制(NMS):

any_utils.utils 模块调用 nms 函数进行冗余框过滤。

4. CANN 推理优化

CANN推理引擎的优势:

  • 支持昇腾AI处理器的硬件加速
  • 优化的算子实现
  • 高效的内存管理

推理结果展示

2025-08-21 03:11:40,888 - __main__ - INFO - [INFO] Initializing ONNX Runtime session with model: ./models/yolov3.onnx
2025-08-21 03:11:40,888 - __main__ - INFO - [INFO] Use CANNExecutionProvider for ONNX Runtime, core device id: 0.
2025-08-21 03:11:43,783 - __main__ - INFO - [INFO] ONNX Runtime session initialized successfully.
2025-08-21 03:11:44,258 - __main__ - INFO - [INFO] Processed image: 45.jpg, Detected items: 6
2025-08-21 03:11:44,260 - __main__ - INFO - [INFO] Saved output image to: ./outputs/images/out_45.jpg
2025-08-21 03:11:44,275 - __main__ - INFO - [INFO] Processed image: 50.jpg, Detected items: 2
2025-08-21 03:11:44,276 - __main__ - INFO - [INFO] Saved output image to: ./outputs/images/out_50.jpg
2025-08-21 03:11:44,299 - __main__ - INFO - [INFO] Processed image: cat.jpg, Detected items: 1
2025-08-21 03:11:44,306 - __main__ - INFO - [INFO] Saved output image to: ./outputs/images/out_cat.jpg
2025-08-21 03:11:44,329 - __main__ - INFO - [INFO] Processed image: 0.jpg, Detected items: 1
2025-08-21 03:11:44,336 - __main__ - INFO - [INFO] Saved output image to: ./outputs/images/out_0.jpg

测试图片1 (45.jpg)

  • 检测到物体数量:6
  • 输出文件:out_45.jpg
    在这里插入图片描述

测试图片2 (50.jpg)

  • 检测到物体数量:2
  • 输出文件:out_50.jpg
    在这里插入图片描述

测试图片3 (cat.jpg)

  • 检测到物体数量:1
  • 输出文件:out_cat.jpg
    在这里插入图片描述

测试图片4 (0.jpg)

  • 检测到物体数量:1
  • 输出文件:out_0.jpg
    在这里插入图片描述

使用方法

  1. 准备环境:
# 安装依赖
pip install onnxruntime-cann opencv-python numpy
  1. 准备模型:
  • 将转换好的YOLOv3 ONNX模型放入 models 目录
  1. 运行推理:
python run.py
  1. 查看结果:
  • 处理后的图像将保存在 outputs/images 目录
  • 处理日志将记录在 model_inference.log

性能优化

  1. 批量处理
  • 使用批处理模式可以提高 NPU 利用率
  • 根据设备内存大小调整批次大小
  1. 图像预处理优化
  • 使用 NPU 进行图像预处理
  • 减少 CPU 和 NPU 之间的数据传输
  1. 模型量化
  • 考虑使用 INT8 量化提高性能
  • 权衡精度和速度的平衡

注意事项

  1. CANN 设备配置
  • 确保正确安装CANN驱动和运行时
  • 检查设备连接状态
  1. 内存管理
  • 处理大尺寸图片时注意内存使用
  • 及时释放不需要的资源
  1. 错误处理
  • 程序包含完整的日志记录
  • 异常处理机制确保程序稳定运行

引用

  • YOLO: https://pjreddie.com/darknet/yolo/
  • CANN: https://www.hiascend.com/software/cann

联系方式

获取项目源码

  • 公众号关注后回复“cannyolo3”即可获取项目源码
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值