其他分享
首页 > 其他分享> > 深度学习——使用yolov5,训练自己的数据集

深度学习——使用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会报错显存溢出。根据自己的电脑来吧。

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

 

可能遇到的报错:

 

 

 解决方案: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