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)

具体插入位置如下图所示(代码部分以上面为准,有所改动,下图仅参考插入位置):
YOLOv5保存数据增强结果_第1张图片

效果展示

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

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

效果展示

YOLOv5保存数据增强结果_第4张图片
YOLOv5保存数据增强结果_第5张图片

注意

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

运行

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

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

问题

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

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

你可能感兴趣的:(yolo项目,YOLO,机器学习,计算机视觉,图像处理)