当前位置:   article > 正文

Datawhale AI夏令营-多模态Task1学习笔记

Datawhale AI夏令营-多模态Task1学习笔记

Task1学习笔记

学习任务

入门Deepfake & 初步熟悉Baseline

学习过程

Part1 从学校的课程到现实的舞台

我在学校接触到的有讲到Deepfake技术的课程有两门:在专业前沿讲座上,老师首先是引入了生成式AI的概念,让我们见识到了生成式大模型的强大——比如说专门生成视频的Sora AI,研发团队提供的样片质量非常高,若不是从细节上吹毛求疵,很难分辨真假。

所以,Deepfake技术的危险程度也随之增加了。根据大学老师,Datawhale以及现实的资料显示,使用人工智能技术生成的伪造媒体,特别是视频和音频,它们看起来或听起来非常真实,特别是生成对抗网络(GANs),它们能够学习真实数据的特征,并生成新的、逼真的数据。

其中AI换脸方向上,当时互联网上比较火热的是“肌肉金轮”。

是啊,将大司马的脸换到一个健身博主的身体上后,由于大司马“年轻时候很帅的”(出处:CSGO大茄子),和这样的身材一结合简直不要太帅。

从整个视频中我们可以看出此时生成式AI在五官比例上已经十分的善于适配了,甚至原作者的神情都近乎完美地还原了——但是我们还是能看到一些瑕疵。比如说眼镜架子消失的问题还是很明显的,此时的Deepfake更多是在2D领域的变换。

那“肌肉金轮”的爆火给大司马带来了什么呢?首先是他的水友给他刷火箭让他看,当时他以为只是开玩笑。谁知道日后这个梗爆火时斗鱼官方在未经大司马同意的情况下直接将大司马的直播间封面换成了“肌肉金轮”,大司马这回就生气了。

是的,一来Deepfake技术让人可能满足了一些他们所想要但又暂时不可得到的“Deep Dark Fantasies”。那些通过Deepfake技术获得的虚假的标签在互联网上很容易让人在通过标签给对方画像时造成误判,从而引发新的认知安全

也就是说,Deepfake技术可以让很多场景的模拟更加逼真,但这是一把双刃剑——用得好,人们在科学领域通过计算就可以使大量的场景可视化,可一旦失控,就如同学习时所言,在政治领域,Deepfake可能被用来制造假新闻或操纵舆论,影响选举结果和政治稳定。经济上,它可能破坏企业形象,引发市场恐慌,甚至操纵股市。法律体系也面临挑战,因为伪造的证据可能误导司法判断。此外,深度伪造技术还可能加剧身份盗窃的风险,成为恐怖分子的新工具,煽动暴力和社会动荡,威胁国家安全。

从信息安全系统设计中,以手写数字识别为例。可见GAN通过对样本进行学习,同样点对点生成了对目标模型的干扰样本。那假如说人们通过收集某一特定群体的浏览数据生成专门的Deepfake,比如说对非广东人投放黑人的Deepfake,那欺骗成功率肯定更高。

然后我们就见到了抖音上一堆AI换脸的俄罗斯美女操着一口比湖南人还强的塑料普通话推销蜂王浆。(出处:中国食品报融媒体)

问题是还真成功了,然后我们可以通过人工识别方法,在像素模糊、不协调等方向抓住她们的马尾——可那些看抖音的老人怎么办?我们不可能指望他们知道Deepfake,他们可能还报有“视频不能P”的传统观念,然后上钩。

Part2 如何识别Deepfake?

如果想要人工识别Deepfake的图片,可以通过以下逻辑步骤进行:

  • 首先,观察图片的细节。仔细检查人物的面部特征,尤其是眼睛和嘴巴,看是否有不自然的眨眼频率或口型与说话内容不同步的现象。

  • 接着,检查光线和阴影。分析图片中的光源是否一致,阴影的方向是否与光源相符,不自然的光线或阴影可能是图片被修改的迹象。

  • 然后,分析像素。放大图片,寻找是否有模糊或像素化的部分,这可能是Deepfake技术留下的瑕疵。

  • 此外,注意背景。检查背景中是否有不协调的元素,比如物体边缘是否平滑,背景中是否有不自然的重复模式。

