1.数据增强介绍
当我们训练集中的图片比较少时,容易造成网络的过拟合。为了避免这种情况一般我们要经过图像处理的方法,人为地去增加些图片数据,这样就会增加我们可用图片的数目,减少过拟合的可能性。
- 可以通过像素级的剪裁(Crop)、旋转(Rotation)、反转(Flip)、色调(Hue)、饱和度(Saturation)、曝光量(Exposure)、宽高比(Aspect)来做数据增强。
- 另外还可以在图片级数据增强,比如MixUp、CurMix、Mosaic、Blur
2.图片级像素增强
- Mixup: 如图在一张狗的图片中,叠加一只猫的图片,这样经过两幅图片的加权运算可以看到,可以看到这幅新的图片上既有狗又有猫。
- Cutout: 如图,将图片中某一块区域,填充为某种颜色,比如图中填充为黑色
- CutMix: 如图,将图片某一块区域剪裁掉,然后用另外一幅图像来填充剪裁区域
- Mosaic 数据增强:它是把四副图片拼成一幅大图,在YOLOv5中数据增强就是采用Mosaic方法,该方法由YOLOv5作者提出。如下图所示
YOLOv5在训练过程中,将4副小图拼成一幅大图,4副小图在拼接时做了随机的处理,所以4副小图的大小形状是不一样的。 - 我们可以通过
train.py --rect
去省略掉mosaic --rect
,通过对整个数据集的宽高比进行排序,然后对相似的宽高比例图片组合在一起。- 按宽高比排序的好处是,可以降低FLOPS运算,加速数据处理
3. 代码讲解
3.1 mosaic 代码
代码位置yolov5-3.1 > utils > datasets.py
def load_mosaic(self, index):
# loads images in a mosaic
labels4 = []
s = self.img_size
#随机取mosaic中心点
yc, xc = [int(random.uniform(-x, 2 * s + x)) for x in self.mosaic_border] # mosaic center x, y
#随机取其他三张图片的索引
indices = [index] + [random.randint(0, len(self.labels) - 1) for _ in range(3)] # 3 additional image