全球DeepFake攻防挑战赛DataWhale AI 夏令营——图像赛道

全球DeepFake攻防挑战赛&DataWhale AI 夏令营——图像赛道

赛题背景

随着人工智能技术的迅猛发展,深度伪造技术(Deepfake)正成为数字世界中的一把双刃剑。这项技术不仅为创意内容的生成提供了新的可能性,同时也对数字安全构成了前所未有的挑战。Deepfake技术可以通过人工智能算法生成高度逼真的图像、视频和音频内容,这些内容看起来与真实的毫无二致。然而,这也意味着虚假信息、欺诈行为和隐私侵害等问题变得更加严重和复杂。

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

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

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

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

在这里插入图片描述
深度学习与Deepfake

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

为了训练有效的Deepfake检测模型,需要构建包含各种Deepfake和真实样本的数据集(本次比赛的数据集就是按照这种方式进行组织)。深度学习模型通过这些数据集学习区分真假内容。

在这里插入图片描述

赛题任务

在这个赛道中,比赛任务是判断一张人脸图像是否为Deepfake图像,并输出其为Deepfake图像的概率评分。参赛者需要开发和优化检测模型,以应对多样化的Deepfake生成技术和复杂的应用场景,从而提升Deepfake图像检测的准确性和鲁棒性。

赛题数据集

首先发布了训练集和验证集,下载链接为:
http://zoloz-open.oss-cn-hangzhou.aliyuncs.com/waitan2024_deepfake_challenge%2F_%E8%B5%9B%E9%81%931%E5%AF%B9%E5%A4%96%E5%8F%91%E5%B8%83%E6%95%B0%E6%8D%AE%E9%9B%86%2Fphase1.tar.gz?Expires=1726603663&OSSAccessKeyId=LTAI5tAfcZDV5eCa1BBEJL9R&Signature=wFrzBHn5bhULqWzlZP7Z74p1g9c%3D

可以使用command命令进行下载

curl 'http://zoloz-open.oss-cn-hangzhou.aliyuncs.com/waitan2024_deepfake_challenge%2F_%E8%B5%9B%E9%81%931%E5%AF%B9%E5%A4%96%E5%8F%91%E5%B8%83%E6%95%B0%E6%8D%AE%E9%9B%86%2Fphase1.tar.gz?Expires=1726603663&OSSAccessKeyId=LTAI5tAfcZDV5eCa1BBEJL9R&Signature=wFrzBHn5bhULqWzlZP7Z74p1g9c%3D' -o multiFFDI-phase1.tar.gz

训练集样例:

img_name,target
3381ccbc4df9e7778b720d53a2987014.jpg,1
63fee8a89581307c0b4fd05a48e0ff79.jpg,0
7eb4553a58ab5a05ba59b40725c903fd.jpg,0
…

验证集样例;

img_name,target
cd0e3907b3312f6046b98187fc25f9c7.jpg,1
aa92be19d0adf91a641301cfcce71e8a.jpg,0
5413a0b706d33ed0208e2e4e2cacaa06.jpg,0
…

提交的预测文件:

img_name,y_pred
cd0e3907b3312f6046b98187fc25f9c7.jpg,1
aa92be19d0adf91a641301cfcce71e8a.jpg,0.5
5413a0b706d33ed0208e2e4e2cacaa06.jpg,0.5
…

Baseline

Datawhale提供的baseline使用了ResNet,ResNet是一种残差网络,由于网络的加深会造成梯度爆炸和梯度消失的问题,因此何恺明了新的架构ResNet。

在这里插入图片描述

