0


yolov5训练并生成rknn模型以及3588平台部署

1.服务器环境配置

1.1GPU驱动安装

下载GPU驱动

  1. https://www.nvidia.cn/geforce/drivers/

选择对应的显卡型号以及操作系统,点击搜索

在这里插入图片描述
选择最新的下载安装即可(所有选项默认设置最好)

在这里插入图片描述

终端输入命令查看是否安装正确

  1. nvidia-smi

出现以下信息表明安装正确,其中红框为可以支持的cuda最高版本

在这里插入图片描述

1.2安装CUDA

下载CUDA Toolkit

  1. https://developer.nvidia.com/cuda-toolkit-archive

选择最高支持的版本或者更低版本

在这里插入图片描述

选择系统等后点击下载

在这里插入图片描述

一切设置都默认即可,直接下一步

安装过程中可能出现失败,如出现关于c++的问题,可以通过安装Visual Studio,我安装的是2022社区版

  1. https://visualstudio.microsoft.com/zh-hans/vs/

安装选择如下

在这里插入图片描述
在这里插入图片描述

安装完成后重新安装CUDA

1.3安装CUDNN

下载cudnn

  1. https://developer.nvidia.com/rdp/cudnn-download

选择对应的包下载

在这里插入图片描述

下载完成后解压

在这里插入图片描述

放入该路径下对应的目录

  1. C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.7

1.4验证CUDA

终端输入

  1. nvcc -V

显示如下图表明安装正确,红色框内为其版本

在这里插入图片描述

1.4安装Anaconda

下载Anaconda

  1. https://www.anaconda.com/

下载对应系统的Anaconda,以windows为例

安装路径可自定义,其他默认即可,需要注意的是,需要勾选如下,可以免除配置环境变量的麻烦

在这里插入图片描述

终端输入

  1. conda activate base

进入base环境,出现如下说明安装正确

在这里插入图片描述

1.5利用Anaconda创建yolov5运行环境

1.5.1安装pytorch-GPU

终端输入如下命令,创建yolov5环境,python版本3.8(yolov5要求python版本>3.7,这里建议使用3.8)

  1. conda create -n yolov5 python=3.8

一路回车以及yes即可安装成功,进入该环境命令如下,其余conda命令可自行搜索

  1. conda activate yolov5

其余conda命令可自行百度搜索

打开pytorch官网

  1. https://www.pytorch.org

选择对应操作系统以及CUDA版本的pytorch(这里的CUDA版本不能高于上面查看到的CUDA版本)

在这里插入图片描述

复制Run this Command中的命令(建议使用下面的命令,以解决版本问题)进入Anaconda的yolov5环境,输入该命令,随后等待安装完成即可,若安装失败,可自行换源解决

  1. conda install pytorch==1.11.0 torchvision==0.12.0 torchaudio==0.11.0 cudatoolkit=11.3 -c pytorch

conda添加清华源

  1. conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/
  2. conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge
  3. conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/msys2/
  4. conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/pytorch/
  5. # 设置搜索时显示通道地址
  6. conda config --set show_channel_urls yes

安装完成后,在yolov5环境下输入

  1. python

进入python中输入

  1. import torch
  2. print(torch.cuda.is_available())print(torch.backends.cudnn.is_available())

运行显示为则表明安装正确

  1. True
  2. True

1.5.2安装yolov5运行需要的包

获取yolov5的rknn友好版本

  1. git clone https://github.com/airockchip/yolov5.git

在Ancaonda的yolov5环境下进入yolov5项目的根目录,pip安装包,-i 使用清华源更快

  1. pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple

等待安装完成即可

其包含的包如下,确保安装完成base(训练运行需要的包),logging(日志),export(模型导出与格式转换)中包含的包:

  1. # pip install -r requirements.txt
  2. # base ----------------------------------------
  3. Cython
  4. matplotlib>=3.2.2
  5. numpy>=1.18.5
  6. opencv-python>=4.1.2
  7. pillow
  8. PyYAML>=5.3
  9. scipy>=1.4.1
  10. tensorboard>=2.2
  11. torch>=1.6.0
  12. torchvision>=0.7.0
  13. tqdm>=4.41.0
  14. # logging -------------------------------------
  15. # wandb
  16. # coco ----------------------------------------
  17. # pycocotools>=2.0
  18. # export --------------------------------------
  19. # coremltools==4.0
  20. # onnx>=1.8.0
  21. # scikit-learn==0.19.2 # for coreml quantization
  22. # extras --------------------------------------
  23. # thop # FLOPS computation
  24. # seaborn # plotting

