YOLO系列网络模型是最为经典的one-stage算法,也是目前工业领域使用最多的目标检测网络,YOLOv5网络模型是YOLO系列的最新版本,在继承了原有YOLO网络模型优点的基础上,具有更优的检测精度和更快的推理速度。
YOLOv5版本不断迭代更新,不同版本的模型结构有所差异。比如Conv模块各版本差异示例如下:
yolov5版本 | Conv模块激活函数 |
---|---|
2.0 | LeakyRelu |
3.0 | LeakyRelu |
3.1 | hswish |
4.0 | SiLU |
5.0 | SiLU |
6.0 | SiLU |
6.1 | SiLU |
6.2 | SiLU |
7.0 | SiLU |
YOLOv5每个版本主要有4个开源模型,分别为YOLOv5s、YOLOv5m、YOLOv5l 和 YOLOv5x,四个模型的网络结构基本一致,只是其中的模块数量与卷积核个数不一致。YOLOv5s模型最小,其它的模型都在此基础上对网络进行加深与加宽。
url=https://github.com/ultralytics/yolov5
tag=v2.0/v3.1/v4.0/v5.0/v6.0/v6.1/v6.2/v7.0
model_name=yolov5
配套 | 版本 | 环境准备指导 |
---|---|---|
固件与驱动 | 22.0.4 | Pytorch框架推理环境准备 |
CANN | 6.0.0 | 推理应用开发学习文档 |
Python | 3.7.5 | - |
PyTorch | 1.10.1 | - |
说明:Atlas 300I Duo 推理卡请以CANN版本选择实际固件与驱动版本。 | \ | \ |
获取Pytorch
源码
git clone https://github.com/ultralytics/yolov5.git
cd yolov5
git checkout v2.0/v3.1/v4.0/v5.0/v6.0/v6.1/v6.2/v7.0 # 切换到所用版本
获取OM
推理代码
由于v7.0版本的开源yolov5模型,head层发生了变动,所以后处理也需要做相应修改
# 返回yolov5_for_pytorch目录
cd ..
# tag v7.0需要执行以下操作
git apply 7.0.patch
将推理部署代码放到yolov5
源码相应目录下。
Yolov5_for_Pytorch
└── common 放到yolov5下
├── util 模型/数据接口
├── quantify 量化接口
├── atc_cfg atc转模型配置文件
└── patch v2.0/v3.1/v4.0/v5.0/v6.0/v6.1/v6.2/v7.0 兼容性修改
├── model.yaml 放到yolov5下
├── pth2onnx.sh 放到yolov5下
├── onnx2om.sh 放到yolov5下
├── aipp.cfg 放到yolov5下
├── om_val.py 放到yolov5下
├── yolov5_preprocess_aipp.py 放到yolov5下
├── yolov5_preprocess.py 放到yolov5下
├── yolov5_postprocess.py 放到yolov5下
└── requirements.txt 放到yolov5下
安装依赖
请访问msit推理工具代码仓,根据readme文档进行工具安装surgeon组件。
pip3 install -r requirements.txt
yolov5
源码根目录下新建coco
文件夹,数据集放到coco
里,文件结构如下:coco
├── val2017
├── 00000000139.jpg
├── 00000000285.jpg
……
└── 00000581781.jpg
├── instances_val2017.json
└── val2017.txt
val2017.txt
中保存.jpg
的相对路径,请自行生成该txt
文件,文件内容实例如下:./val2017/00000000139.jpg
./val2017/00000000285.jpg
……
./val2017/00000581781.jpg
模型推理提供两种方式,区别如下:
nms
后处理脚本(nms_script
)
直接用官网export.py
导出onnx
模型,模型结构和官网一致,推理流程也和官方一致,NMS后处理采用脚本实现。
nms
后处理算子(nms_op
)
onnx
模型做了修改,增加后处理算子,将NMS
后处理的计算集成到模型中。后处理算子存在阈值约束,要求
conf>0.1
,由于其硬性要求,所以model.yaml文件默认设置conf_thres:0.4。使用nms_op方式,不需要修改model.yaml文件。将模型权重文件.pth
转换为.onnx
文件,再使用ATC
工具将.onnx
文件转为离线推理模型.om
文件。
获取权重文件
在链接中找到所需版本下载,也可以使用下述命令下载。
wget https://github.com/ultralytics/yolov5/releases/download/v${tag}/${model}.pt
${tag}
:模型版本,可选[2.0/3.1/4.0/5.0/6.0/6.1/6.2/7.0]
${model}
:模型大小,可选yolov5[n/s/m/l]
,当前未适配X导出ONNX
模型
运行bash pth2onnx.sh
导出动态shape的ONNX
模型,模型参数在model.yaml中设置。
bash pth2onnx.sh --tag 6.1 --model yolov5s --nms_mode nms_script # nms_script
bash pth2onnx.sh --tag 6.1 --model yolov5s --nms_mode nms_op # nms_op
--tag
:模型版本,可选[2.0/3.1/4.0/5.0/6.0/6.1/6.2/7.0]
。--model
:模型大小,可选yolov5[n/s/m/l]
。--nms_mode
:模型推理方式,可选[nms_op/nms_script]
。nms_op
方式下,pth导出onnx模型过程中会增加NMS后处理算子,后处理算子的参数class_num
、conf_thres
和iou_thres
在model.yaml中设置。使用ATC
工具将ONNX
模型转OM
模型
3.1 配置环境变量
source /usr/local/Ascend/ascend-toolkit/set_env.sh
说明:
该脚本中环境变量仅供参考,请以实际安装环境配置环境变量。详细介绍请参见《CANN 开发辅助工具指南 (推理)》。
3.2 执行命令查看芯片名称(${soc_version}
)
npu-smi info
# 该设备芯片名为Ascend310P3 (自行替换)
回显如下:
+-------------------+-----------------+------------------------------------------------------+
| NPU Name | Health | Power(W) Temp(C) Hugepages-Usage(page) |
| Chip Device | Bus-Id | AICore(%) Memory-Usage(MB) |
+===================+=================+======================================================+
| 0 310P3 | OK | 15.8 42 0 / 0 |
| 0 0 | 0000:82:00.0 | 0 1074 / 21534 |
+===================+=================+======================================================+
| 1 310P3 | OK | 15.4 43 0 / 0 |
| 0 1 | 0000:89:00.0 | 0 1070 / 21534 |
+===================+=================+======================================================+
3.3 导出非量化OM
模型
运行onnx2om.sh
导出OM
模型。
bash onnx2om.sh --tag 6.1 --model yolov5s --nms_mode nms_script --bs 4 --soc Ascend310P3 # nms_script
bash onnx2om.sh --tag 6.1 --model yolov5s_nms --nms_mode nms_op --bs 4 --soc Ascend310P3 # nms_op
atc
命令参数说明(参数见onnx2om.sh
):
3.4 导出量化OM
模型(可选)
(1)量化存在精度损失,要使用实际数据集进行校准以减少精度损失。提供 generate_data.py 生成校准数据,calib_img_list.txt 中提供默认的校准数据,根据实际数据路径修改。运行脚本会新建calib_data
文件夹,将生成的数据bin文件放到该文件夹下。
python3 common/quantify/gen_calib_data.py
(2)导出OM
模型时设置--quantify
参数,使能模型量化,量化对性能的提升视模型而定,实际效果不同。
bash onnx2om.sh --tag 6.1 --model yolov5s --nms_mode nms_script --bs 4 --soc Ascend310P3 --quantify True # nms_script
bash onnx2om.sh --tag 6.1 --model yolov5s_nms --nms_mode nms_op --bs 4 --soc Ascend310P3 --quantify True # nms_op
(3)部分网络层量化后损失较大,可在 simple_config.cfg 中配置不需要量化的层名称,默认为空列表。skip_layers.cfg 中提供了参考写法,通常网络的首尾卷积层量化损失大些,其他版本可以用Netron打开模型,查找不需要量化的层名称。
ais-bench
推理工具ais-bench
工具获取及使用方式请点击查看 [ais_bench 推理工具使用文档]执行推理 & 精度验证
运行om_val.py
推理OM模型,模型参数在model.yaml中设置,结果默认保存在predictions.json
。
python3 om_val.py --tag 6.1 --model=yolov5s_bs4.om --nms_mode nms_script --batch_size=4 # nms_script
python3 om_val.py --tag 6.1 --model=yolov5s_nms_bs4.om --nms_mode nms_op --batch_size=4 # nms_op
--tag
:模型版本,可选[2.0/3.1/4.0/5.0/6.0/6.1/6.2/7.0]
。--model
:模型大小,可选yolov5[n/s/m/l]
。--nms_mode
:模型推理方式,可选[nms_op/nms_script]
。--batch_size
: 模型推理batch大小,默认4
。--cfg_file
:模型推理参数设置,默认读取文件model.yaml。性能验证
可使用ais_infer
推理工具的纯推理模式验证不同batch_size
的OM
模型的性能,参考命令如下:
python3 -m ais_bench --model=yolov5s_bs4.om --loop=1000 --batchsize=4 # nms_script
python3 -m ais_bench --model=yolov5s_nms_bs4.om --loop=1000 --batchsize=4 # nms_op
调用ACL接口推理计算,性能&精度参考下列数据。
方式一 nms后处理脚本(nms_script)
模型tag | 芯片型号 | 最优Batch | 数据集 | 阈值 | 精度 (mAP@0.5) | OM模型性能 (fps) |
---|---|---|---|---|---|---|
2.0 | 300I PRO | 4 | coco val2017 | conf=0.001 iou=0.6 | 55.3 | 998.004 |
3.1 | 300I PRO | 4 | coco val2017 | conf=0.001 iou=0.6 | 56.5 | 772.670 |
4.0 | 300I PRO | 4 | coco val2017 | conf=0.001 iou=0.6 | 55.3 | 884.088 |
5.0 | 300I PRO | 4 | coco val2017 | conf=0.001 iou=0.6 | 55.5 | 881.139 |
6.0 | 300I PRO | 4 | coco val2017 | conf=0.001 iou=0.6 | 55.9 | 737.037 |
6.1 | 300I PRO | 4 | coco val2017 | conf=0.001 iou=0.6 | 56.9 | 739.736 |
6.2 | 300I PRO | 4 | coco val2017 | conf=0.001 iou=0.6 | 56.6 | 789.77 |
7.0 | 300I PRO | 4 | coco val2017 | conf=0.001 iou=0.6 | 56.9 | 825.7 |
方式二 nms后处理算子(nms_op)
模型tag | 芯片型号 | 最优Batch | 数据集 | 阈值 | 精度 (mAP@0.5) | OM模型性能 (fps) |
---|---|---|---|---|---|---|
2.0 | 300I PRO | 8 | coco val2017 | conf=0.4 iou=0.5 | 40.9 | 902.541 |
3.1 | 300I PRO | 8 | coco val2017 | conf=0.4 iou=0.5 | 42.3 | 728.035 |
4.0 | 300I PRO | 8 | coco val2017 | conf=0.4 iou=0.5 | 40.5 | 862.770 |
5.0 | 300I PRO | 8 | coco val2017 | conf=0.4 iou=0.5 | 40.7 | 860.746 |
6.0 | 300I PRO | 8 | coco val2017 | conf=0.4 iou=0.5 | 41.2 | 876.578 |
6.1 | 300I PRO | 8 | coco val2017 | conf=0.4 iou=0.5 | 43.4 | 881.867 |
6.2 | 300I PRO | 8 | coco val2017 | conf=0.4 iou=0.5 | 43.4 | 780.09 |
7.0 | 300I PRO | 8 | coco val2017 | conf=0.4 iou=0.5 | 44.6 | 744.55 |
数据预处理,将原始数据转换为模型输入的数据 执行yolov5_preprocess.py脚本,完成预处理
python3 yolov5_preprocess.py --data_path="./coco" --nms_mode nms_script --tag 6.1
--data_path
:coco数据集的路径--nms_mode
:模型推理方式,可选[nms_op/nms_script]
, 默认nms_script
--tag
:模型版本,可选[2.0/3.1/4.0/5.0/6.0/6.1/6.2/7.0]
执行完后,会在当前目录下生成./prep_data文件夹用于储存预处理完的二进制数据,并且生成path_list.npy用于储存图片的路径,生成shapes_list.npy用于储存图片原始shape数据集推理 目前ais_bench已经支持多卡推理,若执行下述命令报错,请重新安装最新ais_bench
# nms_script
python3 -m ais_bench --m yolov5s_bs4.om --input ./prep_data --output ./results --output_dirname om_output --device 0,1
# nms_op
python3 -m ais_bench --m yolov5s_bs4.om --input ./prep_data,./img_info --output ./results --output_dirname om_output --device 0,1
--m
:om模型的路径--input
:预处理生成的./prep_data的路径,如果使用nms_op则需要增加./img_info路径--output
:推理结果保存的地址,会在./results下生成子目录--output_dirname
:推理结果子目录名--device
:现支持多卡推理后处理和精度验证,将推理结果转换为字典并储存进json文件,用于计算精度
python3 yolov5_postprocess.py --nms_mode nms_script --ground_truth_json "./coco/instances_val2017.json" --output "./results/om_output/device0_0" --onnx yolov5s.onnx
--ground_truth_json
:coco数据集标杆文件--output
:推理结果保存的路径,需要指定到bin文件所在目录。单卡推理时路径为./results/om_output--onnx
:为onnx模型路径--nms_mode
:模型推理方式,可选[nms_op/nms_script]
, 默认nms_script
在模型输入端插入aipp
运行onnx2om.sh
导出OM
模型。
bash onnx2om.sh --tag 6.1 --model yolov5s --nms_mode nms_script --bs 4 --soc Ascend310P3 --with_aipp True # nms_script
bash onnx2om.sh --tag 6.1 --model yolov5s_nms --nms_mode nms_op --bs 4 --soc Ascend310P3 --with_aipp True # nms_op
由于插入aipp算子后,模型输入会发生改变,需要调用yolov5_preprocess_aipp.py生成预处理数据集prep_data_aipp
python3 yolov5_preprocess_aipp.py --data_path "./coco"
--data_path
:coco数据集所在路径。推理
python3 -m ais_bench --m yolov5s_bs4.om --input ./prep_data --output ./results --output_dirname om_output --device 0,1
--m
:om模型的路径--input
:预处理生成的./prep_data的路径--output
:推理结果保存的地址,会在./results下生成子目录--output_dirname
:推理结果子目录名--device
:现支持多卡推理后处理和精度验证,将推理结果转换为字典并储存进json文件,用于计算精度
python3 yolov5_postprocess.py --nms_mode nms_script --ground_truth_json "./coco/instances_val2017.json" --output "./results/om_output/device0_0" --onnx yolov5s.onnx
--ground_truth_json
:coco数据集标杆文件--output
:推理结果保存的路径,需要指定到bin文件所在目录。单卡推理时路径为./results/om_output--onnx
:为onnx模型路径常见问题可参考 FAQ
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。