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”即可获取项目源码

您可能感兴趣的与本文相关的镜像

Yolo-v8.3

Yolo-v8.3

Yolo

YOLO(You Only Look Once)是一种流行的物体检测和图像分割模型,由华盛顿大学的Joseph Redmon 和Ali Farhadi 开发。 YOLO 于2015 年推出,因其高速和高精度而广受欢迎

<think>我们正在讨论如何在NPU上使用ONNX Runtime进行模型推理。根据引用[1]和[2],ONNX Runtime是一个跨平台的推理引擎,支持多种硬件加速,包括NPU。以下是具体步骤: 1. **环境准备**:确保目标设备(NPU)的驱动和运行时环境已安装。例如,如果使用华为NPU,需要安装CANN(Compute Architecture for Neural Networks)工具包[^1]。 2. **安装ONNX Runtime**:选择支持NPU的ONNX Runtime版本。ONNX Runtime提供了针对特定硬件加速的构建版本。例如,对于华为昇腾NPU,可以使用`onnxruntime-aisw`包(Ascend Inference Software)[^2]。 ```bash pip install onnxruntime-aisw ``` 3. **模型转换**:将训练好的模型转换为ONNX格式(如果尚未转换)。可以使用PyTorch或TensorFlow等框架的导出功能。 4. **推理代码**:在Python代码中,指定NPU作为执行提供者(Execution Provider)。示例代码如下: ```python import onnxruntime as ort # 指定NPU作为执行提供者(例如'HuaweiAscendNPU') providers = ['HuaweiAscendNPUExecutionProvider'] # 根据实际NPU厂商调整 # 加载模型 session = ort.InferenceSession('model.onnx', providers=providers) # 准备输入数据 inputs = {...} # 根据模型输入结构填充 # 执行推理 outputs = session.run(None, inputs) ``` 5. **性能优化**:ONNX Runtime内置了针对NPU的图优化技术。此外,可以调整线程数、内存分配等参数[^2]。 §§相关问题§§ 1. 如何验证ONNX Runtime是否成功调用了NPU? 2. ONNX Runtime支持哪些厂商的NPU? 3. 在NPU上部署ONNX模型时常见的性能瓶颈有哪些?</think>### 如何在NPU设备上使用ONNX Runtime进行深度学习模型推理 要在NPU(神经处理单元)上使用ONNX Runtime进行模型推理,需遵循以下步骤: #### 1. **环境准备** - **安装NPU驱动**:确保目标设备已安装NPU厂商提供的驱动和工具链(如华为昇腾的CANN工具包[^1])。 - **选择ONNX Runtime版本**:安装支持NPU的ONNX Runtime版本(如`onnxruntime-aisw`专为昇腾NPU优化): ```bash pip install onnxruntime-aisw # 华为昇腾NPU专用版本 ``` #### 2. **模型转换与优化** - **导出ONNX模型**:从训练框架(PyTorch/TensorFlow)导出标准ONNX格式模型: ```python torch.onnx.export(model, input_sample, "model.onnx") ``` - **NPU专用优化**:使用厂商工具优化模型(如昇腾的`atc`工具转换模型格式): ```bash atc --model=model.onnx --output=model_ascend --soc_version=Ascend310 ``` #### 3. **推理代码实现** ```python import onnxruntime as ort # 指定NPU作为执行提供者 providers = [ ('AscendExecutionProvider', { # 华为昇腾NPU 'device_id': 0, # 指定设备ID 'npu_freq_high': 1 # 启用高频模式 }) ] # 加载优化后的模型 session = ort.InferenceSession("model_ascend.om", providers=providers) # 准备输入数据 (示例) input_data = np.random.randn(1, 3, 224, 224).astype(np.float32) # 执行推理 outputs = session.run(None, {"input_name": input_data}) ``` #### 4. **关键配置项 | 参数 | 作用 | 示例值 | |---------------------|-----------------------------|---------------| | `device_id` | 指定NPU设备ID | `0` | | `npu_freq_high` | 启用高频模式提升性能 | `1` (启用) | | `enable_custom_kernel` | 启用自定义算子优化 | `True` | #### 5. **性能优化建议 - **算子融合**:使用ONNX Runtime的图优化功能自动合并算子 - **量化加速**:通过NPU支持的INT8量化减少计算量 - **流水线并行**:对多NPU设备使用`data_parallel_size`参数分配负载 > **注意**:不同NPU厂商(如华为昇腾、高通Cloud AI)需使用对应的Execution Provider名称,具体参考厂商文档[^2]。 --- ### 常见问题解决 1. **Provider未找到错误** ⇒ 确认安装的ONNX Runtime包含NPU支持版本 2. **算子不支持** ⇒ 使用厂商提供的自定义算子库或简化模型结构 3. **性能低于预期** ⇒ 启用`enable_custom_kernel`并检查内存带宽瓶颈
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值