Yolov4训练模型错误大全(yolov5训练并生成rknn模型以及3588平台部署)
1.服务器环境配置
1.1GPU驱动安装
下载GPU驱动
https://www.nvidia.cn/geforce/drivers/选择对应的显卡型号以及操作系统 ,点击搜索
选择最新的下载安装即可(所有选项默认设置最好)
终端输入命令查看是否安装正确
nvidia-smi出现以下信息表明安装正确 ,其中红框为可以支持的cuda最高版本
1.2安装CUDA
下载CUDA Toolkit
https://developer.nvidia.com/cuda-toolkit-archive选择最高支持的版本或者更低版本
选择系统等后点击下载
一切设置都默认即可 ,直接下一步
安装过程中可能出现失败 ,如出现关于c++的问题 ,可以通过安装Visual Studio ,我安装的是2022社区版
https://visualstudio.microsoft.com/zh-hans/vs/安装选择如下
安装完成后重新安装CUDA
1.3安装CUDNN
下载cudnn
https://developer.nvidia.com/rdp/cudnn-download选择对应的包下载
下载完成后解压
放入该路径下对应的目录
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.71.4验证CUDA
终端输入
nvcc -V显示如下图表明安装正确 ,红色框内为其版本
1.4安装Anaconda
下载Anaconda
https://www.anaconda.com/下载对应系统的Anaconda ,以windows为例
安装路径可自定义 ,其他默认即可,需要注意的是 ,需要勾选如下 ,可以免除配置环境变量的麻烦
终端输入
conda activate base进入base环境,出现如下说明安装正确
1.5利用Anaconda创建yolov5运行环境
1.5.1安装pytorch-GPU
终端输入如下命令 ,创建yolov5环境 ,python版本3.8(yolov5要求python版本>3.7,这里建议使用3.8)
conda create -n yolov5 python=3.8一路回车以及yes即可安装成功,进入该环境命令如下 ,其余conda命令可自行搜索
conda activate yolov5其余conda命令可自行百度搜索
打开pytorch官网
https://www.pytorch.org选择对应操作系统以及CUDA版本的pytorch(这里的CUDA版本不能高于上面查看到的CUDA版本)
复制Run this Command中的命令(建议使用下面的命令 ,以解决版本问题)进入Anaconda的yolov5环境 ,输入该命令 ,随后等待安装完成即可 ,若安装失败 ,可自行换源解决
conda install pytorch==1.11.0 torchvision==0.12.0 torchaudio==0.11.0 cudatoolkit=11.3 -c pytorchconda添加清华源
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/ conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/msys2/ conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/pytorch/ # 设置搜索时显示通道地址 conda config --set show_channel_urls yes安装完成后 ,在yolov5环境下输入
python进入python中输入
import torch print(torch.cuda.is_available()) print(torch.backends.cudnn.is_available())运行显示为则表明安装正确
True True1.5.2安装yolov5运行需要的包
获取yolov5的rknn友好版本
git clone https://github.com/airockchip/yolov5.git在Ancaonda的yolov5环境下进入yolov5项目的根目录 ,pip安装包 ,-i 使用清华源更快
pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple等待安装完成即可
其包含的包如下,确保安装完成base(训练运行需要的包) ,logging(日志) ,export(模型导出与格式转换)中包含的包:
# pip install -r requirements.txt # base ---------------------------------------- Cython matplotlib>=3.2.2 numpy>=1.18.5 opencv-python>=4.1.2 pillow PyYAML>=5.3 scipy>=1.4.1 tensorboard>=2.2 torch>=1.6.0 torchvision>=0.7.0 tqdm>=4.41.0 # logging ------------------------------------- # wandb # coco ---------------------------------------- # pycocotools>=2.0 # export -------------------------------------- # coremltools==4.0 # onnx>=1.8.0 # scikit-learn==0.19.2 # for coreml quantization # extras -------------------------------------- # thop # FLOPS computation # seaborn # plotting若出现版本不兼容问题,可以自行修改包的版本(满足最低要求的情况下)
2.yolov5项目修改
2.1修改models/yolo.py解决报错:
其中的153行左右:
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. m = self.model[-1] # Detect() module for mi, s in zip(m.m, m.stride): # from b = mi.bias.view(m.na, -1) # conv.bias(255) to (3,85) b[:, 4] += math.log(8 / (640 / s) ** 2) # obj (8 objects per 640 image) b[:, 5:] += math.log(0.6 / (m.nc - 0.99)) if cf is None else torch.log(cf / cf.sum()) # cls mi.bias = torch.nn.Parameter(b.view(-1), requires_grad=True)修改为:
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. m = self.model[-1] # Detect() module for mi, s in zip(m.m, m.stride): # from b = mi.bias.view(m.na, -1) # conv.bias(255) to (3,85) with torch.no_grad(): b[:, 4] += math.log(8 / (640 / s) ** 2) # obj (8 objects per 640 image) b[:, 5:] += math.log(0.6 / (m.nc - 0.99)) if cf is None else torch.log(cf / cf.sum()) # cls mi.bias = torch.nn.Parameter(b.view(-1), requires_grad=True)解决报错问题
2.2修改utils/datasets.py:
这里是为了兼容自己的yolov4数据集 ,可以不做修改
其中的342行左右:
def img2label_paths(img_paths): # Define label paths as a function of image paths sa, sb = os.sep + images + os.sep, os.sep + labels + os.sep # /images/, /labels/ substrings return [x.replace(sa, sb, 1).replace(os.path.splitext(x)[-1], .txt) for x in img_paths]修改为:
def img2label_paths(img_paths): # Define label paths as a function of image paths sa, sb = os.sep + JPEGImages + os.sep, os.sep + labels + os.sep # /images/, /labels/ substrings 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,内容如下(该文件为数据集的信息) ,可自行设置自己的数据 。
# 训练 ,验证 ,测试集路径 ,其中xxx表示数据盘中的某个数据集 train: /media/ubuntu/data/datasets/xxx/2007_train.txt val: /media/ubuntu/data/datasets/xxx/2007_train.txt test: /media/ubuntu/data/datasets/xxx/2007_train.txt # 类的个数 nc: 2 # 类名 names: [red_jeep, missile_vehicle]2.4新建cfg.yaml
在data目录下创建rknn.yaml ,内容如下(该文件为模型结构配置文件)
由于该项目版本的结构使用的是较为旧的模块 ,我们修改为了yolov5 6.0版本的backbone ,head:结构以提高性能 ,其中由于6.0版本的输出与rknn不兼容 ,使用该项目的detect层解决这个问题 。当然可以使用原项目的配置文件
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 backbone backbone: # [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 head head: [[-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 ,故不再做这个操作
class SPPF(nn.Module): # Spatial Pyramid Pooling - Fast (SPPF) layer for YOLOv5 by Glenn Jocher def __init__(self, c1, c2, k=5): # equivalent to SPP(k=(5, 9, 13)) super().__init__() c_ = c1 // 2 # hidden channels self.cv1 = Conv(c1, c_, 1, 1) self.cv2 = Conv(c_ * 4, c2, 1, 1) self.m = nn.MaxPool2d(kernel_size=k, stride=1, padding=k // 2) def forward(self, x): x = self.cv1(x) with warnings.catch_warnings(): warnings.simplefilter(ignore) # suppress torch 1.9.0 max_pool2d() warning y1 = self.m(x) 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行
if m in [Conv, Bottleneck, SPP, DWConv, MixConv2d, Focus, CrossConv, BottleneckCSP, C3]:修改为
if m in [Conv, Bottleneck, SPP, DWConv, MixConv2d, Focus, CrossConv, BottleneckCSP, C3, SPPF]:2.7报错tensor无法转换为numpy
这个错误是由于numpy版本过高导致
可以先卸载高版本numpy
pip uninstall numpy再安装numpy1.18.5即可解决问题
pip install numpy==1.18.5 -i https://pypi.tuna.tsinghua.edu.cn/simple2.8不使用预训练权重
修改train.py,去除使用预训练模型
parser.add_argument(--weights, type=str, default=yolov5s.pt, help=initial weights path)更改为:
parser.add_argument(--weights, type=str, default=, help=initial weights path)2.9若出现页面文件太小,无法完成操作
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根目录 ,终端运行如下 ,选择模型配置文件和数据集文件即可开始训练
python --cfg models/rknn.yaml --data/my.yaml训练完成后在runs文件夹下可以查看训练结果 ,weights保存了各阶段的模型 ,results.png为训练结果展示
4.pt格式→onnx格式
在Anaconda的yolov5 ,进入yolov5根目录 ,终端运行如下
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环境
https://www.anaconda.com/下载对应操作系统 ,下载好后放在主目录下 ,运行 ,一路回车yes即可完成
sudo sh ./Anaconda3-2022.05-Linux-x86_64.sh注意:最后询问是否添加到环境变量 ,回复yes
重新打开终端就可以看到 ,说明安装成功
5.1.2Anaconda创建rknn环境并安装rknn-toolkit2
rknn-toolkit2有python3.6 python3.8两个版本的包 ,我们这里选择python3.8
conda create -n rknn puthon=3.8获取rknn-toolkit2安装包并进入改项目根目录
git clone https://github.com/rockchip-linux/rknn-toolkit2.git cd rknn-toolkits-1.3.0在Anaconda的rknn环境下安装rknn-toolkit2的依赖包
pip3 install -r requirements_cp38-1.3.0.txt -i https://pypi.tuna.tsinghua.edu.cn/simple安装rknn-toolkit2,若存咋版本不匹配问题 ,可以卸载包后重新安装其他版本
pip3 install package/rknn_toolkit2-1.3.0_11912b58-cp38-cp38-linux_x86_64.whl测试安装是否成功
cd /examples/onnx/yolov5 python3 test.py运行正确表明安装正确
5.2模型转换
获取官方demo
git clone https://github.com/rockchip-linux/rknpu2.git进入yolov5模型转换目录
cd /home/ptay/rknpu2-master/examples/rknn_yolov5_demo/convert_rknn_demo/yolov5在onnx目录下放入以及转换好的onnx模型
打开onnx2rknn.py ,修改如下:
1.目标平台名
platform = rk3588 2.需要转化的onnx模型
MODEL_PATH = ./onnx_models/best.onnx随后在rknn环境下运行,会生成新的rknn目录以及其目录下的rknn模型 ,随后对其修改名字即可 ,也可在py文件中修改,不是重点
python3 onnx2rknn.py6.3588平台部署
在3588的主目录上获取官方demo
git clone https://github.com/rockchip-linux/rknpu2.git进入yolov5目录
cd /home/ptay/rknpu2-master/examples/rknn_yolov5_demo修改include文件中的头文件postprocess.h
#define OBJ_CLASS_NUM 2 #这里的数字修改为数据集的类的个数修改model目录下的coco_80_labels_list.txt文件 ,改为自己的类并保存
red_jeep missile_vehicle将转换后的rknn文件放在model/RK3588目录下
编译 ,运行shell
bash ./build-linux_RK3588.sh成功后生成install目录
cd install/rknn_yolov5_demo_linux在model目录下放入需要推理的图片
运行
./rknn_yolov5_demo ./model/RK3588/best.rknn ./model/test.jpg在rknn_yolov5_demo_linux获取到结果 ,因为数据涉密问题这里我用了另一个数据集做结果展示
其他视频以及摄像头推理可以自行修改官方demo实现
创心域SEO版权声明:以上内容作者已申请原创保护,未经允许不得转载,侵权必究!授权事宜、对本内容有异议或投诉,敬请联系网站管理员,我们将尽快回复您,谢谢合作!