这是我第一次参加 Datawhale 组织的课程,选择的方向是我之前完全没有接触过的 CV 图像领域,这其实是我们学校 CAD&CG 实验室的强势方向,借此机会体验一下与 NLP 领域的关联与区别。

Deepfake 是一个很有意思的课题,它可以实现将已有的图像或影片叠加至目标图像或影片上,实现以假乱真的效果。利用人工智能,抛弃传统的剪辑和 P 图的方式达到伪造的目的。很明显,这是一个大领域,典型的就是图像和音频方向,但我认为也可以扩展到 NLP 的文字领域,例如伪造他人的文风来撰写文章等等。

这次比赛是在 kaggle 上,根据介绍,很明显这是一个 GAN 的实现,需要我们提交修改后的训练代码实现更高的拟合分数,目前训练集还没释出就有人拿到了 6 个 9 的高分,有点猛的。

下面分 task 介绍我对助教直播课程和参看其他人 notebook 的理解:

Task 1 - Baseline 的理解

#TODO 需要先看助教提供的综述论文:Deepfake Generation and Detection: A benchmark and Survey

鉴别图像是否为伪造的特征有哪些?

  1. 图片细节,人像的话主要在五官
  2. 光线和阴影,例如阴影方向是否符合光源
  3. 像素细节,通常来说 P 图会有边缘锐化或者模糊的现象,那么这部分的像素就可以作为可以项加入计算
  4. 背景部分,检查物体边缘是否平滑,背景是否协调。老实说物体平滑好判断,但是背景协调有点难做,这有点像主观鉴别,难以落实到实际代码中
  5. 我个人认为还有一个方向,那就是图片色彩。在实际生活中,摄影师后期有很大一部分工作在调色,要知道肉眼可见和相机拍出来的图片是两回事。不同区域有着差别较大的色域可以作为鉴别的因素之一加入模型

训练过程的细节:

  • 使用 torch.utils.data.DataLoader 来加载训练集和验证集的数据,然后通过自定义的 transform 来进行数据增强,当然第三课有更多其他的数据增强方式
  • 性能评估部分使用了 Accuracy 来评估模型准确度。在实际应用中是不大够的,需要同时提供相应的判别原因,例如通过了什么方式来伪造的

重点部分:

  1. 损失函数和迭代训练,这是保证最终模型功能的核心部分,过拟合或者差拟合大量的出现在这个阶段
  2. 微调和数据增强,讲道理如果模型性能足够好,实际上是不需要这一步的,因为很容易造成 dataset-specific 的情况,只在当前数据集和验证集表现良好,损失了通用性。这样的模型是不大适合作为预训练模型来做迁移学习的。

Task 2 - 具体的图像深度学习细节

这一部分主讲老师非常详细,让我有了重上李沐老师课的感觉,关于各种激活函数表格和图片中都有详细介绍,但没学过深度学习的人恐怕是不那么容易理解的,尤其是公式推导方面。

这里提到了一个典型的数据集 ImageNet,基于它的预训练模型 CNN 可以在数据稀疏的情况下微调也能达到很好的效果。

微调:这个部分在 NLP 和 CV 领域看起来都是通用的,目标都是将最后一个输出层重新训练适应新任务。有点区别的是冻结大部分分层参数这一步在我的实际体验中是必要的,没有这一点炼出废丹的可能性会急剧增加。使用较低的学习率也是通用的手段。

这一节还提到了很多常见的图像分类网络,由于时间的问题只能一笔带过,这其实是我主要想接触的部分。

#TODO 此处需要后续修改填充内容

  • AlexNet,基于 CNN,八个层次,五个卷积,三个连接(需要了解一下图像池化的具体代码实现)
  • ResNet,有听说过,能够有效的缓解梯度爆炸和消失的问题(主要想了解的东西,残差块的具体实现),因为有效的解决了梯度的问题,该模型能实现 100+ 的网络层数
  • EfficientNet,这个实现其实更像是做了一次消融研究,找到了缩放网络深度、宽度和分辨率的复合系数,不再是随机选取。

Task 3 - 数据增强的思路

对于图像,数据变换的方式就和自然语言处理极为不同,为了增强鲁棒性,会通过旋转图片,改变视角、光照和遮挡等方式来实现泛化,感觉更灵活多样。但讲道理也更容易识别到错误特征才对,不知道图像上是怎么规避的,这节课提到的尽量不与实际任务相违背是一个很好的切入点,但无关噪声肯定还是有的,怎么去掉他们呢?

#TODO 查询 CV 数据增强去掉无关噪声的具体方法和代码

增强图片数据:

  1. 调整大小。这个重要,能够保证输入的一致性,一般在数据预处理的时候完成,但也可以考虑模型迭代输出的时候处理?
  2. 随机水平翻转。我无法理解这样怎么模拟不同方向的观察,除非图像做 3D 建模才能实现
  3. 随机垂直翻转。与上同
  4. 转换成张量。典型深度学习的方法
  5. 归一化。不多说,加快模型收敛的妙招

Hint:别忘了验证集也要做对应的归一化

常见的数据增强方法

这里提到了 torchvision 这个工具包,能实现以下几种预处理

  • 几何变换
  • 颜色变换
  • 自动增强(应该是核心内容,需要查看具体代码)

进阶方法

#TODO 下面的方法需要有一个 benchmark 来对比,加权的方法值得研究,需要详细看公式

  • Mixup,两个图像和标签按比例混合成一个新训练样本。神奇的方法,不知道这个比例有没有做过对应的消融研究或者有自适应的方案。
  • Cutmix,将图片剪切并粘贴到另一个图像形成新样本。我注意到笔记里说的剪切和粘贴似乎都提到了随机,这样的话能得到很多的新样本?是否意味着需要多次训练取其中最佳的数据增强?

训练过程的杂记

  1. kaggle 的免费时长不大够用,勉强跑完一次全部数据就不够了。可以考虑到 AutoDL 上继续训练。
  2. 训练过程网页进度条卡住,群友提供了一个解决方案。Save version 然后再 Save & Run All,我实际体验下来不需要 Run All,只要保存了就可以一步步跑。
  3. efficientnet_b4 跑全部数据确实太大了,内存不够用的,需要小一点的模型,例如 b1,助教也提到了调小 batchsize 的方案(40 以下),还没有试。

参考他人的 Notebook 代码实现

  • timm 库的具体应用

#TODO 第一次接触 timm 这个库,下面这个教程很好的介绍了常用参数的含义和使用方法

https://www.kaggle.com/competitions/multi-ffdi/discussion/520812

https://www.kaggle.com/code/hallo123/timm-tutorial

  • 数据增强

#TODO 群友提到的数据增强相关的讨论,还没有尝试

https://www.kaggle.com/competitions/multi-ffdi/discussion/521401

  • 九月的分享

这是我主要参考的一个 notebook,提到了很多可以尝试的调整思路,目前我得分最高的是参考了 Modifications5

https://www.kaggle.com/code/chg0901/0-98-deepfake-ffdi-ways-to-defeat-0-86-beseline?scriptVersionId=188484355&cellId=1

  • ArcFace,让 label 也参与训练,图片相似度高的时候,能输出差不多的结果

#TODO 有时间看看具体实现

https://www.kaggle.com/code/athrunzala/arcface-learning-notebook