对kaggle中的baseline进行拆分,拆分为model、dataset和run三个部分

  1. 数据集的加载

    from torch.utils.data.dataset import Dataset
    from PIL import Image
    import torch
    import numpy as np
    import pandas as pd
    class FFDIDataset(Dataset):
        def __init__(self, img_path, img_label, transform=None):
            self.img_path = img_path
            self.img_label = img_label
    
            if transform is not None:
                self.transform = transform
            else:
                self.transform = None
    
        def __getitem__(self, index):
            img = Image.open(self.img_path[index]).convert('RGB')
    
            if self.transform is not None:
                img = self.transform(img)
    
            return img, torch.from_numpy(np.array(self.img_label[index]))
    
        def __len__(self):
            return len(self.img_path)
    
    def read_labels():#此处注意path修改
        train_label = pd.read_csv("phase1/trainset_label.txt")
        val_label = pd.read_csv("phase1/valset_label.txt")
        train_label['path'] = "phase1/trainset/" + train_label['img_name']
        val_label['path'] = "phase1/valset/" + val_label['img_name']
    
        return train_label, val_label
    
  2. 模型架构

    import timm
    model = timm.create_model('resnet18', pretrained=True, num_classes=2)#baseline使用resnet,同时加载预训练模型,分类为2类
    
  3. 模型的训练和验证

    import torch
    
    import dataset
    
    torch.manual_seed(0)
    torch.backends.cudnn.deterministic = False
    torch.backends.cudnn.benchmark = True
    
    import torchvision.models as models
    import torchvision.transforms as transforms
    import torchvision.datasets as datasets
    import torch.nn as nn
    import torch.nn.functional as F
    import torch.optim as optim
    from torch.autograd import Variable
    from torch.utils.data.dataset import Dataset
    from dataset import FFDIDataset
    import timm
    import time
    from Model import model
    import pandas as pd
    import numpy as np
    import cv2
    from PIL import Image
    from tqdm import tqdm
    
    class AverageMeter(object):
        """Computes and stores the average and current value"""
    
        def __init__(self, name, fmt=':f'):
            self.name = name
            self.fmt = fmt
            self.reset()
    
        def reset(self):
            self.val = 0
            self.avg = 0
            self.sum = 0
            self.count = 0
    
        def update(self, val, n=1):
            self.val = val
            self.sum += val * n
            self.count += n
            self.avg = self.sum / self.count
    
        def __str__(self):
            fmtstr = '{name} {val' + self.fmt + '} ({avg' + self.fmt + '})'
            return fmtstr.format(**self.__dict__)
    
    
    class ProgressMeter(object):
        def __init__(self, num_batches, *meters):
            self.batch_fmtstr = self._get_batch_fmtstr(num_batches)
            self.meters = meters
            self.prefix = ""
    
        def pr2int(self, batch):
            entries = [self.prefix + self.batch_fmtstr.format(batch)]
            entries += [str(meter) for meter in self.meters]
            print('\t'.join(entries))
    
        def _get_batch_fmtstr(self, num_batches):
            num_digits = len(str(num_batches // 1))
            fmt = '{:' + str(num_digits) + 'd}'
            return '[' + fmt + '/' + fmt.format(num_batches) + ']'
    
    
    def validate(val_loader, model, criterion):#验证集进行验证
        batch_time = AverageMeter('Time', ':6.3f')
        losses = AverageMeter('Loss', ':.4e')
        top1 = AverageMeter('Acc@1', ':6.2f')
        progress = ProgressMeter(len(val_loader), batch_time, losses, top1)
    
        # switch to evaluate mode
        model.eval()
    
        with torch.no_grad():
            end = time.time()
            for i, (input, target) in tqdm(enumerate(val_loader), total=len(val_loader)):
                input = input.cuda()
                target = target.cuda()
    
                # compute output
                output = model(input)#模型进行处理
                loss = criterion(output, target)#损失函数
    
                # measure accuracy and record loss
                acc = (output.argmax(1).view(-1) == target.float().view(-1)).float().mean() * 100#计算acc
                losses.update(loss.item(), input.size(0))
                top1.update(acc, input.size(0))
                # measure elapsed time
                batch_time.update(time.time() - end)
                end = time.time()
    
            # TODO: this should also be done with the ProgressMeter
            print(' * Acc@1 {top1.avg:.3f}'
                  .format(top1=top1))
            return top1
    
    
    def predict(test_loader, model, tta=10):#模型进行预测
        # switch to evaluate mode
        model.eval()
    
        test_pred_tta = None
        for _ in range(tta):
            test_pred = []
            with torch.no_grad():
                end = time.time()
                for i, (input, target) in tqdm(enumerate(test_loader), total=len(test_loader)):
                    input = input.cuda()
                    target = target.cuda()
    
                    # compute output
                    output = model(input)
                    output = F.softmax(output, dim=1)#softmax进行处理
                    output = output.data.cpu().numpy()
    
                    test_pred.append(output)
            test_pred = np.vstack(test_pred)
    
            if test_pred_tta is None:
                test_pred_tta = test_pred
            else:
                test_pred_tta += test_pred
    
        return test_pred_tta
    
    
    def train(train_loader, model, criterion, optimizer, epoch):
        batch_time = AverageMeter('Time', ':6.3f')
        losses = AverageMeter('Loss', ':.4e')
        top1 = AverageMeter('Acc@1', ':6.2f')
        progress = ProgressMeter(len(train_loader), batch_time, losses, top1)
    
        # 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)
    
            # measure accuracy and record loss
            losses.update(loss.item(), input.size(0))
    
            acc = (output.argmax(1).view(-1) == target.float().view(-1)).float().mean() * 100
            top1.update(acc, input.size(0))
    
            # compute gradient and do SGD step
            optimizer.zero_grad()
            loss.backward()
            optimizer.step()
    
            # measure elapsed time
            batch_time.update(time.time() - end)
            end = time.time()
    
            if i % 100 == 0:
                progress.pr2int(i)
    
    
    
    
    
    if __name__ == '__main__':
        train_label, val_label = dataset.read_labels()
        train_loader = torch.utils.data.DataLoader(#加载数据,同时进行数据增强
            FFDIDataset(train_label['path'].head(10), train_label['target'].head(10),
                        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
        )
    
        val_loader = torch.utils.data.DataLoader(
            FFDIDataset(val_label['path'].head(10), val_label['target'].head(10),
                        transforms.Compose([
                            transforms.Resize((256, 256)),
                            transforms.ToTensor(),
                            transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])
                        ])
                        ), batch_size=40, shuffle=False, num_workers=4, pin_memory=True
        )
    
        model = model.cuda()
    
        criterion = nn.CrossEntropyLoss().cuda()#交叉熵
        optimizer = torch.optim.Adam(model.parameters(), 0.005)#Adam优化器
        scheduler = optim.lr_scheduler.StepLR(optimizer, step_size=4, gamma=0.85)
        best_acc = 0.0
        for epoch in range(1):
            print('Epoch: ', epoch)
    
            train(train_loader, model, criterion, optimizer, epoch)
            val_acc = validate(val_loader, model, criterion)
    
            optimizer.step()
            scheduler.step()
    
            if val_acc.avg.item() > best_acc:
                best_acc = round(val_acc.avg.item(), 2)
                torch.save(model.state_dict(), f'./model_{best_acc}.pt')
    
        test_loader = torch.utils.data.DataLoader(
            FFDIDataset(val_label['path'].head(10), val_label['target'].head(10),
                        transforms.Compose([
                            transforms.Resize((256, 256)),
                            transforms.ToTensor(),
                            transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])
                        ])
                        ), batch_size=40, shuffle=False, num_workers=4, pin_memory=True
        )
    
        val = val_label.head(10).copy()
        val['y_pred'] = predict(test_loader,model,1)[:,1]
        val[['img_name','y_pred']].to_csv('submit.csv',index=None)
    

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/799521.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Mac 息屏不断网