若出现版本不兼容问题,可以自行修改包的版本(满足最低要求的情况下)

2.yolov5项目修改

2.1修改models/yolo.py解决报错:

其中的153行左右:

  1. def_initialize_biases(self, cf=None):# initialize biases into Detect(), cf is class frequency# https://arxiv.org/abs/1708.02002 section 3.3# cf = torch.bincount(torch.tensor(np.concatenate(dataset.labels, 0)[:, 0]).long(), minlength=nc) + 1.
  2. m = self.model[-1]# Detect() modulefor mi, s inzip(m.m, m.stride):# from
  3. b = mi.bias.view(m.na,-1)# conv.bias(255) to (3,85)
  4. b[:,4]+= math.log(8/(640/ s)**2)# obj (8 objects per 640 image)
  5. b[:,5:]+= math.log(0.6/(m.nc -0.99))if cf isNoneelse torch.log(cf / cf.sum())# cls
  6. mi.bias = torch.nn.Parameter(b.view(-1), requires_grad=True)

修改为:

  1. def_initialize_biases(self, cf=None):# initialize biases into Detect(), cf is class frequency# https://arxiv.org/abs/1708.02002 section 3.3# cf = torch.bincount(torch.tensor(np.concatenate(dataset.labels, 0)[:, 0]).long(), minlength=nc) + 1.
  2. m = self.model[-1]# Detect() modulefor mi, s inzip(m.m, m.stride):# from
  3. b = mi.bias.view(m.na,-1)# conv.bias(255) to (3,85)with torch.no_grad():
  4. b[:,4]+= math.log(8/(640/ s)**2)# obj (8 objects per 640 image)
  5. b[:,5:]+= math.log(0.6/(m.nc -0.99))if cf isNoneelse torch.log(cf / cf.sum())# cls
  6. mi.bias = torch.nn.Parameter(b.view(-1), requires_grad=True)

解决报错问题

2.2修改utils/datasets.py:

这里是为了兼容自己的yolov4数据集,可以不做修改

其中的342行左右:

  1. defimg2label_paths(img_paths):# Define label paths as a function of image paths
  2. sa, sb = os.sep +'images'+ os.sep, os.sep +'labels'+ os.sep # /images/, /labels/ substringsreturn[x.replace(sa, sb,1).replace(os.path.splitext(x)[-1],'.txt')for x in img_paths]

修改为:

  1. def img2label_paths(img_paths):
  2. # Define label paths as a function of image paths
  3. sa, sb = os.sep + 'JPEGImages' + os.sep, os.sep + 'labels' + os.sep # /images/, /labels/ substrings
  4. return [x.replace(sa, sb, 1).replace(os.path.splitext(x)[-1], '.txt') for x in img_paths]

为了兼容yolov4使用的数据集,达到v4与v5公用数据集的目的

2.3新建data.yaml:

在data目录下创建my,yaml,内容如下(该文件为数据集的信息),可自行设置自己的数据。

  1. # 训练,验证,测试集路径,其中xxx表示数据盘中的某个数据集train: /media/ubuntu/data/datasets/xxx/2007_train.txt
  2. val: /media/ubuntu/data/datasets/xxx/2007_train.txt
  3. test: /media/ubuntu/data/datasets/xxx/2007_train.txt
  4. # 类的个数nc:2# 类名names:['red_jeep','missile_vehicle']

2.4新建cfg.yaml

在data目录下创建rknn.yaml,内容如下(该文件为模型结构配置文件)

