Datawhale AI 夏令营——从零入门CV图像竞赛(Deepfake攻防) & Task3

数据增强,提升模型表现

数据增强基础

what & why?

数据增强(Data Augmentation)是一种通过人为增加训练数据来提高机器学习模型性能的技术。数据增强通常用于改善模型的泛化能力,即模型对未见数据的处理能力,目的是通过这些变换生成新的训练样本,这些样本与原始数据相似但不完全相同,从而可以增加模型的鲁棒性,减少过拟合的风险,提高模型在测试集上的表现。


数据增强需谨慎使用,应与实际任务场景相符,避免引入无关噪音和图像失真,以防止模型学习到错误特征或过拟合于增强数据,从而确保模型能在真实数据上表现良好。

// data augmentation
train_loader = torch.utils.data.DataLoader(
    FFDIDataset(train_label['path'], train_label['target'], 
            transforms.Compose([
                        transforms.Resize((256, 256)), //将所有图像调整到256x256像素的尺寸,这有助于确保输入数据的一致性。
                        transforms.RandomHorizontalFlip(), //随机地水平翻转图像,这种变换可以模拟物体在不同方向上的观察,从而增强模型的泛化能力。
                        transforms.RandomVerticalFlip(), //随机地垂直翻转图像,这同样是为了增加数据多样性,让模型能够学习到不同视角下的特征。
                        transforms.ToTensor(), //将PIL图像或Numpy数组转换为torch.FloatTensor类型,并除以255以将像素值范围从[0, 255]缩放到[0, 1]
                        transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225]) //对图像进行归一化处理,这里的均值和标准差是根据ImageNet数据集计算得出的,用于将图像像素值标准化,这有助于模型的训练稳定性和收敛速度。
        ])
    ), batch_size=40, shuffle=True, num_workers=4, pin_memory=True
)

val_loader = torch.utils.data.DataLoader(
    FFDIDataset(val_label['path'].head(1000), val_label['target'].head(1000), 
            transforms.Compose([
                        transforms.Resize((256, 256)),
                        transforms.ToTensor(),
                        transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])
        ])
    ), batch_size=40, shuffle=False, num_workers=4, pin_memory=True
)

在深度学习中,对输入数据进行归一化是一个标准步骤。归一化有助于加快模型的收敛速度,并提高数值稳定性。对于验证集,应该避免使用如随机翻转等可能引入不必要噪音的增强方法。通常,验证集只需要进行必要的预处理,如调整大小和归一化。

常见数据增强方法

torchvision提供了许多用于深度学习计算机视觉任务的工具和预训练模型,数据增强方法主要位于torchvision.transformstorchvision.transforms.v2模块中。这些增强方法可以用于图像分类、目标检测、图像分割和视频分类等各种任务。

几何变换

  • 调整大小: Resize 可以将图像调整到指定的大小,例如将所有图像调整为256x256像素。
  • 随机裁剪: RandomCrop 可以随机裁剪图像,例如从一个1024x1024像素的图像中随机裁剪出256x256像素的区域。
  • 中心裁剪: CenterCrop 从图像的中心裁剪出指定大小,例如从1024x1024像素的图像中裁剪出256x256像素的中心区域。
  • 五裁剪和十裁剪: FiveCrop 裁剪出图像的四个角和中心区域,TenCrop 则在每个角和中心区域分别进行水平和垂直翻转。
  • 翻转:
    RandomHorizontalFlip 可以水平翻转图像,例如将图像左右颠倒。
    RandomVerticalFlip 可以垂直翻转图像,例如将图像上下颠倒。
  • 旋转: RandomRotation 可以随机旋转图像,例如在-30度到30度之间随机选择一个角度进行旋转。
  • 仿射变换: RandomAffine 可以进行随机的仿射变换,包括旋转、平移、缩放和剪切的组合。
  • 透视变换: RandomPerspective 可以进行随机的透视变换,模拟图像从不同视角观察的效果。
  • 填充: Pad 可以在图像周围填充像素,例如在图像周围添加10像素的白色边框。

颜色变换

在这里插入图片描述

  • 颜色抖动: ColorJitter 可以随机改变图像的亮度、对比度、饱和度和色调,例如亮度变化范围为0.5,对比度变化范围为0.2,饱和度变化范围为0.5,色调变化范围为0.1。
  • 灰度化: Grayscale 和 RandomGrayscale 可以分别将图像转换为灰度图,RandomGrayscale 还可以随机决定是否进行灰度转换。
  • 高斯模糊: GaussianBlur 可以对图像进行高斯模糊,例如设置模糊半径为5像素。
  • 颜色反转: RandomInvert 可以随机反转图像的颜色,例如将图像的每个像素值从255减去其原始值,实现颜色反转。
  • 颜色 posterize: RandomPosterize 可以减少图像中每个颜色通道的位数,例如将每个颜色通道的位数减少到2位。
  • 颜色 solarize: RandomSolarize 可以反转图像中所有高于阈值的像素值,例如设置阈值为128。
  • 对比度增强: RandomContrast 可以随机增加或减少图像的对比度,例如将图像的对比度增加20%或减少10%。
  • 饱和度增强: RandomSaturation 可以随机增加或减少图像的饱和度,例如将图像的饱和度增加20%或减少10%。
  • 色调调整: RandomHue 可以在HSV颜色空间中随机调整图像的色调,例如将图像的色调旋转10度到20度。

