yolov5模型部署指南
0.前言
本章节主要讲述如何获取yolov5单阶段目标检测算法,并将yolov5原始模型转换为ONNX格式。使用模型转换工具进行模型的转换,并将 转换后的模型部署到开发板上。
本章使用的软件列表:
- anaconda(Windows)
- Git(Windows)
- Tina SDK(Linux)
- 全志NPU扩展包(Linux)
- OpenCV库(Linux)
硬件列表: 百问网DongshanPI-AICT开发板
这里提供Source资源包:source(包含conda配置yolov5环境依赖包文件,端侧部署代码)
yolov5体验镜像:v853_linux_100ask_uart0.img (测试方法:yolov5 /etc/models/yolov5_model.nb <测试图像>
)
YOLOV5官方提供的V6.0版本的资源:
yolov5s ONNX模型文件:https://github.com/ultralytics/yolov5/releases/download/v6.0/yolov5s.onnx
yolov5s PT模型文件:https://github.com/ultralytics/yolov5/releases/download/v6.0/yolov5s.pt
yolov5-v6.0代码:https://github.com/ultralytics/yolov5/archive/refs/tags/v6.0.zip
yolov5搭建环境指导:
1.配置yolov5环境
yolov5官方网址为:https://github.com/ultralytics/yolov5
使用Git工具在任意目录下获取源码V6.0版本,输入
git clone -b v6.0 https://github.com/ultralytics/yolov5
如果您使用Git下载出现问题,也可以直接点击下面网址直接下载源码压缩包,下载完成解压即可正常使用。
https://github.com/ultralytics/yolov5/archive/refs/tags/v6.0.zip
等待下载完成,下载完成后会在当前目录下,查看到yolov5项目文件夹
100askTeam@DESKTOP-F46NFJT MINGW64 /d/Programmers/ModelDeployment/2.yolov5
$ ls
yolov5/
100askTeam@DESKTOP-F46NFJT MINGW64 /d/Programmers/ModelDeployment/2.yolov5
$ cd yolov5/
100askTeam@DESKTOP-F46NFJT MINGW64 /d/Programmers/ModelDeployment/2.yolov5/yolov5 (master)
$ ls
CITATION.cff README.zh-CN.md detect.py requirements.txt tutorial.ipynb
CONTRIBUTING.md benchmarks.py export.py segment/ utils/
LICENSE classify/ hubconf.py setup.cfg val.py
README.md data/ models/ train.py
打开Anaconda Prompt (Anaconda3)软件,进入yolov5项目目录中,输入以下命令
(base) C:\Users\100askTeam>D:
(base) D:\>cd D:\Programmers\ModelDeployment\2.yolov5\yolov5
(base) D:\Programmers\ModelDeployment\2.yolov5\yolov5>
使用conda创建yolov项目环境,输入
conda create -n my-yolov5-env python=3.7
激活yolov5环境
conda activate my-yolov5-env
安装依赖
pip install -U -r requirements.txt -i https://pypi.doubanio.com/simple/
FAQ:
搭建环境时由于版本的不同会遇各种问题,下面我会提供我配置好的环境所需的包文件版本,文件位于压缩包的requirements文件夹中的conda-yolov5_6-env.yaml。在Conda终端中创建新环境,执行
conda env create -f conda-yolov5_6-env.yaml
执行python detect.py
,测试环境是否搭建成功,执行后会自动下载模型权重文件
这里下载速度可能会很慢,建议直接访问官网下载https://github.com/ultralytics/yolov5/tree/v6.0,点击下图红框处的YOLOV5s。这里我下载 v6.0 版本的 yolov5s.onnx 模型作为示例。
下载地址:https://github.com/ultralytics/yolov5/releases/download/v6.0/yolov5s.pt
点进入后会进去yolov5资源中心,往下找到V6.0版本的资源下载界面,找到您所需的资源即可。
将该模型文件放在yolov5项目文件夹下,如下图所示:
在conda终端中输入python detect.py
,可得到如下执行结果
(my-yolov5-env) D:\Programmers\ModelDeployment\2.yolov5\yolov5-6.0>python detect.py
detect: weights=yolov5s.pt, source=data\images, imgsz=[640, 640], conf_thres=0.25, iou_thres=0.45, max_det=1000, device=, view_img=False, save_txt=False, save_conf=False, save_crop=False, nosave=False, classes=None, agnostic_nms=False, augment=False, visualize=False, update=False, project=runs\detect, name=exp, exist_ok=False, line_thickness=3, hide_labels=False, hide_conf=False, half=False, dnn=False
YOLOv5 2021-10-12 torch 2.0.1+cpu CPU
Fusing layers...
D:\Anaconda3\envs\my-yolov5-env\lib\site-packages\torch\functional.py:504: UserWarning: torch.meshgrid: in an upcoming release, it will be required to pass the indexing argument. (Triggered internally at C:\actions-runner\_work\pytorch\pytorch\builder\windows\pytorch\aten\src\ATen\native\TensorShape.cpp:3484.)
return _VF.meshgrid(tensors, **kwargs) # type: ignore[attr-defined]
Model Summary: 213 layers, 7225885 parameters, 0 gradients
image 1/2 D:\Programmers\ModelDeployment\2.yolov5\yolov5-6.0\data\images\bus.jpg: 640x480 4 persons, 1 bus, Done. (0.274s)
image 2/2 D:\Programmers\ModelDeployment\2.yolov5\yolov5-6.0\data\images\zidane.jpg: 384x640 2 persons, 1 tie, Done. (0.189s)
Speed: 4.5ms pre-process, 231.3ms inference, 2.8ms NMS per image at shape (1, 3, 640, 640)
Results saved to runs\detect\exp1
FAQ:
如果您执行此命令时,遇到如下报错:
原因:torch版本过高,可以通过修改代码或者降低版本。
下面我使用修改代码的方式解决:
修改D:\Anaconda3\envs\my-yolov5-env\lib\site-packages\torch\nn\modules\upsampling.py
文件中的Upsample类中forward函数的返回值。
原本:
def forward(self, input: Tensor) -> Tensor:
return F.interpolate(input, self.size, self.scale_factor, self.mode, self.align_corners,
recompute_scale_factor=self.recompute_scale_factor)
修改后:
def forward(self, input: Tensor) -> Tensor:
return F.interpolate(input, self.size, self.scale_factor, self.mode, self.align_corners)
修改结果如下图所示:
执行python detect.py
完成后,可以在yolov5项目文件夹下的runs\detect\exp1目录下找到执行后的输出结果,如下所示。
2.导出yolov5 ONNX模型
2.1 export程序导出模型
在export.py程序找到parse_opt函数,查看默认输出的模型格式。如果默认支持有onnx格式,就无需修改,如果默认没有填写onnx,修改默认格式为onnx格式。
执行export.py函数前需要需要确保已经安装了onnx包,可手动安装,如下所示
pip install onnx==1.12.0 -i https://pypi.doubanio.com/simple/
执行export.py函数导出yolov5的onnx 格式动态模型,在conda终端输入
python export.py --weights yolov5s.pt --include onnx --dynamic
执行完成后会在yolov5项目目录中生成一个名称为yolov5s.onnx
的文件,如下图所示:
2.2 简化模型
由于转换的模型是动态 Shape 的,不限制输入图片的大小,对于 NPU 来说会增加处理工序,所以这里我们需要转换为静态 Shape 的模型。
需要安装 onnxsim
工具,在conda终端输入
pip install onnxsim -i https://pypi.doubanio.com/simple/
然后使用这条命令转换:
python -m onnxsim yolov5s.onnx yolov5s-sim.onnx --input-shape 1,3,640,640
执行完成后会导出名为yolov5s-sim.onnx
文件,文件位于yolov5项目文件夹下,如下图所示:
2.3 查看模型
使用开源网站Netron网站
访问上面网址查看模型结构。
选择yolov5s-sim.onnx
文件,点击打开。
查看如下图所示输出节点
可看到模型有 4 个输出节点,其中 ouput 节点为后处理解析后的节点;在实际测试的过程中,发现 NPU 量化操作后对后处理的运算非常不友好,输出数据偏差较大,所以我们可以将后处理部分放在 CPU 运行;因此保留 350
,498
,646
三个后处理解析前的输出节点即可,后文在导入模型时修改输出节点。
3.转换NPU模型
3.1 创建转换目录
打开NPU工具包的虚拟机Ubuntu20.04,创建yolov5-6.0文件夹,存放模型和量化图像等。
ubuntu@ubuntu2004:~$ mkdir yolov5-6.0
进入yolov5模型转换目录。
ubuntu@ubuntu2004:~$ cd yolov5-6.0/
创建data目录存放量化图像
mkdir data
将量化图像传入data文件夹下,例如,传入test01.jpg
图像到data
ubuntu@ubuntu2004:~/yolov5-test$ ls data
test01.jpg
在yolov5模型转换目录中创建dataset.txt
ubuntu@ubuntu2004:~/yolov5-6.0$ touch dataset.txt
修改dataset.txt
文件
ubuntu@ubuntu2004:~/yolov5-6.0$ vi dataset.txt
在dataset.txt
文件中增加量化图片的路径.
./data/test01.jpg
将yolov5s-sim.onnx
模型传入yolov5模型转换文件夹下。例如:
ubuntu@ubuntu2004:~/yolov5-6.0$ ls
data dataset.txt yolov5s-sim.onnx
工 作目录的文件如下所示:
ubuntu@ubuntu2004:~/yolov5-6.0$ tree
.
├── data
│ └── test01.jpg
├── dataset.txt
└── yolov5s-sim.onnx
1 directory, 3 files
3.2 导入模型
导入模型前需要知道我们要保留的输出节点,由之前查看到我们输出的三个后处理节点为:350
,498
,646
。
pegasus import onnx --model yolov5s-sim.onnx --output-data yolov5s-sim.data --output-model yolov5s-sim.json --outputs 350 498 646
导入生成两个文件,分别是是 yolov5s-sim.data
和 yolov5s-sim.json
文件,两个文件是 YOLO V5 网络对应的芯原内部格式表示文件,data
文件储存权重,cfg
文件储存模型。
3.3生成 YML 文件
YML 文件对网络的输入和输出的超参数进行描述以及配置,这些参数包括,输入输出 tensor 的形状,归一化系数 (均值,零 点),图像格式,tensor 的输出格式,后处理方式等等
pegasus generate inputmeta --model yolov5s-sim.json --input-meta-output yolov5s-sim_inputmeta.yml
pegasus generate postprocess-file --model yolov5s-sim.json --postprocess-file-output yolov5s-sim_postprocess_file.yml
修改 yolov5s-sim_inputmeta.yml
文件中的的 scale
参数为 0.0039216(1/255)
,目的是对输入 tensor
进行归一化,和网络进行训练的时候是对应的。
vi yolov5s-sim_inputmeta.yml