可见这些东西都是基于现实经验,可现实往往比生活更加魔幻。遇到现实中还没经历到的事情时,Deepfake还有可能被人为识别出来吗?比如说,面对人工识别Deepfake图片细节时我们也可以通过生活经验得到一个独特的领域,那就是人的脖子——肌肉可以通过锻炼变得紧致,皮肤的松弛可不能。有人说可以面部拉皮,但脖子上动脉密布的可不能拉皮!

想想我以前的英语老师,五十多岁的老阿姨了,虽然脸上保养的和三十多岁无异,但她的脖子就松弛得不像样了。

那假如就一个大头贴呢?这条经验就失效了。

看来,还是得用魔法打败魔法。

Part3 深度学习与Deepfake

机器学习是人工智能的一个分支,它使计算机系统利用数据来不断改进性能,而无需进行明确的编程。

核心思想:通过算法和统计模型,机器学习允许计算机从经验中学习,识别模式,并做出预测或决策。

  • 监督学习:算法从标记的训练数据中学习,这些数据包含了输入和期望的输出。

  • 无监督学习:算法处理未标记的数据,试图找出数据中的结构和模式。

  • 半监督学习:以监督学习的模型作为参考,通过无监督学习的模型计算偏差率,通过条件概率充分发挥计算机的学习能力。(项目经验)

深度学习是机器学习的一个子集,它使用类似于人脑的神经网络结构,特别是深层神经网络,来模拟人类学习过程。深度学习模型通过模拟人脑处理信息的方式来识别数据中的复杂模式和特征。

深度学习是一种强大的机器学习技术,它通过模拟人脑处理信息的方式,使计算机能够从大量数据中自动学习和识别模式。深度学习模型,尤其是卷积神经网络(CNN),能够识别图像和视频中的复杂特征。在Deepfake检测中,模型可以学习识别伪造内容中可能存在的微妙异常。(以前天天给人鉴定AI绘画,现在下意识拿到画作后将图片放大,让我不能欣赏它的美了!)

为了训练有效的Deepfake检测模型,需要构建包含各种Deepfake和真实样本的数据集。深度学习模型通过这些数据集学习区分真假内容。

Part4:

Baseline 关键步骤

  1. 数据准备:使用Pandas库读取训练集和验证集的标签,并将图片路径与标签结合,以便于后续处理。

  2. 定义生成MEL频谱图的函数generate_mel_spectrogram函数用于从视频文件中提取音频,并生成MEL频谱图,然后将其转换为图像格式。

  3. 定义训练、验证和预测函数trainvalidatepredict函数分别用于模型的训练、在验证集上评估模型性能以及生成预测结果。

  4. 模型初始化和训练:初始化resnet18模型,并使用Adam优化器和交叉熵损失函数进行训练。训练过程中使用了学习率调度器,并在每个epoch结束时在验证集上评估模型性能。

  5. 保存最佳模型:在验证过程中,如果模型的性能超过了之前的最佳性能,则保存模型的权重。

  6. 生成预测结果:使用训练好的模型对验证集进行预测,并将预测结果保存到submit.csv文件中。

  7. 提交结果:最后,代码将预测的分数与原始的提交模板合并,并保存为最终的提交文件。

提取音频特征

在识别Deepfake视频时,音频分析之所以简单,是因为Deepfake技术生成的视频中,音频可能存在不自然或重复的模式,例如重复的单词或短语。通过分析音频的频谱图,可以更容易地发现这些异常,从而帮助识别视频是否经过了深度伪造处理。

为什么是MEL频谱图?

