Datawhale AI 夏令营2024·第二期(Deepfake攻防挑战赛-图像赛道)Task01

bnbncch 2024-07-16 11:31:02 阅读 68

Datawhale AI 夏令营2024·第二期(Deepfake攻防挑战赛-图像赛道)Task01


文章目录

Datawhale AI 夏令营2024·第二期(Deepfake攻防挑战赛-图像赛道)Task01前言一、赛题理解二、数据集理解三、规则理解模型理解1.导入模型2.训练数据3.评估指标AccAUC

总结


前言

这次的Datawhale AI夏令营第二期开营了,选的是CV相关的内容,是基于kaggle上的一个任务。

蚂蚁集团举办的“外滩大会-全球Deepfake攻防挑战赛”

赛题背景:随着人工智能领域技术的快速发展,deepfake技术已经成为一把双刃剑。它不仅创造了大量的人工智能生成内容,也对数字安全提出了前所未有的挑战。这次的"Inclusion・The Global Multimedia Deepfake Detection"全球多媒体深度伪造挑战赛旨在开发、测试并进一步发展更准确、有效和创新的检测模型,以应对真实场景中的各种类型的深度伪造攻击,并激励创新防御策略,提高深度伪造识别准确率。


一、赛题理解

比赛根据赛方发布的两个数据集设置了两个不同的Task,Task1是确定人脸图像是否为Deepfake图像,并输出其为Deepfake图像的概率分数。Task2是确定包含人脸的视频(带音频)是否是Deepfake视频,并输出它是假的概率。我选的是Task1。

针对Task1,我要做的就是针对一张给定的人脸图像,判断他是真实的还是伪造的。确实和之前接触的一些内容不太一样,哈哈。比一般的人脸识别,人脸检测还是要复杂的我感觉。

下面给两张图吧😊。

这是从训练集里扒的两张图,小伙伴很容易就能看出来左边的是更像真人一点,右半边的就有点假了,数据集里还有很多假得恐怖的图片,这个算好一点的了。😭😭😭

二、数据集理解

这次的任务是一个图像的二分类任务,在给出的标准中,label=1 表示Deepfake图像,label=0 表示真实人脸图像。


在赛方给出的trainset_label.txt中,内容如下。前面是图片名称,后面是标签,一个文件,有点类似于COCO格式的annotation.json标签,不过格式是txt。

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

这次的训练集有524429张图片,验证集有147363张图片,数据量非常大。而在训练集中,伪造图片的数量有425043张,真实人脸图像只有99386张,在验证集中,伪造图片有88281张,真实图片有59082张。可见,总体上来说,还是伪造图片更多些。

三、规则理解

⭐⭐⭐

仅允许提交单个模型,有效网络参数不得超过200M(使用thop工具统计模型参数)<code>参数量的限制还是蛮宽松的,200M的上限已经很高了 为公平比较算法性能,本次比赛不允许使用任何额外的数据集,仅允许使用ImageNet1K训练预模型。<code>应该timm里面的好多预训练模型都可以用 基于发布的训练集生成的扩展样本(通过数据增强/Deepfake工具)可以用于训练,但这些工具需在第三阶段提交以供重现。<code>数据增强的工具和记录要保留好 验证结果每天限提交5次。测试结果每天限提交2次。<code>(现在应该是只有验证结果),测试集开放要到8月15日了,这样的话就是每天限制提交5次结果

⭐⭐⭐

模型理解

1.导入模型

ResNet18

import timm

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

model = model.cuda()

可以看到的是,赛方给出的模型还是基础的ResNet18的预训练模型。结合赛方给出的只允许使用ImageNet1K预训练模型,我感觉是不是条件还是很宽松的,应该是允许使用timm的预训练模型进行一些操作的,比如模型融合和模型迁移。

2.训练数据

这次Kaggle上提供的GPU资源是P100,初始的设置是只有最前1000条数据,batch_size是40,只训练2轮,时间大概在4分钟。最后的测试评估结果在0.5左右,非常低,基本无效(评估指标为AUC)。弱弱地看了下榜上第一的大神,已经0.9999+了😂😂😂

相关代码如下

train_loader = torch.utils.data.DataLoader(

FFDIDataset(train_label['path'].head(1000), train_label['target'].head(1000),

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(1000), val_label['target'].head(1000),

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

)

criterion = nn.CrossEntropyLoss().cuda()

optimizer = torch.optim.Adam(model.parameters(), 0.005)

scheduler = optim.lr_scheduler.StepLR(optimizer, step_size=4, gamma=0.85)

best_acc = 0.0

for epoch in range(2):

scheduler.step()

print('Epoch: ', epoch)

train(train_loader, model, criterion, optimizer, epoch)

val_acc = validate(val_loader, model, criterion)

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


3.评估指标

Acc

关于本次任务的评估指标,Kaggle是使用AUC进行测试给出分数的。这里有一点需要注意,在赛方提供的训练代码中,使用的评估指标是Acc,来进行验证并输出最后的submit.csv的,二者不太一样。

T

P

:

真正例,表示正类预测为正类

F

P

:

假正例,表示负类预测为正类

F

N

:

假反例,表示正类预测为负类

T

N

:

真反例,表示负类预测为负类

TP:真正例,表示正类预测为正类\\FP:假正例,表示负类预测为正类\\FN:假反例,表示正类预测为负类\\TN:真反例,表示负类预测为负类

TP:真正例,表示正类预测为正类FP:假正例,表示负类预测为正类FN:假反例,表示正类预测为负类TN:真反例,表示负类预测为负类

Acc的计算公式

A

c

c

=

T

P

+

T

N

T

P

+

T

N

+

F

P

+

F

N

Acc=\frac{TP+TN}{TP+TN+FP+FN}

Acc=TP+TN+FP+FNTP+TN​

其含义就是预测正确的占所有样本数的比值。

AUC

关于AUC,其含义大致如下:

随机采样一对样本(一个正样本,一个负样本),模型将正类预测为正类的概率大于将负类预测为正类的概率。

比如

A

U

C

=

0.8

AUC=0.8

AUC=0.8,其含义就表示,随机采样一个正样本和一个负样本,在80%的情况下,模型将正类预测为正类的概率大于将负类预测为正类的概率。同时,可以看到

A

U

C

AUC

AUC关心的是正负样本之间得分的相对高低,而不是绝对分值的大小。

此外,

A

U

C

=

0.5

AUC=0.5

AUC=0.5是模型的最低限度,此时模型会随机将一个样本分为正类或者负类,最终使得样本的正负类分布各占50%。

A

U

C

=

1

AUC=1

AUC=1是模型的最高上限。

AUC的计算公式

A

U

C

=

I

(

p

p

o

s

,

p

n

e

g

)

P

×

N

AUC=\frac{\sum{I(p_{pos},p_{neg})}}{P\times N}

AUC=P×N∑I(ppos​,pneg​)​

参考模型评估指标详解:ROC 曲线和 AUC 的计算方法

总结

以上就是Datawhale AI 夏令营2024·第二期(Deepfake攻防挑战赛-图像赛道)Task01的一些解读和理解,剩下的且看且做。祝大家都有收获💗💗💗



声明

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