Datawhale AI 夏令营-task1

Datawhale AI 夏令营-task1

比赛介绍

比赛链接:kaggle

内存概述(由 chatgpt-4o 翻译):

随着人工智能领域技术的快速发展,深度伪造技术已经成为一把双刃剑。它不仅创造了大量的AI生成内容,还对数字安全提出了前所未有的挑战。Inclusion・全球多媒体深度伪造挑战赛旨在邀请参赛者开发、测试并进一步改进应对各种真实场景中深度伪造攻击的更准确、有效和创新的检测模型,同时激励创新的防御策略并提高深度伪造识别的准确性。

相关名词

什么是Deepfake

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

Deepfake技术虽然在多个领域展现出其创新潜力,但其滥用也带来了一系列严重的危害。在政治领域,Deepfake可能被用来制造假新闻或操纵舆论,影响选举结果和政治稳定。经济上,它可能破坏企业形象,引发市场恐慌,甚至操纵股市。法律体系也面临挑战,因为伪造的证据可能误导司法判断。此外,深度伪造技术还可能加剧身份盗窃的风险,成为恐怖分子的新工具,煽动暴力和社会动荡,威胁国家安全。

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

  • 面部交换专注于在两个人的图像之间执行身份交换;
  • 面部重演强调转移源运动和姿态;
  • 说话面部生成专注于在角色生成中实现口型与文本内容的自然匹配;
  • 面部属性编辑旨在修改目标图像的特定面部属性;

以下是由deepfake生成的一个图片:

使用了deepfake技术成功将一个人脸移植到了另一个的人脸上。

如何使用深度学习检测deepfake

对于一个图片,如果存在假冒的情况,则一定存在以下的几种可能的情况

  1. 对于脸的边缘,会存在一定程序的模糊或扭曲或肤色不一致的情况,以下是一个示例:

在这里插入图片描述

该图片来源于kaggle所给的训练集的图片。

  1. 由于图片合成自两个不同的图片,而那两个图片的光源不一定来源于同一个方向,所以会存在背景的光源方向与人物光源方向不同的情况:

该图片来源于kaggle所给的训练集的图片。

头发的光源方向与背影不一样

  1. 有的图片是由模型生成的,而模型生成的图片可能背景不会做特别好的处理,所以可以通过背景判断:

该图片来源于kaggle所给的训练集的图片。

从该图片中箭头所指的背景就可以看到,该图片大概率是模型生成的。(模型生成的图片对背景处理的不好,很可能生成网络状的背景)

  1. 模型生成的图片可能会出现局部清晰,局部模糊的情况,这也是一个可以判断的点

在这里插入图片描述

该图片来源于kaggle所给的训练集的图片。

可以从该图片中看到,模型有的地方特别清晰,而有的地方特别模糊。

  1. 还可以通过发质的状态与面部所展示的年龄来推测

该图片来源于kaggle所给的训练集的图片。

有如此的皱纹,但是头发的发型与发质都说明该人很年轻,这很矛盾。

task1步骤

  1. 模型定义
  2. 训练集与验证集的加载
  3. 训练模型
  4. 性能评估
  5. 提交结果

模型定义

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

在pytorch中,可以使用timm库来加载一些经典的网络,比如如上使用的预训练的resnet18

残差神经网络

resnet18是残差神经网络的一种,对于普通的网络,存在以下的问题:

  • 梯度消失或梯度爆炸

  • 退化问题(degradation problem)

而解决梯度问题的一般方式是:

  • 对数据进行标准化处理
  • 权重初始化
  • batch normalization 处理

解决退化问题的一般方式是通过残差结构。而使用了残差结构的网络就是残差神经网络。

残差神经网络可以训练超过1000层的而不存在退化的问题,其对于一个基本的残差块,其结构如下:

迁移学习

预训练是指别人已经使用一个模型训练出了一套权重。而通过在别人预训练好的模型上再次训练自己的数据样本,即可实现迁移学习

迁移学习有以下的优点:

  • 可以快速训练出一个理想的结果
  • 当数据集较小时也可以训练出理想的效果
  • 使用别人预训练的模型参数时,也要注意别人的预处理的方式

训练集与验证集的加载