MEL频谱图(Mel-spectrogram)是一种在音频信号处理领域常用的可视化工具,它基于人耳的听觉特性来表示音频信号的频率内容。梅尔刻度是一种对频率进行非线性缩放的方法,它将线性频率映射到梅尔频率上,使得梅尔刻度上的间隔更接近人耳感知的间隔

  1. def generate_mel_spectrogram(video_path, n_mels=128, fmax=8000, target_size=(256, 256)):
  2. # 提取音频
  3. audio_path = 'extracted_audio.wav'
  4. video = mp.VideoFileClip(video_path)
  5. video.audio.write_audiofile(audio_path, verbose=False, logger=None)
  6. # 加载音频文件
  7. y, sr = librosa.load(audio_path)
  8. # 生成MEL频谱图
  9. S = librosa.feature.melspectrogram(y=y, sr=sr, n_mels=n_mels)
  10. # 将频谱图转换为dB单位
  11. S_dB = librosa.power_to_db(S, ref=np.max)
  12. # 归一化到0-255之间
  13. S_dB_normalized = cv2.normalize(S_dB, None, 0, 255, cv2.NORM_MINMAX)
  14. # 将浮点数转换为无符号8位整型
  15. S_dB_normalized = S_dB_normalized.astype(np.uint8)
  16. # 缩放到目标大小
  17. img_resized = cv2.resize(S_dB_normalized, target_size, interpolation=cv2.INTER_LINEAR)
  18. return img_resized

定义模型训练步骤

在深度学习中,模型训练通常需要进行多次迭代,而不是单次完成。深度学习模型的训练本质上是一个优化问题,目标是最小化损失函数。梯度下降算法通过计算损失函数相对于模型参数的梯度来更新参数。由于每次参数更新只能基于一个数据批次来计算梯度,因此需要多次迭代,每次处理一个新的数据批次,以确保模型在整个数据集上都能得到优化。

模型训练的流程如下:

  1. 设置训练模式:通过调用model.train()将模型设置为训练模式。在训练模式下,模型的某些层(如BatchNormDropout)会按照它们在训练期间应有的方式运行。

  2. 遍历数据加载器:使用enumerate(train_loader)遍历train_loader提供的数据批次。input是批次中的图像数据,target是对应的标签。

  3. 数据移动到GPU:通过.cuda(non_blocking=True)将数据和标签移动到GPU上。non_blocking参数设置为True意味着如果数据正在被复制到GPU,此操作会立即返回,不会等待数据传输完成。

  4. 前向传播:通过output = model(input)进行前向传播,计算模型对输入数据的预测。

  5. 计算损失:使用损失函数loss = criterion(output, target)计算预测输出和目标标签之间的差异。

  6. 梯度归零:在每次迭代开始前,通过optimizer.zero_grad()清空(重置)之前的梯度,以防止梯度累积。

  7. 反向传播:调用loss.backward()计算损失相对于模型参数的梯度。

  8. 参数更新:通过optimizer.step()根据计算得到的梯度更新模型的参数。

  1. def train(train_loader, model, criterion, optimizer, epoch):
  2. # switch to train mode
  3. model.train()
  4. end = time.time()
  5. for i, (input, target) in enumerate(train_loader):
  6. input = input.cuda(non_blocking=True)
  7. target = target.cuda(non_blocking=True)
  8. # compute output
  9. output = model(input)
  10. loss = criterion(output, target)
  11. optimizer.zero_grad()
  12. loss.backward()
  13. optimizer.step()

数据集增强

增加数据多样性是数据增强的核心目的。更多的数据,更高的准确率,过拟合那是之后再考虑的事情。

在对图像的处理上,可通过对原始图像进行如旋转、缩放、翻转等操作,对图片RGB矩阵进行转置变换,生成新的训练样本,使模型学习到更丰富的特征表示。

在讲座中,他们提到了一个重要信息:音画不同步是不算Deepfake的,因此除了常规操作外,给视频加上遮罩,消音以及将音画调整至不同步同样也可以丰富数据集。

  1. train_loader = torch.utils.data.DataLoader(
  2. FFDIDataset(train_label['path'], train_label['target'],
  3. transforms.Compose([
  4. transforms.Resize((256, 256)),
  5. transforms.RandomHorizontalFlip(),
  6. transforms.RandomVerticalFlip(),
  7. transforms.ToTensor(),
  8. transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])
  9. ])
  10. ), batch_size=40, shuffle=True, num_workers=4, pin_memory=True
  11. )

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/903648
推荐阅读
相关标签
  

闽ICP备14008679号