YOLO26
1 概述¶
1.1 背景介绍¶
yolo26是一种先进的实时目标检测算法, 原生支持无非极大值抑制(nms-free)机制, 它在保持快速检测速度的同时, 进一步提高了检测的准确性和鲁棒性。yolo26官方有提供多种不同大小的检测模型:n、s、m、l、x, 这些开源模型的精度如下:

详情可参考yolo26官方说明:
https://github.com/ultralytics/ultralytics/tree/v8.4.37
yolo26开源模型下载地址如下:
1.2 使用说明¶
Linux SDK-alkaid中默认带了已经预先转换好的离线模型及板端示例, 相关文件路径如下:
-
板端示例程序路径
Linux_SDK/sdk/verify/opendla/source/detection/yolo26 -
板端离线模型路径
Linux_SDK/project/board/${chip}/dla_file/ipu_open_models/detection/yolo26n_640x640.img -
板端测试图像路径
Linux_SDK/sdk/verify/opendla/source/resource/bus.jpg
如果用户不需要转换模型可直接跳转至第3章节。
2 模型转换¶
2.1 onnx模型转换¶
-
python环境搭建
$conda create -n yolo26 python==3.10 $conda activate yolo26 $git clone https://github.com/ultralytics/ultralytics $cd ultralytics $pip install -e . -i https://pypi.tuna.tsinghua.edu.cn/simple注意:这里提供的python环境搭建, 仅作为参考示例, 具体搭建过程请参考官方源码运行教程:
https://docs.ultralytics.com/quickstart/ -
模型测试
-
编写模型测试脚本
predict.pyfrom ultralytics import YOLO # Load a pretrained YOLO26n model model = YOLO("yolo26n.pt") # Run inference on 'bus.jpg' with arguments # Use one-to-one head (default, no NMS required) model.predict("./ultralytics/assets/bus.jpg", save=True, imgsz=640, conf=0.5) # Use one-to-many head (requires NMS) model.predict("./ultralytics/assets/bus.jpg", save=True, imgsz=640, conf=0.5, end2end=False) -
运行模型测试脚本, 确保yolo26环境配置正确。
$python predict.py
具体可参考yolo26官方测试文档
https://docs.ultralytics.com/zh/models/yolo26/#usage-examples -
-
模型导出
-
编写模型转换脚本
export.py:import os import sys from ultralytics import YOLO model = YOLO("yolo26n.pt") # Use one-to-one head (default, no NMS required) model.export(format="onnx", imgsz=[640,640], simplify=True) # Use one-to-many head (requires NMS) model.export(format="onnx", imgsz=[640,640], simplify=True, end2end=False) -
运行模型转换脚本, 会在当目录下生成yolo26n.onnx模型
$python export.py
-
2.2 离线模型转换¶
2.2.1 预&后处理说明¶
-
预处理
转换成功的yolo26n.onnx模型输入信息如下图所示, 要求输入图像的尺寸为 (1, 3, 640, 640), 此外需要将像素值归一化到 [0, 1] 范围内。

-
后处理
yolo26具有双头架构, 为不同的部署场景提供了灵活性: - 一对一头部(默认):yolo26n.onnx模型输出信息如下图所示, 生成无需 NMS 的端到端预测,输出维度为(1, 300, 6), 其中 300 是检测框的数量, 6包括4个边界框坐标、类别概率和类别索引。

- 一对多头部:yolo26n_one2many.onnx模型输出信息如下图所示, 生成需要 NMS 后处理的传统 YOLO 输出, 输出维度为(1, 84, 8400), 其中 8400 是候选框的数量, 84包括4个边界框坐标和80个类别概率。获取到模型输出的候选框后, 需要对所有候选框的类别进行判断以及NMS非极大值抑制操作后才能输出正确的坐标框。