这里息屏指的是屏幕不黑,屏幕黑了好像必断网 我的系统是 14.5 我调整了两个地方,一个是电池——选项——唤醒以供访问 另外一个地方是锁定屏幕——延长关闭显示器的时间(让显示器不黑)

如何批量删除重复数据?推荐两种方法

在日常的办公中,很多用户都会使用Excel。借助这款软件,用户可以完成对各种数据的处理。但很多时候我们会发现,同一张表格里有很多重复的数据,这或许会为统计带来错误。为此,我们就需要删除重复项才可以帮助我们很好的解…

STM32+三色LED智能调光系统源程序 易安卓APP 原理图

资料下载地址:STM32三色LED智能调光系统源程序 易安卓APP 原理图 三色LED手机智能调光系统概述: 利用开发的智能手机软件,对照明三色LED进行智能调光。包含的功能有,支持多手机同时连接服务端,互动调光。支持关…

前端Vue组件化实践:打造仿京东天猫商品属性选择器组件

在前端开发领域,随着业务需求的日益复杂和技术的不断进步,传统的整体式应用开发模式已逐渐显得捉襟见肘。面对日益庞大的系统,每次微小的功能修改或增加都可能导致整个逻辑结构的重构,形成牵一发而动全身的困境。为了解决这一问题…

昇思25天学习打卡营第22天|ResNet50图像分类

上回说到RESNET50做迁移学习,今天看一下他在图片分类上面的表现。图像分类是最基础的计算机视觉应用,属于有监督学习类别,先喂一堆猫的照片告诉他这是猫,再喂一堆狗的图片告诉他这是狗。 CIFAR-10数据集共有60000张32*32的彩色图…

ARDUINO最新pinMode()管脚设置方法(24年7月)

Arduino管脚配置 ESP32 Arduino管脚配置测试正常。 pinMode() [数字 I/O] 描述 将指定的引脚配置为输入或输出。有关引脚功能的详细信息,请参阅数字引脚部分。 可以使用模式INPUT_PULLUP使能内部上拉电阻。此外,INPUT模式明…

