YOLOv5-推理模型部署指导
昇腾镜像仓库ascend-pytorch镜像下载 docker pull --platform=arm64 swr.cn-south-1.myhuaweicloud.com/ascendhub/ascend-pytorch:24.0.0-A1-2.1.0-ubuntu20.04
配套 版本 环境准备指导 固件与驱动 24.1.0.3 Pytorch框架推理环境准备 CANN 8.0.0 推理应用开发学习文档 Python 3.10.13 - PyTorch 2.5.1 -
2.1 获取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 #切换到所用版本
2.2 获取OM推理代码
git clone https://gitcode.com/Ascend/modelzoo-GPL
cd built-in/ACL_Pytorch/Yolov5_for_Pytorch
由于v7.0版本的开源yolov5模型,head层发生了变动,所以后处理也需要做相应修改
cd .. git apply 7.0.patch
2.3 将推理部署代码放到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下
该模型使用 coco2017 val数据集 进行精度评估,在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_script方式,需要修改model.yaml文件,将其中的配置conf_thres:0.4和iou_thres:0.5修改为conf_thres:0.001和iou_thres:0.6,后续该方式下精度测试也是采用修改后的配置。
nms后处理算子(nms_op)
注意:为提升模型端到端推理性能,我们对上一步导出的onnx模型做了修改,增加后处理算子,将NMS后处理的计算集成到模型中。后处理算子存在阈值约束,要求 conf>0.1,由于其硬性要求,所以model.yaml文件默认设置conf_thres:0.4。使用nms_op方式,不需要修改model.yaml文件。
5.1 pt权重下载
将模型权重文件.pt转换为.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]
5.2 导出ONNX模型 运行bash pth2onnx.sh导出动态shape的ONNX模型,模型参数在model.yaml中设置。
bash pth2onnx.sh --tag 6.1 --model yolov5m --nms_mode nms_script # nms_script
bash pth2onnx.sh --tag 6.1 --model yolov5m --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中设置。
5.3 使用ATC工具将ONNX模型转OM模型
a. 执行命令查看芯片名称(${soc_version})
npu-smi info
该设备芯片名为Ascend910B3 (自行替换)
b. 导出非量化OM模型
运行onnx2om.sh导出OM模型。
bash onnx2om.sh --tag 6.1 --model yolov5m --nms_mode nms_script --bs 4 --soc Ascend910B3 # nms_script
bash onnx2om.sh --tag 6.1 --model yolov5m_nms --nms_mode nms_op --bs 4 --soc Ascend910B3 # nms_op
atc命令参数说明(参数见onnx2om.sh):
--model:ONNX模型文件
--output:输出的OM模型
--framework:5代表ONNX模型
--input_format:输入数据的格式
--input_shape:输入数据的shape
--soc_version:处理器型号
--log:日志级别
--compression_optimize_conf:模型量化配置,使用说明参考该链接
--enable_small_channel:输入端aipp算子配置,使用说明参考该链接
--insert_op_conf:输入端aipp算子配置,使用说明参考该链接
6.1 安装ais-bench推理工具 ais-bench工具获取及使用方式请点击查看 [ais_bench 推理工具使用文档]
如果有多卡推理的需求,请跳过该步骤,om_val.py该脚本不支持多卡推理
6.2 执行推理 & 精度验证 运行om_val.py推理OM模型,模型参数在model.yaml中设置,结果默认保存在predictions.json。
python3 om_val.py --tag 6.1 --model=yolov5m_bs4.om --nms_mode nms_script --batch_size=4 # nms_script
python3 om_val.py --tag 6.1 --model=yolov5m_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。
6.3 性能验证 可使用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