2.2.2 offline模型转换流程¶
注意:1)OpenDLAModel对应的是压缩包image-dev_model_convert.tar解压之后的smodel文件。2)转换命令需要在docker环境下运行, 请先根据Docker开发环境教程, 加载SGS Docker环境。
-
拷贝onnx模型到转换代码目录
$cp ultralytics/yolo26n.onnx OpenDLAModel/detection/yolo26/onnx $cp ultralytics/yolo26n_one2many.onnx OpenDLAModel/detection/yolo26/onnx -
转换命令
$cd IPU_SDK_Release/docker $bash run_docker.sh #进入到docker环境下的OpenDLAModel目录 $cd /work/SGS_XXX/OpenDLAModel #一对一头部 $bash convert.sh -a detection/yolo26 -c config/detection_yolo26.cfg -p SGS_IPU_Toolchain(绝对路径) -s false #一对多头部 $bash convert.sh -a detection/yolo26 -c config/detection_yolo26_one2many.cfg -p SGS_IPU_Toolchain(绝对路径) -s false -
最终生成的模型地址
output/${chip}_${时间}/yolo26n_640x640.img output/${chip}_${时间}/yolo26n_640x640_fixed.sim output/${chip}_${时间}/yolo26n_640x640_float.sim output/${chip}_${时间}/yolo26n_one2many_640x640.img output/${chip}_${时间}/yolo26n_one2many_640x640_fixed.sim output/${chip}_${时间}/yolo26n_one2many_640x640_float.sim
2.2.3 关键脚本参数解析¶
- input_config.ini
[INPUT_CONFIG]
inputs = images; #onnx 输入节点名称, 如果有多个需以“,”隔开;
training_input_formats = RGB; #模型训练时的输入格式, 通常都是RGB;
input_formats = YUV_NV12; #板端输入格式, 可以根据情况选择BGRA或者YUV_NV12;
quantizations = TRUE; #打开输入量化, 不需要修改;
mean_red = 0; #均值, 跟模型预处理相关, 根据实际情况配置;
mean_green = 0; #均值, 跟模型预处理相关, 根据实际情况配置;
mean_blue = 0; #均值, 跟模型预处理相关, 根据实际情况配置;
std_value = 255; #方差, 跟模型预处理相关, 根据实际情况配置;
[OUTPUT_CONFIG]
outputs = output0; #onnx 输出节点名称, 如果有多个需以“,”隔开;
dequantizations = TRUE; #是否开启反量化, 根据实际需求填写, 建议为TRUE。设为False, 输出为int16; 设为True, 输出为float32
- detection_yolo26.cfg
[YOLO26]
CHIP_LIST=pcupid #平台名称, 必须和板端平台一致, 否则模型无法运行
Model_LIST=yolo26n #输入onnx模型名称
INPUT_SIZE_LIST=640x640 #模型输入分辨率
INPUT_INI_LIST=input_config_cpu.ini #配置文件
CLASS_NUM_LIST=0 #填0即可
SAVE_NAME_LIST=yolo26n_640x640.img #输出模型名称
QUANT_DATA_PATH=quant_data #量化图片路径
2.3 模型仿真¶
-
获取float/fixed/offline模型输出
$bash convert.sh -a detection/yolo26 -c config/detection_yolo26.cfg -p SGS_IPU_Toolchain(绝对路径) -s true执行上述命令后, 会默认将
float模型的输出tensor保存到detection/yolo26/log/output路径下的txt文件中。此外, 在detection/yolo26/convert.sh脚本中也提供了fixed和offline的仿真示例, 用户在运行时可以通过打开注释代码块, 分别获取fixed和offline模型输出。 -
模型精度对比
在保证输入和上述模型相同的情况下, 进入2.1章节搭建好的环境, 在
ultralytics/ultralytics/nn/modules/head.py文件的第222行处添加打印:print(torch.cat([boxes, scores, conf], dim=-1))获取pytorch模型对应节点的输出tensor, 进而和float、fixed、offline模型进行对比。
3 板端部署¶
3.1 程序编译¶
示例程序编译之前需要先根据板子(nand/nor/emmc, ddr型号等)选择deconfig进行sdk整包编译, 具体可以参考alkaid sdk sigdoc《开发环境搭建》文档。
-
编译板端yolo26示例。
$cd sdk/verify/opendla $make clean && make source/detection/yolo26 -j8 -
最终生成的可执行文件地址
sdk/verify/opendla/out/${AARCH}/app/prog_detection_yolo26
3.2 运行文件¶
运行程序时, 需要先将以下几个文件拷贝到板端
- prog_detection_yolo26
- bus.jpg
- yolo26n_640x640.img
3.3 运行说明¶
-
Usage:
./prog_detection_yolo26 -i image -m model [-t threshold](执行文件使用命令) -
Required Input:
- image: 图像文件夹/单张图像路径
- model: 需要测试的offline模型路径
-
Optional Input:
- threshold: 检测阈值(0.0~1.0, 默认为0.5)
-
Typical output:
>./prog_detection_yolo26 -m ./yolo26n_640x640.img -i ./images/bus.jpg demo_args: inImages=./; modelPath=./yolo26n_640x640.img; threshold=0.5 found 1 images! [0] processing ./images/bus.jpg... model invoke time: 29.250000 ms post process time: 0.179000 ms outImagePath: ./output/22545/bus.png

4 算法优化¶
4.1 后处理优化¶
-
存在问题
官方的yolo26(一对多头部)转换出来的offline模型cpu占用率较高。其根本原因在于:yolo26(一对多头部)默认输出8400个候选检测框(Bounding Box), 在COCO数据集80类别检测场景下, 每个候选框需执行80次类别置信度计算, 即总计算量达到672,000次/帧(8400×80), 会导致cpu的loading一直处在一个较高的状态。
-
解决方案
通过SGS_IPU_Toolchain构建后处理模型(如下图所示), 然后跟官方的yolo26(一对多头部)模型进行拼接。这样就可以将遍历所有候选框的计算放到ipu上进行, 同时不改变yolo26(一对多头部)官方模型的结构。因此用户在转换模型以及运行板端示例时:
-
注意 通过SGS_IPU_Toolchain构建IPU算子的方式需要用户对IPU Toolchain较为熟悉, 具体可参考IPU Toolchain使用文档