使用 torch.utils.data.DataLoader(dataset, batch_size, shuffle, ..) 来加载一个数据

参数:

  • dataset: 使用的数据集,必须是 Dataset 的子类实例。
  • batch_size:每个批次加载的数据量。默认为 1。
  • shuffle: 是否在每个 epoch 开始时打乱数据。默认为 False。推荐为true。
    其他可用的参数:
  • sampler: 自定义采样策略。如果提供了这个参数,shuffle 参数将被忽略。
  • num_workers: 用于数据加载的子进程数量。默认为 0,表示数据将在主进程中加载。增加这个值可以加快数据加载速度。
  • collate_fn: 合并样本列表以形成一个 mini-batch 的函数。默认情况下,它会将样本堆叠成一个 mini-batch。
  • pin_memory: 如果设置为 True,数据加载器会将张量复制到 CUDA 固定内存中。对于使用 GPU 的情况,可以加快数据转移速度。
  • drop_last: 如果数据集大小不能被 batch_size 整除,是否丢弃最后一个不完整的批次。默认为 False。
  • timeout: 从数据加载中获取批次的超时时间(以秒为单位)。默认为 0,表示没有超时。

此外,在制作数据集时,可以使用transforms.Compose()将多个变换连接在一起。从而实现数据的预处理,这也叫数据增强。数据增强是一种在机器学习和深度学习中提升模型性能的重要技术。它通过应用一系列随机变换来增加训练数据的多样性,从而提高模型的泛化能力。增加数据多样性是数据增强的核心目的。通过对原始图像进行如旋转、缩放、翻转等操作,可以生成新的训练样本,使模型学习到更丰富的特征表示。

可以使用的变换有:

  • transforms.ToTensor():将 PIL 图像或 numpy 数组转换为 PyTorch 的张量(Tensor)。同时,还会将图像的像素值自动的映射到 [0, 1]torchvision 数据集输出的范围为 [0, 1] 之间的 PILImage
  • transforms.Normalize(mean, std):用于对图像数据进行标准化处理。标准化的目的是使每个通道的像素值具有零均值和单位标准差,这有助于加快模型训练速度和提高模型的收敛性。
    • mean:每个通道的均值
    • std:每个通道的标准差
  • transforms.CenterCrop(x):从输入图像的中心裁剪出一个指定大小的图像。这样可以简化数据处理并使得网络架构的一些操作可以正确运行。
  • transforms.RandomCrop(x, padding = y):先对图像填充 y,再对图像进行随机裁剪,裁剪后的大小为 x * x
  • transforms.RandomHorizontalFlip(): 对图像进行随机水平翻转
  • transforms.Resize(x):保持图片的长宽比不动,将最小边长缩放到 x

训练模型

常用的训练框架如下:

# 训练函数
def train(model):
	# 设置训练10轮
	epochs = 10
    # 将模型设置为训练模式,因为有些层在不同模式下的表现不同
    model.train()
    # 主里从train_loader里,64个样本一个batch为单位提取样本进行训练
    for epoch in range(epochs):
	    for batch_idx, (data, target) in enumerate(train_loader):
	        # 把数据送到GPU中
	        data, target = data.to(device), target.to(device)
	        optimizer.zero_grad()
	        output = model(data)
	        # 计算损失。如果模型不是将log_softmax作为分类器,则可以使用其他的损失函数
	        loss = F.nll_loss(output, target)
	        # 进行反向传播,计算梯度。
	        loss.backward()
	        # 使用优化器(如 SGD)更新模型参数。
	        optimizer.step()
	        # 输出参数
	        # ....

模型在评估时,要设置成评估模式,当模型设置为评估模式时,会禁用 dropout 层等。

常见的测试架构如下:

def test(model):
    # 将模型设置为评估模式,此时会禁用dropout层
    model.eval()
    correct = 0
    total = 0
	for data in testloader:
	    images, labels = data
	    images, labels = images.to(device), labels.to(device)
	    outputs = net(images)
	    _, predicted = torch.max(outputs.data, 1)
	    total += labels.size(0)
	    correct += (predicted == labels).sum().item()
	    print('Accuracy of the network on the 10000 test images: %d %%' % (100 * correct / total))
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值