复现炮哥带你学—Yolo5训练安全帽(vscode + pytorch)报错总结,数据库链接+权重文件链接
1、本篇博客说明
该篇博客是小编苦经环境配置以及代码各种问题报错后,成功复现博客“炮哥带你学”的Yolo5安全帽的经验分享,也可以算是我所遇到的问题的总结,也顺便记录我深度学习的过程。
在这里贴一张成功复现,并正在训练的图片。
环境的配置以及给自己想要的数据集打标签等步骤我在这里省略,如果你有什么不清楚的,可以去看“炮哥带你学”的相关博客以及对应的B站视频。为了更好的帮到你,我在此列出我所省略的东西,并说明学习的顺序以及对应的链接。如下:
第一步:环境的安装
对应的博客:https://blog.csdn.net/didiaopao/article/details/119787139
对应的B站视频:https://www.bilibili.com/video/BV1f44y187Xg?p=2&vd_source=cca00652b9b49985d570f56c8317309d
第二步:学习使用labelimg给数据集打标注
对应的博客:https://blog.csdn.net/didiaopao/article/details/119808973
对应的B站视频:https://www.bilibili.com/video/BV1f44y187Xg?p=3&vd_source=cca00652b9b49985d570f56c8317309d
第三步:数据集格式转换与划分
对应的博客:https://blog.csdn.net/didiaopao/article/details/120022845
对应的B站视频:https://www.bilibili.com/video/BV1f44y187Xg?p=4&vd_source=cca00652b9b49985d570f56c8317309d
前面这三步是复现的基础,也是以后去训练自己模型的基本步骤,所以也请认真学习。完成这三步的学习后,就到了第四步,也就是我遇到问题最多的地方,即下载源代码并开始训练。
2、训练YOLOV5前的准备工作
2.1学习第四步对应的博客链接和B站链接
对应的博客:https://blog.csdn.net/didiaopao/article/details/119954291
对应的B站视频:https://www.bilibili.com/video/BV1f44y187Xg?p=5&vd_source=cca00652b9b49985d570f56c8317309d
2.2数据集下载
https://pan.baidu.com/s/1WwNX-bU9fD_mAofasn7E4A?pwd=6x9r
下载好数据集之后,用第三步“数据集格式转换与划分”中将voc数据格式转换为yolo数据格式的代码,完成数据集的划分。
在划分数据集之前,你的数据集结构应该是这样子的:
当数据集划分后,除了在VOC2007路径下多了yolo格式的数据文件夹:
在VOCdevkit路径下会多出两个文件夹,分别是images和labels,里面其实就是划分的训练集和验证集。
2.3YOLOV5源代码下载
进入yolov5下载的GitHub网站下载代码:https://github.com/ultralytics/yolov5/tree/v5.0
2.4权重文件yolov5s.pt下载
通过下面这个链接下载5s这个权重文件
https://pan.baidu.com/s/10uyMTanqm9DQvSFctiyYQQ?pwd=wnlt
2.5放置划分好的数据集和权重文件
数据集的放置:放置到你解压源代码文件后的yolov5-5.0路径下就可以了,与data、models、runs等文件夹是同路径的。
权重文件的放置:放置到yolov5-5.0路径下的weights文件夹里面。
2.6修改我们需要的数据.yaml文件
修改我们的hat.yaml文件内容:
我们所需要的数据路径如下:
修改好的hat.yaml文件如下:
2.7修改我们需要的模型.yaml文件
然后把第一行的类别改为2就可以了。
2.8修改我们的train.py文件
修改我们的权重文件、模型文件、数据文件路径。修改位置为train.py的458到460行。
权重路径:
模型路径:
数据路径:
2.9修改我们的datasets.py文件
将81行的 num_workers的值设置为0,如果步设置为0,会发生3.5所描述的报错。
到这里,我们的准备工作就做完了,接下来就要开始运行代码,报错即将开始。
3、开始我们的bug解决之旅
这里说明一下,本篇文章与炮哥的视频中的步骤是不一样的,我在运行任何代码(包括配置环境所需要的包)前,已经将准备工作(包括data和models中的.yaml文件改写以及train.py文件修改好)。
3.1运行requirements.txt配置发生报错
- 错误描述:在终端运行pip install -r requirements.txt配置所需要的包发生报错,报错内容如下
FileNotFoundError: [WinError 206] 文件名或扩展名太长
- 错误原因:
安装onnx-simplifier包的时候使用以下指令时出现了报错。
- 解决办法1:在终端下运行下面这行代码,这里是参考的“今天一定要洛比达”的文章,链接放在这里:https://blog.csdn.net/weixin_46274756/article/details/129732390
pip install -i https://pypi.douban.com/simple onnx-simplifier==0.4.10--user
- 解决办法2:如果办法1没有解决问题,也可能是因为你开了翻墙软件的原因,导致在下载所需要的包的时候跑到了国外下载,所以发生报错。你可以关闭翻墙软件后,重启电脑,然后再在终端运行pip install -r requirements.txt。本人是这样解决的。如果比较慢,可以运行下面的代码(使用清华源下载):
pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple
3.2运行train.py发生报错之SPPF类报错
- 错误描述:在第一次运行train.py时发生了以下报错
AttributeError: Cant get attribute SPPF on module models.common from E:\VScode_project\Y5\yolov5-5.0\models\common.py
- 错误原因:common.py文件中缺少了SPPF类
- 解决办法:在vscode中的models下找到common.py文件 在这给文件中加入以下代码:
import warnings
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__()
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)defforward(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))
加入SPPF类后的common.py文件如下:
- 参考文章:该问题解决参考了“啥也不是的py人”的文章,链接:https://blog.csdn.net/weixin_50920579/article/details/121307820
3.3运行train.py发生报错之RuntimeError:result type Float can‘t be cast to the desired output type long int报错
- 错误描述:
RuntimeError: result type Float can‘t be cast to the desired output type long int
或者
RuntimeError: result type Float can‘t be cast to the desired output type __int64
- 错误原因:yolov5-master版本和yolov5-5.0/yolov5-6.1等版本下的【utils】中的【loss.py】文件是不一样的,大概是yolov5-5.0/yolov5-6.1等版本在更新版本的时候出了问题。
- 问题解决:找到utils下的loss.py, 用以下代码修改第178行代码,
anchors, shape = self.anchors[i], p[i].shape
修改后代码图片:(一定要注意对其)
用以下代码修改第211行代码,
indices.append((b, a, gj.clamp_(0, shape[2]-1), gi.clamp_(0, shape[3]-1)))# image, anchor, grid
修改后代码图片:
- 参考文章:该问题解决是参考的“蓝胖胖”的文章,链接:https://blog.csdn.net/Thebest_jack/article/details/125649451
3.4运行train.py发生报错之AttributeError: module ‘numpy’ has no attribute ‘int’.
- 错误描述:
AttributeError: module ‘numpy’ has no attribute ‘int’.
- 错误原因:原因是你下载的numpy版本过高,里面已经不支持int这个函数还是类,反正就是你的numpy中没有“int”这个结构了。
- 解决办法:将你的numpy降低版本,降到1.22这个版本,具体操作如下:
先用下面的代码卸载你当前版本的numpy,
pip uninstall numpy
然后用下面的代码安装1.22版本的numpy,
pip install numpy==1.22
如果下载是不是就出现链接报错或者是远程服务器关闭等错误,那就关掉你的翻墙软件,在进行下载安装,不行就重启电脑
3.5运行train.py发生报错之[WinError 1455]页面文件太小,无法完成操作。
- 问题描述:
- 问题原因:虚拟内存不够
- 问题解决:看2.8的操作。
3.6运行train.py发生报错之CUDA out of memory.
- 问题描述:
- 问题原因:GPU显存溢出的报错。
- 问题解决:修改train.py的batch size 和参与的cpu个数.
4、模型的验证和推理
因为博客写到这里的时候,模型也刚好训练完,所以就干脆把模型的验证和推理所遇到的报错给写了。相信部分小伙伴肯定也会遇到这些问题。
4.1图片的推理
首先我们要找到我们训练好之后的模型文件,last.py和best.pt这两个文件,他们的位置在runs->train里面,如下图:
然后我们找到我们的推理文件detect.py,修改模型路径和所要测试的图片路径:
运行detect.py文件,然后就会报错啦,哈哈哈!!!
- 报错描述:
OSError: [Errno 22] Invalid argument: ‘weights\x08est.pt’
- 报错原因:路径书写格式有问题,比如’weights\best.pt’,我们在单引号里面使用了‘\’,大家学过点编程都知道这个符号是比较特殊的符号,即转义字符,例如‘\t’表示换行,‘\a’表示发出警报。所以尽量不要用’'的路径表示方式。
- 解决办法:把所有的‘\’全部换位‘/‘。即原本的’weights\best.pt’变成’weights/best.pt’. 还有其他的改写方法,这里我就不说了,百度一下就全知道了。
运行成功后,我们的图片会被保存到下面这个地方,点击就可以进行查看了:exp后面的数字代表你第几次运行detect.py这个文件
4.2视频的推理(附带视频素材下载链接)
找相关视频其实挺麻烦的,所以在这里我给大家找到了下载相应素材的网站,大家自行下载就可以了
视频素材下载网站https://www.2amok.com/videoText/424071.html
跟图片推理的操作是一样的,把路径写到对应位置运行就可以了,注意路径中的‘\’要改为‘/’。
效果如下:
yolov5安全帽检测
4.3摄像头实时推理
将数据路径写为0。
打开dataset.py文件,找到第279行代码,给两个url参数加上str就可以了,如图所示,就可以完美运行电脑的摄像头了。
这里就不放视频了,大家自己去尝试吧。
5、总结
由于本人也是新手小白,写这篇文章也是为了记录自己的学习之旅。在这篇文章中也可能有一些错误,大家可以在评论区指出。最后也希望这篇文章能够帮助到你。
版权归原作者 EthanWsir 所有, 如有侵权,请联系我们删除。