涨知识了!AI绘画变现的几个思路!

风口!风口!风口! 终于不用再抱怨 “我们这代人啊,什么也没赶上” 因为我们现在正处于风口之上! 在当今数字化的时代 AI 绘画正以惊人的速度崛起 并向各行各业渗透 既然阻止不了时代的变化 那就让它为我们所用 …

STM32MP135裸机编程:烧录程序到EMMC的方法

0 前言 STM32MP135支持多种启动方式,包括SD卡、NAND Flash、EMMC等,基于STM32MP135裸机的SD卡烧录操作方法我们之前已经介绍过,现在介绍的STM32MP135烧录到EMMC的方法又和前面烧录到SD卡的操作有所不同。本文将介绍基于STM32MP135&#xff0…

职称论文发表的注意事项有哪些

职称论文发表的注意事项有哪些 其实职称论文并不难,但是对于很多之前没有接触过的朋友来说,如何选择合适期刊,如何投稿以及版面费多少等一概不知。所以我今天就总结下我个人的经验,分享给大家。 一、弄清单位的要求 评职称论文首先…

系统架构师考点--软件工程(上)

大家好。今天我来总结一下软件工程的相关考点。这部分是考试的重点。在上午场客观题、下午场案例题以及下午场论文都有可能考到,在上午场客观题中大约占12-15分左右。 一、软件工程概述 软件开发生命周期 软件定义时期:包括可行性研究和详细需求分析过…

致良知,是一场自我革命、教育、成长

82天 【此亦须你自家求】人言不如自悔之真;致良知就是致自己,是一场自我革命、自我教育、自我成长;真诚的力量,诚于己、信于人、明于事 人言不如自悔之真,生活中我们都希望能够得到高人的指点,但&#xf…

Jmeter常用组件及执行顺序

一 常用组件 1.线程组 Thread Group 线程组是一系列线程的集合,每一个线程代表着一个正在使用应用程序的用户。在 jmeter 中,每个线程意味着模拟一个真实用户向服务器发起请求。 在 jmeter 中,线程组组件运行用户设置线程数量、初始化方式等…

git链接远程仓库

【 一 】ssh链接远程仓库 删除git仓库 【 1 】初步使用方法 1、之前把本地代码,以https形式,提交到了远程仓库 # - git remote add origin https://gitee.com/bai-zhitao/lufy.git- 输入用户名密码2、ssh认证,只需要配置一次&#xff…

ARM体系结构和接口技术(四)LED灯实验---②

文章目录 一、特殊功能控制寄存器(一)GPIOx_MODER寄存器(二)GPIOx_OTYPER寄存器(三)GPIOx_OSPEEDR寄存器(四)GPIOx_PUPDR寄存器(五)GPIOx_IDR寄存器&#xff…

在互联网供应链系统可能是永远不会过时的系统

一、前言 在互联网在到人工智能,从基本的门户网站,社交网站,到移动互联网,视频网站,再到现在比较火爆短视频直播和人工智能AI,大模型。互联网的迭代,出现了无数的系统。但是有些系统一直久经不…

第八课:NAT地址转换(NAPT模式)

如何连接互联网? 如何远程管理网络设备? 1.路由怎么写? ip route 0.0.0.0 0.0.0.0 下一跳 0.0.0.0 0.0.0.0代表去往所有目的 2.NAT网络地址转换 PC,手机,在内网,用私网地址(不要钱&#x…

c#中的特性

在C#中,特性(Attributes)是一种向程序元素(如类、方法、属性等)添加元数据的方式。特性可以用来提供关于程序元素的附加信息,这些信息可以在编译时和运行时被访问。 特性主要有以下几个用途: 提…

力扣第九题

回文数 提示: 给你一个整数 x ,如果 x 是一个回文整数,返回 true ;否则,返回 false 。 回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。 代码展示&#…

<Rust>egui部件学习:如何在egui窗口中添加按钮button以及标签label部件?

前言 本专栏是关于Rust的GUI库egui的部件讲解及应用实例分析,主要讲解egui的源代码、部件属性、如何应用。 环境配置 系统:windows 平台:visual studio code 语言:rust 库:egui、eframe 概述 本文是本专栏的第二篇博…

Zookeeper源码学习

源码下载:https://archive.apache.org/dist/zookeeper/zookeeper-3.5.7/apache-zookeeper-3.5.7.tar.gz 1、持久化源码: Leader和Follower中的数据会在内存和磁盘中各保存一份。所以需要将内存中的数据持久化到磁盘中。 在zookeeper-server\org.apach…