YOLOv5保存数据增强结果

前言

本篇不会讲过多的原理,因为网上有很多关于YOLOv5的数据增强的原理,讲的都很详细,但是似乎找不到有关将增强结果保存到文件夹的笔记。
可能也是因为用途比较少,刚好我需要使用一些增强的数据所以琢磨研究了怎么保存其结果(刚开始是尝试调用有关函数进行使用,后面发现关联的函数实在太多了比较复杂还不如直接修改其输出)。
如果你进行深度学习但数据集似乎不太够,且寻找新的一组数据的代价较大的话,可以尝试使用数据增强进行扩充数据集来达到目的。

数据增强大概流程

train.py里调用create_dataloader函数
dataloaders.py里的create_dataloader函数
初始化LoadImagesAndLabels类
调用__getitem__函数进行数据增强

__getitem__是进行数据增强的函数,所以基本上我们就是在__getitem__函数进行修改代码。

具体操作

如果需要马赛克拼图的话,在超参配置文件中赋值mosaic为1,默认是开启的。

在utils/dataloaders.py文件的__getitem__函数中已经进行完所有的增强后但在img和label并未进行处理之前插入以下代码:

# 将数据增强结果输出保存
if not index < 0:
    save_root = "保存结果的文件夹"
    img_name = os.path.join(save_root, "foot_t_" + str(index) + ".jpg")
    label_name = os.path.join(save_root, "foot_t_" + str(index) + ".txt")
    if not self.augment:
    	img_name = os.path.join(save_root, "foot_v_" + str(index) + ".jpg") 
    	label_name = os.path.join(save_root, "foot_v_" + str(index) + ".txt")
    	# 注意这里"foot_t_"和"foot_t_"是自己命名的,但是一定不能相同,不然每轮训练会有图片验证会覆盖掉增强的图片,或者可以根据自己的需求在下面几行几个判断不保存val图片也行
    cv2.imwrite(img_name, img)
    data = ""
    for a in range(len(labels)):
        data += str(int(labels[a][0])) + " " + str(labels[a][1]) + " " + str(labels[a][2])\
            + " " + str(labels[a][3]) + " " + str(labels[a][4]) + "\n"
    with open(label_name, "w", encoding="utf-8") as f:
        f.writelines(data)

具体插入位置如下图所示(代码部分以上面为准,有所改动,下图仅参考插入位置):
在这里插入图片描述

效果展示

在这里插入图片描述
在这里插入图片描述
效果如图,是一张主图与另外三张随机选出的辅图四宫格拼在一起(中心点的位置随机),然后再进行随机的旋转平移剪切等,再进行图片上的色相、饱和度、明度的随机变换。这些位置上或者颜色上的随机变换的量也是在一定的范围之内取随机数的,范围的设置在超参配置文件中,最下面几个就是数据增强的超参。

如果觉得拼图会使目标变得不完全或者目标变小,可以减少超参mosaic的值降低马赛克拼图的概率,或者直接赋值为0,关闭马赛克拼图。

效果展示

在这里插入图片描述
在这里插入图片描述

注意

不仅增强结果会保存下来,验证时的图片也会保存下来,所以命名前缀要不一样除了以示区分外还保证先进行增强的结果不会被覆盖(也可以加个判断不保存val的数据)。

运行

python train.py --weights 预训练模型路径 --cfg 网络配置文件路径 --data 要增强的数据的数据集配置文件 --hyp 超参配置文件路径 --imgsz (图片大小不一定都是默认的416) --epochs 1

这里设置训练1轮是因为每一轮都是不一样的随机的数据增强,但是不会因为让它训练好几轮就会保存好几轮的增强结果,只会新的覆盖旧的(也可以一层一层往里传当前的epoch值加入到文件名当中就不会被覆盖)。

问题

如果只想要一次增强结果的可以到此为止,如果要好几次的增强结果保证数据多样性的可以运行多次命令,每运行一次得到一次结果。
此时问题就出现了,发现每一次运行的结果都是一样的,可是看了一下这些增强的变换
在这里插入图片描述
都是random的随机变换,打印一下日志发现确实每一轮的对应的图片的变换参数都是相同的(这里的相同指的是每次运行时,第一张图的变换都相同,第二张…;但是第一张、第二张…都各自不相同),这样的结果一点都不random(挠头)
网上查了一番,发现有类似问题,从这个问题当中得到了启发
在这里插入图片描述
或许算法里面是设置了随机种子,查找了一番果然是,且种子值为固定值所以每次都是相同的结果。
我们可以将它改一下,改成获取当前时间为种子值,这就有够random的了!
在这里插入图片描述
在train.py中进行修改,原本赋予种子值的语句注释掉换成自己的。
到此就完全没有问题了,如果各位遇到问题欢迎私心我一起交流一起学习!

这篇文章貌似最受欢迎,但是为什么各位光收藏不点赞呢?如果有用的话也请点个赞吧~

  • 18
    点赞
  • 73
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
YOLOv5是一种用于目标检测的深度学习模型。数据增强是一种常用的技术,用于扩充数据集以提高模型的泛化能力。在YOLOv5中,数据增强的过程可以通过修改代码来实现。 根据引用[1]中的描述,数据增强的流程大致如下: 1. 在train.py文件中调用create_dataloader函数。 2. 在dataloaders.py文件中的create_dataloader函数中初始化LoadImagesAndLabels类。 3. 调用LoadImagesAndLabels类的__getitem__函数进行数据增强。 引用[2]中提到,每一轮训练都会使用不同的随机数据增强,但并不会保存多轮的增强结果,新的结果会覆盖旧的结果。如果希望保存多轮的增强结果,可以在文件名中加入当前的epoch值来区分。 此外,引用[3]指出,在验证过程中,增强的结果和验证图片都会被保存下来。为了避免增强的结果被覆盖,可以使用不同的命名前缀来区分。也可以添加判断条件,不保存验证数据增强结果。 如果你想在YOLOv5中进行数据增强,可以运行以下命令: ``` python train.py --weights 预训练模型路径 --cfg 网络配置文件路径 --data 要增强数据数据集配置文件 --hyp 超参配置文件路径 --imgsz 图片大小 --epochs 1 ``` 其中,--weights参数指定预训练模型的路径,--cfg参数指定网络配置文件的路径,--data参数指定要增强数据集的配置文件的路径,--hyp参数指定超参数的配置文件的路径,--imgsz参数指定图片的大小,--epochs参数指定训练的轮数。 希望以上信息对你有所帮助。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值