ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

深度学习——使用yolov5,训练自己的数据集

2022-07-31 17:03:45  阅读:295  来源: 互联网

标签:文件夹 yolov5 训练 train 报错 深度 data


截止到今天,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会报错显存溢出。根据自己的电脑来吧。

根据上边的表述,我们改成的结果如下:

 

可能遇到的报错:

 

 

 解决方案:yolov5报错:RuntimeError: a view of a leaf Variable that requires grad is being used in an in-place_一位安分的码农的博客-CSDN博客

找到在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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有