自动增强

在这里插入图片描述

  • 自动增强: AutoAugment 可以根据数据集自动学习数据增强策略。例如,对于CIFAR-10数据集,AutoAugment可能会学习到旋转角度在0度到15度之间、裁剪大小为32x32像素、以及对比度增强是最佳的增强策略。
  • 随机增强: RandAugment 可以随机应用一系列数据增强操作。例如,对于一个特定的数据集,RandAugment可能会随机应用裁剪、翻转和颜色变换等操作,并且通过一个固定的增强强度参数来控制增强的强度。
  • TrivialAugmentWide: 提供与数据集无关的数据增强。例如,TrivialAugmentWide可能会随机应用对比度增强、饱和度降低和裁剪等操作,这些操作与数据集无关,可以适用于多种数据集。
  • AugMix: 通过混合多个增强操作进行数据增强。例如,AugMix可能会将两个图像和它们的增强操作混合在一起,生成新的训练样本。这种方法可以增加训练数据的多样性,提高模型的泛化能力。

进阶数据增强方法

Mixup

Mixup是一种数据增强技术,它通过在训练过程中将两个或多个样本及其标签按照一定的比例进行混合,来生成新的训练样本和标签。

Mixup 的操作步骤如下:

  1. 随机选择两个样本 (𝑥𝑖, 𝑦𝑖) 和 (𝑥𝑗, 𝑦𝑗) 从训练集中。
  2. 选择一个混合系数 𝜆,它通常是从一个 Beta 分布(例如 Beta(𝛼,𝛼),其中 𝛼 是一个超参数,通常设为 0.4)中随机抽取的,或者简单地从一个区间(例如 [0, 1])中均匀抽取。
  3. 计算混合后的样本和标签:
    新的样本 𝑥′ = 𝜆𝑥𝑖 + (1−𝜆)𝑥𝑗
    新的标签 𝑦′ = 𝜆𝑦𝑖 + (1−𝜆)𝑦𝑗
  4. 将新生成的样本 𝑥′ 和标签 𝑦′ 添加到训练集中。

Mixup可以用于分类任务和回归任务。在分类任务中,标签𝑦通常是独热编码的,因此混合后的标签也是独热编码的。在回归任务中,标签是连续的,因此可以直接进行数值上的混合。

通过这种方法,模型被迫学习到在样本之间更加平滑的决策边界,这有助于提高模型在未见数据上的表现。然而,Mixup的使用需要谨慎,因为它可能会引入与实际任务不相关的样本组合,从而影响模型的学习。

CutMix

CutMix也是一种数据增强技术,它结合了Cutout和Mixup两种方法的特点。在CutMix中,不是将整个图像按比例混合,而是从一张图像中随机裁剪出一个区域,并用另一张图像的对应区域替换,同时按照裁剪区域的大小比例混合两张图像的标签。

CutMix 的操作步骤如下:

  1. 随机选择两个样本 (𝑥𝑖, 𝑦𝑖) 和 (𝑥𝑗, 𝑦𝑗) 从训练集中。
  2. 随机生成一个裁剪的矩形区域,该区域的面积比例由一个 Beta 分布(例如 Beta(𝛼,𝛼),其中 𝛼 是一个超参数)确定。
  3. 从 𝑥𝑖 中裁剪出该矩形区域,并用 𝑥𝑗 中对应区域的像素替换。
  4. 根据裁剪区域占整个图像面积的比例,计算混合后的标签 𝑦′。如果裁剪区域的比例是 𝜆,则混合后的标签为:𝑦′ = 𝜆𝑦𝑖 + (1−𝜆)𝑦𝑗
  5. 将新生成的样本 𝑥′(经过裁剪和粘贴操作后的图像)和混合后的标签 𝑦′ 添加到训练集中。

CutMix 的好处是它既保留了 Mixup 的标签平滑效果,又引入了空间上的不连续性,这有助于模型学习到更细粒度的特征。这种方法特别适用于目标检测图像分割任务,因为它迫使模型不仅要识别整个对象,还要学习对象的不同部分。通过这种方式,CutMix 可以提高模型的泛化能力和鲁棒性

注:以上内容大多来自Datawhale AI 夏令营的知识教程,本文进行了相关补充和增改,仅作为笔记供自己记录学习使用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值