Ascend-SACT/yolo-v5-captain
模型介绍文件和版本Pull Requests讨论分析
下载使用量0

YOLOv5-推理模型部署指导

  1. 推理环境准备

昇腾镜像仓库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 -

  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下

  1. 准备数据集

该模型使用 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

  1. 模型推理 模型推理提供两种方式,区别如下:

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文件。

  1. 模型转换

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算子配置,使用说明参考该链接

  1. 开始推理验证

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

  • 如果有多卡推理的需求,请跳过该步骤,om_val.py该脚本不支持多卡推理