1 数据增强方法
1.1 常见的数据增强方法
数据增强是一种扩充数据集的方法,主要分为两大类:几何变换
和 颜色变换
。
几何变换包括:
- 尺寸变换
- 裁剪:中心裁剪、随机裁剪、五裁剪、十裁剪等
- 翻转:水平翻转、垂直翻转、随机翻转等
- 旋转: 固定角度旋转、随机旋转
- 仿射变换
- 透视变换
颜色变换包括:
- 颜色抖动:随机改变图像的亮度、对比度、饱和度和色调
- 灰度化:彩色图片转为灰度图
- 加噪声:高斯噪声、泊松噪声、椒盐噪声、伽马噪声等
- 颜色反转:随机颜色翻转,阈值颜色翻转
1.2 进阶的数据增强方法
- Mixup:一种数据增强技术,其原理是通过将两个不同的图像及其标签按照一定的比例混合,从而创建一个新的训练样本,新数据的标签与比例混合相关。
多用于多分类的任务
,在本赛题中可能并不适用。 - Cutmix:将一个图像的一部分剪切并粘贴到另一个图像上来创建新的训练样本,根据裁剪区域的大小比例决定新数据的标签。
1.3 在Pytorch中使用数据增强
在使用数据增强时我们可以单独使用 某一种方法
也可以 多种方法组合
使用,但是一定要根据具体任务具体分析使用哪些数据增强方法,有时候使用不当则会带来副作用。另外我们也可以使用 自动增强
(AutoAugment)和 随即增强
(RandAugment)来扩充数据。自动增强可以根据数据集中的数据分布情况自动学习数据增强策略,随即增强则会随机选择几种数据增强方法进行组合生成更多样性的数据。
Pytorch中的transforms库提供了许多现成的数据增强方法,我们只需要调用相应的API即可。
官方文档:https://pytorch.org/vision/stable/transforms.html#v2-api-reference-recommended
2 探究数据增强在Deepfake比赛中的作用
为了探寻不同的数据增强方法是否对本次Deepfake比赛有用,本文进行了控制变量实验,是否使用数据增强和数据增强类别作为变量,其余超参数,模型等变量均设置一致。以下是超参及模型配置:
参数 | 值 |
---|---|
模型 | Resnet18 |
学习率 | 0.001 |
批大小 | 256 |
Epoch | 20 |
损失函数 | 交叉熵损失函数(CrossEntropyLoss) |
参数优化器 | Adagrad(model.parameters(), lr=0.001) |
学习率调度器 | CosineAnnealingLR(optimizer, T_max=epoch_num) |
训练集 | 前10000条数据 |
验证集 | 所有验证集数据 |
空白对照实验
(不使用任何数据增强)的训练集加载器如下:
# 定义训练数据加载器
train_loader = torch.utils.data.DataLoader(
FFDIDataset(train_label['path'][:10000], train_label['target'][:10000],
transforms.Compose([
transforms.Resize((256, 256)), # 调整图像大小
transforms.ToTensor(), # 转换为张量
transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225]) # 归一化
])
), batch_size=bs_value, shuffle=True, num_workers=8, pin_memory=True
)
2.1 实验一:颜色抖动是否对结果有影响
在人眼分辩Fake图片和Real图片时,光照、阴影等光线明亮是一个重要的参考标准。通常Fake图片中的阴影会出现与实际不符,光线关照发生畸变不自然等情况。因此推断对数据进行颜色抖动形式的数据增强会使得模型效果变差,为了验证是否存在这种情况,进行以下对比试验。我们使用颜色抖动的数据增强方法的各种参数变换范围如下:
参数 | 范围 |
---|---|
亮度变换范围 | [0.5, 1.5] |
对比度范围 | [0.5, 1.5] |
饱和度范围 | [0.5, 1.5] |
色相范围 | [0.5, 1.5] |
实验结果如下(实验结果为运行两次取平均值,以避免随机误差):
Methed | Val Acc |
---|---|
Resnet18 不使用数据增强 | 73.82 |
Resnet18 使用颜色抖动 | 72.895 |
从实验结果看来,当使用参数为ColorJitter(brightness=0.5, contrast=0.5, saturation=0.5, hue=0.1)的数据增强时,会使得模型效果变差,因此不推荐在本次比赛中使用颜色抖动的方式进行数据增强。
对应的训练集加载器如下所示:
# 颜色变换
color_jitter = transforms.ColorJitter(
brightness=0.5, # 亮度范围为 [0.5, 1.5]
contrast=0.5, # 对比度范围为 [0.5, 1.5]
saturation=0.5, # 饱和度范围为 [0.5, 1.5]
hue=0.1 # 色相范围为 [-0.1, 0.1]
)
# 定义训练数据加载器
train_loader = torch.utils.data.DataLoader(
FFDIDataset(train_label['path'][:10000], train_label['target'][:10000],
transforms.Compose([
transforms.Resize((256, 256)), # 调整图像大小
transforms.ToTensor(), # 转换为张量
color_jitter,
transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225]) # 归一化
])
), batch_size=bs_value, shuffle=True, num_workers=8, pin_memory=True
)
2.2 实验二:随机增强的次数对结果的影响
RandAugment是Pytorch提供的一个随机图片数据增强的库。它可以对图片进行随机的处理操作,通过查看源码可以得知,可能进行的操作有14种。源码连接:RandAugment源码。由源码可知,RandAugment有两个重要参数 num_ops
和 magnitude
,它们分别代表进行几次随机增强和随即增强的强度,默认值分别为2和9。我们继续控制变量法进行实验,控制magnitude=9,分别测试num_ops=1,2,3,4,5时的结果如何,以探讨随机增强次数对结果的影响,由于时间有限仅做了1次实验。
操作 | 解释 |
---|---|
Identity | 不做任何变换 |
ShearX | 沿X轴方向进行剪切变换 |
ShearY | 沿Y轴方向进行剪切变换 |
TranslateX | 沿X轴方向平移 |
TranslateY | 沿Y轴方向平移 |
Rotate | 旋转图像 |
Brightness | 调整图像的亮度 |
Color | 调整图像的颜色平衡 |
Contrast | 调整图像的对比度 |
Sharpness | 调整图像的锐度 |
Posterize | 减少图像的颜色数量 |
Solarize | 反转图像的像素值 |
AutoContrast | 自动对比度增强 |
Equalize | 直方图均衡化 |
实验结果如下:
num_ops | Val Acc |
---|---|
1 | 74.08 |
2 | 73.45 |
3 | 72.42 |
4 | 71.87 |
5 | 69.46 |
通过实验结果可以发现,随着num_ops的增加,Val Acc却逐渐减小。但是从理论上分析,随着随即操作数的增多,数据应该会更加的多样性,也就是说会极大地丰富训练集,模型因此可以更具鲁棒性,但是结果恰恰相反。
我猜测有以下原因导致实验结果与理论不符:
- Resnet18模型太简单,更多的数据增强次数虽然丰富了训练数据,但是模型本身参数太少,训练时遇到了模型性能瓶颈。
- 训练Epoch太少,对于更丰富的数据,模型可能需要更多次的训练才能拟合,也许20个Epoch模型并没有真正的拟合。
- 单次实验具有随机性,应该多次实验求平均。
3 总结
两个实验的训练代码可以在github找到。
非常感谢Datawhale举办的AI夏令营活动。这个活动不仅提供了非常详细且对初学者友好的Baseline和学习手册,还包含了直播讲解和答疑环节,为许多不了解AI的同学提供了一个极好的学习机会。
在此次AI夏令营中,我选择了CV图像方向,具体任务是Deepfake人脸识别。这是我第一次接触这个领域,通过学习Task1,我了解了什么是Deepfake,以及如何使用神经网络分辨伪造的人脸,并且学会了如何使用timm库加载一些预训练模型。在Task2的学习中,九月老师带领我们认识了深度学习,讲解了深度学习训练的过程,并介绍了常见的用于图片分类的神经网络。通过Task2的学习,我温故而知新,以前并不理解代码中的loss、model、optimizer之间的关系,只知道训练模型的流程而不理解其真正含义。现在,我已经明白了代码与训练步骤之间的联系,达到了融会贯通的效果。在Task3的学习中,我学习了一些数据增强技术。之前只知道可以通过旋转、裁剪、翻转、剪切等操作进行数据增强,从未了解过还有颜色抖动、自动增强、随机增强、混合增强、混合裁剪增强等方法。在学习之后,我还亲自动手实验,测试了数据增强对最终结果的影响。尽管实验设计不够完善,但这也锻炼了我的编码能力和思考问题的能力。
再次感谢Datawhale和所有助教工作人员的付出,你们真的非常棒,为你们点赞👍。希望以后有机会可以加入你们,共同学习,共同进步。