Datawhale AI 夏令营 Task01 学习笔记——了解Deepfake & 初探baseline
Datawhale AI 夏令营 Task01 学习笔记——了解Deepfake & 初探baseline
Part1 了解Deepfake
-
什么是deepfake:
Deepfake是一种使用人工智能技术生成的伪造媒体,特别是视频和音频,它们看起来或听起来非常真实,但实际上是由计算机生成的。这种技术通常涉及到深度学习算法,特别是生成对抗网络(GANs),它们能够学习真实数据的特征,并生成新的、逼真的数据。
有四个主流的研究方向:
- 面部交换专注于在两个人的图像之间执行身份交换;
- 面部重演强调转移源运动和姿态;
- 说话面部生成专注于在角色生成中实现口型与文本内容的自然匹配;
- 面部属性编辑旨在修改目标图像的特定面部属性;
-
如何识别Deepfake
观察图片细节->检查光线和阴影->分析像素->注意背景
Part2 机器学习与深度学习
-
机器学习:
机器学习是人工智能的一个分支,它使计算机系统利用数据来不断改进性能,而无需进行明确的编程。
核心思想:通过算法和统计模型,机器学习允许计算机从经验中学习,识别模式,并做出预测或决策。
- 监督学习:算法从标记的训练数据中学习,这些数据包含了输入和期望的输出。
- 无监督学习:算法处理未标记的数据,试图找出数据中的结构和模式。
主要通过神经网络进行机器学习。神经网络中最基本的成分是神经元模型,即“M-P神经元模型”,在这个模型中,神经元接受来自n个其他神经元传递过来的输入信号,这些输入信号带权重的链接进行传递,神经元接收到的总输入值将与神经元的阈值进行比较,然后通过“激活函数”除了以产生神经元的输出。
激活函数主要有“阶跃函数”和“Sigmoid函数”
感知机由两层神经元组成,其中权重和阈值都可以通过学习得到,学习规则非常简单通过模型的输出和期望的标准输出作对比,来改变权重和阈值,具体可以参照西瓜书。
多层前馈神经网络的输出层和输入层之间包含隐层,隐层和输出层的神经元都是拥有激活函数的功能神经元,其权重和阈值的调整主要用误差逆传播算法,亦称BP算法。其主要是通过梯度下降算法来最小化样本损失。
当每次更新只针对样例集的单个样例时,为标准BP算法。
当每次更新针对整个样例集时,为累计BP算法。
只需一个包含足够多神经元的隐层,多层前馈网络就能以任意精度逼近任意复杂度的连续函数。即单隐层前馈网络。但是要注意防止过拟合,防止掉入局部最小陷阱。
-
深度学习:
深度学习模型有很多,其中典型的为卷积神经网络CNN,深度学习是一种强大的机器学习技术,它通过模拟人脑处理信息的方式,使计算机能够从大量数据中自动学习和识别模式。深度学习模型,尤其是卷积神经网络(CNN),能够识别图像和视频中的复杂特征。在Deepfake检测中,模型可以学习识别伪造内容中可能存在的微妙异常。
主要是通过增加隐层的数目来获得更加强大的学习能力,但这同时也增加了训练模型的成本。有两种主要的提高训练效率的手段:
- 无监督逐层训练:“预训练+微调”,对每一层先使用RBM训练,再对整体使用BP算法训练
- “权共享”,即让一组神经元使用相同的连接权,这个方法在CNN中发挥了重要作用。
Part3 初探Baseline
加载预训练模型->加载数据集并增强->模型训练
-
加载预训练模型
ResNet(残差网络)是一种深度卷积神经网络,由微软研究院的Kaiming He等人在2015年提出。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() -
加载数据集并增强
torch.utils.data.DataLoader:加载数据集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 ) -
模型训练
模型训练的流程如下:
- 设置训练模式:通过调用
model.train()将模型设置为训练模式。在训练模式下,模型的某些层(如BatchNorm和Dropout)会按照它们在训练期间应有的方式运行。 - 遍历数据加载器:使用
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() - 设置训练模式:通过调用

浙公网安备 33010602011771号