深度学习——使用yolov5,训练自己的数据集
作者:互联网
截止到今天,yolo版本已经迭代到第7代了,发展历史就不再过多叙述。虽然已经到第7代了,为啥目前还是使用yolov5比较多?我个人认为,yolov7目前还存在许多bug,虽然能够跑通,但是源码还是需要修改一下的。yolov5本身就已经性能不错了,而且使用的范围也比较广,所以暂时不用去研究yolov7。通过观看视频,学习资料知道,yolov7的使用方法和yolov5基本是一样的,上手应该也是比较快的,有时间再去做yolov7的。那废话不多说,从头到尾,亲自跑一遍,包括其中的报错,如何修改等,尽量描述详细。
1、前期需要配置深度学习环境,这里就不在多说,网上可以搜到很多教程,博主也是按照网上的教程配置的。最不行,去咸鱼花钱雇一个就好了。
2、准备数据集。本次实验,所用到的数据集是从网上下载的交通指示牌的数据集,也是比较典型的一个数据集。网址:https://aistudio.baidu.com/aistudio/datasetdetail/20495。
关于数据集,还是想说两句。如果是自己的数据集的话,是需要自己打上标签的,标签就是判定的种类。打标签一般是用labelme、labelimg两种,这两种脚本,在python中pip一下就可以了,然后cmd执行。具体使用方法可以百度一下,资料同样有很多。但是用这些脚本制作的标签是xml格式的,而yolov5需要的是txt格式的,所以需要一个转换过程,如何转换,看一下之前的帖子有写代码,按照帖子的步骤,把相应位置的代码改掉就可以。
从网上下载下来的交通指示牌的数据集其实是已经转好的,但是还是推荐各位自己跑一下代码。在真正的应用里边,是需要自己一个一个去打标签的,也是需要自己从xml转换txt的。
关于打标签注意什么,这里不再多说。
3、下载yolov5。所有人都知道yolo是在github上的开源项目,之前我也是在在github或者gitee上下载,但是发现很多版本bug特别多,要改好多,查了一下其他小伙伴也是有同样问题的,所以这里给大家提供一个亲测可用,改用比较小的mast版本。
链接:https://pan.baidu.com/s/15KFsaXCiOE7b-XL7SNx6IQ?pwd=uyb0
提取码:uyb0
下载完成,新建一个文件夹project10,把解压后的文件放进去。结果是这样的:
4、把相应的数据集放好,放在指定文件夹里。
在project10下新建一个文件夹,命名为data。在data下新建两个文件夹,分别是train和valid,train下新建两个文件夹分别是images和labels,valid下新建两个文件夹分别是images和labels。images里是图片,labels里是标签。如果是按照第2步下载的数据集,里边的文件命名都是弄好的,直接复制文件夹到响应的位置就可以。为了更清楚,贴个图。
这里需要说明一下的是,项目名称project10可以是任意的,存放train和valid文件夹的data文件夹,命名可以是任意的,但是train和valid,包括里边包含的jimages和labels千万不能变,因为源码里读这些文件的代码都是写好的,改了就会报错。
5、做一个yaml配置文件,位置在data里,如上图
新建一个txt文件,重命名data.yaml,注意修改后缀为yaml。
里边的代码是这样的:
train: ../data/train/images val: ../data/valid/images nc: 10 names: ['Ban', 'BanLeft','BanRight','BanStright','Bee','TurnLeft','TurnRight','GoStright','Park','Stop']
强烈建议直接复制粘贴,否则报错的可能性比较大。
train后边的内容是代码读训练集照片的地方,val后边的内容是代码读测试集照片的地方。
nc是指标签的分类,在交通指示牌项目里,一共有10种标签,所以这里是10。
names是nc里具体的标签。
报错的点大概是有两个,一个是每一个冒号后边要有一个空格,如果自己打的话可能会忘,一个是路径可能会写错。
6、下载预训练权重文件,放在yolov5-master文件下。权重文件有很多种,比如有yolov5s.pt和yolov5m.pt,相对来讲,s要比m小,训练速度更快,但是精度可能略差一些。
下载链接:
链接:https://pan.baidu.com/s/1Ys_ky2tX4KCiYwf_BshTGA?pwd=wuvu
提取码:wuvu
7、修改源代码,配置文件的地方。
修改一下yolov5s.pt对应的yaml文件,如下图所示,nc是分类的数量,这个数据集一共是要分10类,所以这里改为10。
训练模型的话,是修改train.py里的内容
主要是修改这几个地方。
-weights 是预训练权重,也就是刚刚第6步放的yolov5s.pt文件
-cfg 是yolov5s所对应的yaml文件,这个文件在models里有
-data是刚才第5步配置的那个data.yaml文件
-epochs 是迭代次数,迭代次数越多可能效果模型越好,但是时间也就越长,默认的是300
-batch size 是训练一次使用多少个batch,越大越吃显存,但是速度越快,我的电脑是1650ti 4G显存,如果这里写16会报错显存溢出。根据自己的电脑来吧。
根据上边的表述,我们改成的结果如下:
可能遇到的报错:
找到在File "C:\Users\it possible\Documents\yolov5Project\yolov5-master\models\yolo.py"的line 145
将代码修改为:
def _initialize_biases(self, cf=None): # initialize biases into Detect(), cf is class frequency # 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)
运行,又提示新错误:
解决办法:https://blog.csdn.net/wxd1233/article/details/120565148
将数据集中的labels.cache文件去掉即可。train和vail都去掉。
ok,出现这个图片的结果,说明开始训练了:
红色框那个是显存,我电脑显卡比较拉,所以我把batch-size改的非常小,所以占用显存就比较小。
还有额外一点需要注意
这个device参数是用来修改是用cpu训练还是用gpu训练,默认情况下是gpu训练。如果要改的话,就在default里边写就行了。
运行玩一个epoch之后,又来了新的报错:
找到错误位置,修改如下,加一个cpu(),这里应该是训练完一个epoch再调用gpu画图的时候出问题了,所以加一个cpu,用cpu画图:
看上图,第二个epoch开始跑了,说明就没有啥问题了,等着跑完就可以了,最后出现done,就是跑完了。跑的结果在哪里呢?在run文件夹下,最后一个exp文件,里边有这样的一个图片文件, 里边就是训练结果:
通过结果我们看到,训练的recall还算不错,90%以上了,而且慢慢收敛,趋于稳定。其他的指标大家可以百度一下。总而言之,这次训练的模型效果是不错了,也验证了yolov5的性能在这一点上还是可以的。
训练的模型在哪里呢?在weights文件夹下,有一个best,有一个last,best是最好的模型,后边就可以拿他来测试验证集上的数据,或者说预测新的数据。last是最后一次模型。看资料,有说上一次训练中断以后,可以用last继续训练,也就是说接着之前断开的时候,继续训练,但是自己没试过。
那如何用best.pt测试新的验证集呢?需要用到detect.py,等我跑通之后,再说!
电脑不同,环境版本不同,可能有新的错误出现,基本百度都可以解决,祝好,有问题私信。
标签:文件夹,yolov5,训练,train,报错,深度,data 来源: https://www.cnblogs.com/lgwdx/p/16527890.html