从零入门CV图像竞赛(Deepfake攻防)第一弹——看懂baseline

       这个暑假,我报名了蚂蚁集团举办的“外滩大会——全球Deepfake攻防挑战赛”。这个比赛和我现在的研究方向很接近,我觉得参加这样的比赛会提升自己的水平。

接下来我将从Deepfake本身和比赛给出的baseline两个方面做一些记录。

01 Deepfake技术

       Deepfake主要运用了深度学习(生成对抗网络,即GANs)技术,学习真实数据的特征,生成逼真的图片、视频或音频。这种技术的出现有利有弊,在一些领域展现了其潜力,但是在政治、经济、法律方面也存在滥用的风险。

       Deepfake主要存在面部交换(Face Swapping)、面部重演(Face Reenactment)、说话面部生成(Talking Face Generation)、面部属性编辑(Facial Attribute Editing)等研究方向。面部交换,就是我们常说的换脸技术;面部重演则注重动态变化;说话面部生成强调说话时口型是否能够对上说话内容;而面部属性编辑是对于面部的一些也行进行修改,例如去掉面部的皱纹使看起来年轻,或调整鼻头的大小等等。

       想要人工识别这种Deepfake生成的图片,我们可以观察其中一些细节,例如看看是否存在说话内容和口型对不上的情况;其次,我们可以检查图片或视频的光线或阴影是否自然;除此之外,我们还可以分析像素,是否存在像素化或模糊的部分;最后我们可以检查背景,看看背景是否存在不自然的地方。

       在Deepfake检测中,模型可以学习识别伪造内容中可能存在的微妙异常。

02 baseline分析

        所谓baseline,就是基线,就是代码的第一版,可能baseline的性能还不能达到我们的要求,所以我们需要想办法去对代码进行优化。今天,我们先对于一个简单的模型训练代码的baseline进行分析。这个模型主要用于分辨图片或视频是否为Deepfake生成,本质为一个二分类问题。

01  加载模型

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

        我们用的是基于resnet18网络的识别模型,即18层的残差神经网络。首先,我们先引用timm库,调用resnet18网络及其权重,并且进行一个二分类任务,并将其移到GPU上。

02  训练模型

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()

       这部分是训练模型的函数。首先,我们将模型的状态设置为训练模式,接下来,我们记录代码的运行时间。我们将数据(input)及其对应的标签(target取出并放到GPU上,将数据放入模型得到识别网络的识别结果,并计算loss值(识别结果和真实结果的差值)。为了防止梯度的累积消耗内存,我们需要在一次识别之后就清除内存。接下来,根据梯度下降的原理,我们需要求解在当前的loss值下loss函数的梯度,根据这一梯度,我们更新参数力求梯度下降。这就是一次完整的训练过程,周而复始,就可以得到满意的训练结果。

03 数据增强

       数据增强是指对于数据集进行旋转、放缩、添加噪声等操作,增加数据的多样性,生成新的训练样本。

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
)

        这段代码组合了一些常用的数据增强的操作,如调整图片大小随机水平和竖直反转图像转换成为pytorch能使用的类型并归一化、以及对于图像进行标准化的操作。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值