由于该项目版本的结构使用的是较为旧的模块,我们修改为了yolov5 6.0版本的backbone,head:结构以提高性能,其中由于6.0版本的输出与rknn不兼容,使用该项目的detect层解决这个问题。当然可以使用原项目的配置文件

  1. nc:2# 类的个数depth_multiple:0.33# 深度倍率width_multiple:0.50# 通道倍率anchors:-[10,13,16,30,33,23]# P3/8-[30,61,62,45,59,119]# P4/16-[116,90,156,198,373,326]# P5/32# YOLOv5 v6.0 backbonebackbone:# [from, number, module, args][[-1,1, Conv,[64,6,2,2]],# 0-P1/2[-1,1, Conv,[128,3,2]],# 1-P2/4[-1,3, C3,[128]],[-1,1, Conv,[256,3,2]],# 3-P3/8[-1,6, C3,[256]],[-1,1, Conv,[512,3,2]],# 5-P4/16[-1,9, C3,[512]],[-1,1, Conv,[1024,3,2]],# 7-P5/32[-1,3, C3,[1024]],[-1,1, SPPF,[1024,5]],# 9]# YOLOv5 v6.0 headhead:[[-1,1, Conv,[512,1,1]],[-1,1, nn.Upsample,[None,2,'nearest']],[[-1,6],1, Concat,[1]],# cat backbone P4[-1,3, C3,[512,False]],# 13[-1,1, Conv,[256,1,1]],[-1,1, nn.Upsample,[None,2,'nearest']],[[-1,4],1, Concat,[1]],# cat backbone P3[-1,3, C3,[256,False]],# 17 (P3/8-small)[-1,1, Conv,[256,3,2]],[[-1,14],1, Concat,[1]],# cat head P4[-1,3, C3,[512,False]],# 20 (P4/16-medium)[-1,1, Conv,[512,3,2]],[[-1,10],1, Concat,[1]],# cat head P5[-1,3, C3,[1024,False]],# 23 (P5/32-large)[[17,20,23],1, Detect,[nc, anchors]],# Detect(P3, P4, P5)]

2.5添加SPPF模块

