系列文章目录
Datawhale AI 夏令营2024·第二期(Deepfake攻防挑战赛-图像赛道)Task02
Datawhale AI 夏令营2024·第二期(Deepfake攻防挑战赛-图像赛道)Task03
文章目录
前言
这次的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_nametarget3381ccbc4df9e7778b720d53a2987014.jpg163fee8a89581307c0b4fd05a48e0ff79.jpg07eb4553a58ab5a05ba59b40725c903fd.jpg0
这次的训练集有524429张图片,验证集有147363张图片,数据量非常大。而在训练集中,伪造图片的数量有425043张,真实人脸图像只有99386张,在验证集中,伪造图片有88281张,真实图片有59082张。可见,总体上来说,还是伪造图片更多些。
三、规则理解
⭐⭐⭐
- 仅允许提交单个模型,有效网络参数不得超过200M(使用thop工具统计模型参数)
参数量的限制还是蛮宽松的,200M的上限已经很高了
- 为公平比较算法性能,本次比赛不允许使用任何额外的数据集,仅允许使用ImageNet1K训练预模型。
应该timm里面的好多预训练模型都可以用
- 基于发布的训练集生成的扩展样本(通过数据增强/Deepfake工具)可以用于训练,但这些工具需在第三阶段提交以供重现。
数据增强的工具和记录要保留好
- 验证结果每天限提交5次。测试结果每天限提交2次。
(现在应该是只有验证结果),测试集开放要到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.0for epoch inrange(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的一些解读和理解,剩下的且看且做。祝大家都有收获💗💗💗
版权归原作者 bnbncch 所有, 如有侵权,请联系我们删除。