Datawhale AI 夏令营 Task01了解Deepfake&初探baseline--学习有感

Amelia&pku 2024-07-18 15:01:02 阅读 97

目录

学习目标:

写在前面

正式内容

Deepfake初识

识别Deepfake

深度学习与Deepfake的联系

机器学习与深度学习

深度学习与Deepfake

baseline关键步骤

加载预训练模型

定义模型训练

数据集增强


学习目标:

(1)了解Deepfake的定义,并初步理解baseline代码。

(2)深入探讨Deepfake技术的原理、应用案例以及检测方法。

(3)通过实践项目和案例研究,理解Deepfake技术的制作过程,并学习如何辨别Deepfake内容。

写在前面

昨天我已经用了将近25分钟的时间把baseline按照说明文档的要求跑了一遍,过程较为顺利,除了手机验证码和网络出现了一点意外,整个过程非常丝滑,run all完整跑下来用了13分钟,最后的结果在群里也算还不错,是0.55027……

那么接下来将正式进入task 01的学习。

正式内容

Deepfake初识

在加入DataWhale的夏令营之前,我对deepfake几乎是一无所知,可能看过AI换脸以及文物(例如蒙娜丽莎说话或者做其他动作)等类似的视频,但我终归没去研究过深层次的内容。今天也算是长了长见识。

Deepfake是一种使用人工智能技术生成的伪造媒体,特别是视频和音频,它们看起来或听起来非常真实,但实际上是由计算机生成的。这种技术通常涉及到深度学习算法,特别是生成对抗网络(GANs),它们能够学习真实数据的特征,并生成新的、逼真的数据。

用我的话,通俗来讲就是虚拟视频/音频,可能不是很准确,但是我的理解是这样的,不是真的那么就是假的,又是AI生成的,说成虚拟的也不为过吧/偷笑

目前深度伪造技术通常可以分为四个主流研究方向:

面部交换,专注于在两个人的图像之间执行身份交换;

面部重演,强调转移源运动和姿态;

说话面部生成,专注于在角色生成中实现口型与文本内容的自然匹配;

面部属性编辑,旨在修改目标图像的特定面部属性;

识别Deepfake

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

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

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

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

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

深度学习与Deepfake的联系

在理解深度学习与Deepfake的联系之前,可能需要先解释机器学习和深度学习的关系,机器学习是深度学习的“老祖”,深度学习属于机器学习,但是通俗意义上来讲,深度学习更复杂一些。

机器学习与深度学习

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

机器学习 深度学习
机器学习算法相对简单,如线性回归、决策树等,它们可以解决各种问题,但可能不擅长处理非常复杂的数据。 深度学习算法通常更复杂,依赖于多层的神经网络结构,能够处理和学习高维度和复杂的数据模式。

深度学习与Deepfake

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

深度学习是一种强大的机器学习技术,它通过模拟人脑处理信息的方式,使计算机能够从大量数据中自动学习和识别模式。深度学习模型,尤其是卷积神经网络(CNN),能够识别图像和视频中的复杂特征。在Deepfake检测中,模型可以学习识别伪造内容中可能存在的微妙异常。

baseline关键步骤

模型定义:使用<code>timm库创建一个预训练的resnet18模型。

训练/验证数据加载:使用torch.utils.data.DataLoader来加载训练集和验证集数据,并通过定义的transforms进行数据增强。

训练与验证过程

定义了train函数来执行模型在一个epoch上的训练过程,包括前向传播、损失计算、反向传播和参数更新。

定义了validate函数来评估模型在验证集上的性能,计算准确率。

性能评估:使用准确率(Accuracy)作为性能评估的主要指标,并在每个epoch后输出验证集上的准确率。

提交:最后,将预测结果保存到CSV文件中。

加载预训练模型

预训练模型是指在特定的大型数据集(如ImageNet)上预先训练好的神经网络模型。这些模型已经学习到了丰富的特征表示,能够识别和处理图像中的多种模式。

ResNet(残差网络)是一种深度卷积神经网络,核心思想是引入了“残差学习”框架,通过添加跳过一层或多层的连接(即残差连接或快捷连接),解决了随着网络深度增加时训练困难的问题。

在下面代码中,timm.create_model('resnet18', pretrained=True, num_classes=2)这行代码就是加载了一个预训练的ResNet-18模型,其中pretrained=True表示使用在ImageNet数据集上预训练的权重,num_classes=2表示模型的输出层被修改为有2个类别的输出,以适应二分类任务(例如区分真实和Deepfake图像)。通过model = model.cuda()将模型移动到GPU上进行加速。

import timm model = timm.create_model('resnet18', pretrained=True, num_classes=2) model = model.cuda()

定义模型训练

在深度学习中,模型训练通常需要进行多次迭代,而不是单次完成。

深度学习模型的训练本质上是一个优化问题,目标是最小化损失函数。

梯度下降算法通过计算损失函数相对于模型参数的梯度来更新参数。由于每次参数更新只能基于一个数据批次来计算梯度,因此需要多次迭代,每次处理一个新的数据批次,以确保模型在整个数据集上都能得到优化。

模型训练的流程如下:

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

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

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

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

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

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

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

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

def train(train_loader, model, criterion, optimizer, epoch): # switch to train mode model.train() end = time.time() for i, (input, target) in enumerate(train_loader): input = input.cuda(non_blocking=True) target = target.cuda(non_blocking=True) # compute output output = model(input) loss = criterion(output, target) optimizer.zero_grad() loss.backward() optimizer.step()

数据集增强

数据增强是一种在机器学习和深度学习中提升模型性能的重要技术。它通过应用一系列随机变换来增加训练数据的多样性,从而提高模型的泛化能力。

增加数据多样性是数据增强的核心目的。通过对原始图像进行如旋转、缩放、翻转等操作,可以生成新的训练样本,使模型学习到更丰富的特征表示。

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数据集的均值和标准差。

train_loader = torch.utils.data.DataLoader( FFDIDataset(train_label['path'], train_label['target'], transforms.Compose([ transforms.Resize((256, 256)), transforms.RandomHorizontalFlip(), transforms.RandomVerticalFlip(), transforms.ToTensor(), transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225]) ]) ), batch_size=40, shuffle=True, num_workers=4, pin_memory=True )

后面有几个部分没有来得及细细研究,感觉稍微有些难度,容我慢慢消化一下。今天就先到这里了。



声明

本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。