打开models文件下的common.py文件,添加SPPF类,该文件下的激活函数已经修改为Relu,故不再做这个操作

  1. classSPPF(nn.Module):# Spatial Pyramid Pooling - Fast (SPPF) layer for YOLOv5 by Glenn Jocherdef__init__(self, c1, c2, k=5):# equivalent to SPP(k=(5, 9, 13))super().__init__()
  2. c_ = c1 //2# hidden channels
  3. self.cv1 = Conv(c1, c_,1,1)
  4. self.cv2 = Conv(c_ *4, c2,1,1)
  5. self.m = nn.MaxPool2d(kernel_size=k, stride=1, padding=k //2)defforward(self, x):
  6. x = self.cv1(x)with warnings.catch_warnings():
  7. warnings.simplefilter('ignore')# suppress torch 1.9.0 max_pool2d() warning
  8. y1 = self.m(x)
  9. y2 = self.m(y1)return self.cv2(torch.cat((x, y1, y2, self.m(y2)),1))

2.6模型构建中添加SPPF模块

修改models/yolo.py中的def parse_model函数219行

  1. if m in[Conv, Bottleneck, SPP, DWConv, MixConv2d, Focus, CrossConv, BottleneckCSP, C3]:

修改为

  1. if m in[Conv, Bottleneck, SPP, DWConv, MixConv2d, Focus, CrossConv, BottleneckCSP, C3, SPPF]:

2.7报错tensor无法转换为numpy

这个错误是由于numpy版本过高导致

可以先卸载高版本numpy

  1. pip uninstall numpy

再安装numpy1.18.5即可解决问题

  1. pip install numpy==1.18.5 -i https://pypi.tuna.tsinghua.edu.cn/simple

2.8不使用预训练权重

修改train.py,去除使用预训练模型

  1. parser.add_argument('--weights',type=str, default='yolov5s.pt',help='initial weights path')

更改为:

  1. parser.add_argument('--weights',type=str, default='',help='initial weights path')

2.9若出现页面文件太小,无法完成操作

  1. OSError: [WinError 1455] 页面文件太小,无法完成操作。 Error loading "D:\anaconda3\envs\Yolo\lib\site-packages\torch\lib\shm.dll" or one of its dependencies.

修改对应盘符的虚拟内存,操作如下,大小可以看情况而定:
在这里插入图片描述

重启电脑,重新开始训练即可

3.yolov5模型训练

在Anaconda的yolov5,进入yolov5根目录,终端运行如下,选择模型配置文件和数据集文件即可开始训练

  1. python --cfg models/rknn.yaml --data/my.yaml

训练完成后在runs文件夹下可以查看训练结果,weights保存了各阶段的模型,results.png为训练结果展示

在这里插入图片描述
在这里插入图片描述

4.pt格式→onnx格式

在Anaconda的yolov5,进入yolov5根目录,终端运行如下

  1. python models/export.py --weight xx.pt# 此处为需要转换模型的相对路径 当然也可以是绝对路径 如runs/train/exp/weight/best.pt

若出现模块不存在的情况,只需要按照requirements.txt安装即可

5.onnx格式→rknn格式

5.1虚拟机环境安装

由于rknn-toolkit2目前只支持linux,故而需要使用到虚拟机(rknn-toolkit不支持3588)

这里的虚拟机软件我使用的是VMware,系统为Ubuntu18.04,由于20.04版本存在vm-toolkit安装后无法拖动文件的情况,所以建议使用18.04,虚拟机的安装不再赘述

5.1.1安装Anaconda

官方文件中含有docker镜像,可以直接拉取使用,我们这里使用传统方式

由于Ubuntu18.04自带python3.6,为了避免冲突,简化操作,这里继续使用Anaconda创建rknn环境

  1. https://www.anaconda.com/

下载对应操作系统,下载好后放在主目录下,运行,一路回车yes即可完成

  1. sudosh ./Anaconda3-2022.05-Linux-x86_64.sh

注意:最后询问是否添加到环境变量,回复yes

重新打开终端就可以看到,说明安装成功

在这里插入图片描述

5.1.2Anaconda创建rknn环境并安装rknn-toolkit2

rknn-toolkit2有python3.6 python3.8两个版本的包,我们这里选择python3.8

  1. conda create -n rknn puthon=3.8

获取rknn-toolkit2安装包并进入改项目根目录

  1. git clone https://github.com/rockchip-linux/rknn-toolkit2.git
  2. cd rknn-toolkits-1.3.0

在Anaconda的rknn环境下安装rknn-toolkit2的依赖包

  1. pip3 install -r requirements_cp38-1.3.0.txt -i https://pypi.tuna.tsinghua.edu.cn/simple

安装rknn-toolkit2,若存咋版本不匹配问题,可以卸载包后重新安装其他版本

  1. pip3 install package/rknn_toolkit2-1.3.0_11912b58-cp38-cp38-linux_x86_64.whl

测试安装是否成功

  1. cd /examples/onnx/yolov5
  2. python3 test.py

运行正确表明安装正确

5.2模型转换

获取官方demo

  1. git clone https://github.com/rockchip-linux/rknpu2.git

进入yolov5模型转换目录

  1. cd /home/ptay/rknpu2-master/examples/rknn_yolov5_demo/convert_rknn_demo/yolov5

在onnx目录下放入以及转换好的onnx模型

打开onnx2rknn.py,修改如下:

​ 1.目标平台名

  1. platform ='rk3588'

​ 2.需要转化的onnx模型

  1. MODEL_PATH ='./onnx_models/best.onnx'

随后在rknn环境下运行,会生成新的rknn目录以及其目录下的rknn模型,随后对其修改名字即可,也可在py文件中修改,不是重点

  1. python3 onnx2rknn.py

6.3588平台部署

在3588的主目录上获取官方demo

  1. git clone https://github.com/rockchip-linux/rknpu2.git

进入yolov5目录

  1. cd /home/ptay/rknpu2-master/examples/rknn_yolov5_demo

修改include文件中的头文件postprocess.h

  1. #define OBJ_CLASS_NUM 2 #这里的数字修改为数据集的类的个数

修改model目录下的coco_80_labels_list.txt文件,改为自己的类并保存

  1. red_jeep
  2. missile_vehicle

将转换后的rknn文件放在model/RK3588目录下

编译,运行shell

  1. bash ./build-linux_RK3588.sh

成功后生成install目录

  1. cd install/rknn_yolov5_demo_linux

在model目录下放入需要推理的图片

运行

  1. ./rknn_yolov5_demo ./model/RK3588/best.rknn ./model/test.jpg

在rknn_yolov5_demo_linux获取到结果,因为数据涉密问题这里我用了另一个数据集做结果展示

在这里插入图片描述

其他视频以及摄像头推理可以自行修改官方demo实现


本文转载自: https://blog.csdn.net/m0_51714298/article/details/125916417
版权归原作者 新鑫信心 所有, 如有侵权,请联系我们删除。

“yolov5训练并生成rknn模型以及3588平台部署”的评论:

还没有评论