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: 设备IDconf_threshold: 置信度阈值,用于过滤低置信度的检测框iou_threshold: IoU阈值,用于非极大值抑制(NMS)
2. 预处理流程
图像预处理是保证模型性能的关键步骤,包括:
- 图像缩放到模型输入尺寸
- 归一化处理
- 数据格式转换
3. 后处理算法
后处理流程包括以下主要步骤:
- 置信度过滤:
def postprocess(self, outputs):
predictions = np.squeeze(outputs[0])
obj_conf = predictions[:, 4]
predictions = predictions[obj_conf > self.conf_threshold]
- 类别置信度计算:
predictions[:, 5:] *= obj_conf[:, np.newaxis]
scores = np.max(predictions[:, 5:], axis=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

使用方法
- 准备环境:
# 安装依赖
pip install onnxruntime-cann opencv-python numpy
- 准备模型:
- 将转换好的YOLOv3 ONNX模型放入
models目录
- 运行推理:
python run.py
- 查看结果:
- 处理后的图像将保存在
outputs/images目录 - 处理日志将记录在
model_inference.log
性能优化
- 批量处理
- 使用批处理模式可以提高 NPU 利用率
- 根据设备内存大小调整批次大小
- 图像预处理优化
- 使用 NPU 进行图像预处理
- 减少 CPU 和 NPU 之间的数据传输
- 模型量化
- 考虑使用 INT8 量化提高性能
- 权衡精度和速度的平衡
注意事项
- CANN 设备配置
- 确保正确安装CANN驱动和运行时
- 检查设备连接状态
- 内存管理
- 处理大尺寸图片时注意内存使用
- 及时释放不需要的资源
- 错误处理
- 程序包含完整的日志记录
- 异常处理机制确保程序稳定运行
引用
- YOLO: https://pjreddie.com/darknet/yolo/
- CANN: https://www.hiascend.com/software/cann
联系方式
- 邮箱📫:1145570610@qq.com
- 公众号:“CrazyNET”
获取项目源码
- 公众号关注后回复“cannyolo3”即可获取项目源码
473

被折叠的 条评论
为什么被折叠?



