【Datawhale AI 夏令营】CV图像 Task 1记录

【Datawhale AI 夏令营】CV图像 Task 1记录

Target

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

Baseline

这个主要方便我们了解图片数据如何处理,如何通过pytorch模型在GPU上进行训练,感觉里面很多地方是通用的,可以借鉴的。

数据处理

首先导入相关库,然后读取标签数据,添加图片路径。

然后创建一个自定义数据集类FFDIDataset,继承自 pytorch 的 Dataset 类,包含初始化 __init__,获取数据项 __getitem__和返回数据集大小 __len__ 方法。

  1. __init__ 方法中三个输入 ,img_path: 图像路径的列表,img_label 图像标签的列表,transform 可选的图像变换操作。

  2. __getitem__ 方法一个输入,index: 索引,用于从数据集中获取特定的图像和标签。它先读取指定index的图像文件,然后转换成RGB格式,如果初始化时有了transform操作就对图片进行变换操作,最后返回一个元组 (img, label),其中 img是处理后的图像,label 是对应的标签。

  3. __len__ 方法返回数据集中图像数量,也就是img_path列表的长度。

制作train_loader,val_loader以及test_loader等数据加载器。

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
)

通过torch.utils.data.DataLoader实现,其是 pytorch中用于加载数据的工具。它提供了批量处理、并行数据加载和数据洗牌等功能, torch.utils.data.DataLoader中的Dataset选择我们自定义的FFDIDataset,train_loader中选择了1000个样例,对图像的操作 transforms依次包括将图像调整为256x256像素,随机水平翻转图像,随机垂直翻转图像,将图像转换为张量最后使用使用给定的均值和标准差对图像进行归一化。

DataLoader参数设置批大小为40,shuffle=True表示进行打乱操作,num_workers=4表示使用4个子进程来加载数据,pin_memory=True将数据加载到固定内存区,这样可以加速数据传输到GPU。

val_loader以及test_loader无需随机水平翻转图像,随机垂直翻转图像,减少随机性,确保结果稳定。

此外还创建了一个AverageMeter 类和一个ProgressMeter 类打印日志,AverageMeter 类用于跟踪和计算某个指标的当前值和平均值。ProgressMeter 类用于显示训练过程中的进展,包括当前批次和多个指标的值。

模型选择和参数设置

baseline使用的模型是timm库中的模型,resnet18,二分类,通过model.cuda()将模型移至GPU。

对于模型训练参数设置,其选择CEloss作为损失函数,用于计算模型的损失。优化器选择Adam,用于更新模型的权重。学习率设置为0.005,设置学习率调度器为StepLR,StepLR 是 PyTorch 中的一种学习率调度器,它按照固定的间隔(step size)将学习率乘以一个因子(gamma)。这种方式可以帮助模型在训练过程中逐渐减少学习率,从而有助于模型更好地收敛到最优解。

模型训练

创建了一个训练函数train,预测函数predict和一个验证函数validate

训练函数train里面包含的就是一个正常的pytorch 模型的训练流程,使用 PyTorch 进行数据加载、前向传播、损失计算、反向传播和参数更新。通过 AverageMeterProgressMeter 辅助类,实时记录和显示训练过程中的损失、准确率和耗时等指标:

首先 model.train() 将模型设置为训练模式,启用 dropout 和 batch normalization。

然后进行模型训练,每轮先将输入数据和标签的传输到 GPU,non_blocking=True 表示数据传输是异步的

input = input.cuda(non_blocking=True)

target = target.cuda(non_blocking=True)

接下来就可以计算模型输出和损失

output = model(input)
loss = criterion(output, target)

进行记录后,执行反向传播和优化,清除之前计算的梯度,计算当前批次的梯度,并根据梯度更新模型参数。

optimizer.zero_grad()  
loss.backward() 
optimizer.step()

验证函数和预测函数都是要把模型模式转换成评估模式, model.eval(),其他都差不多。

Tips

  1. pip install timm 安装timm库,timm库提供了大量预训练的图像分类模型,涵盖了各种最新的架构和高效的实现。

  2. from PIL import Image
    Image.open('/kaggle/input/deepfake/phase1/trainset/63fee8a89581307c0b4fd05a48e0ff79.jpg') #图片导入

  3. torch.manual_seed(0) #pytorch的随机种子为0。目的是为了使随机数生成器在每次运行时产生相同的随机数,这样可以确保实验的可重复性。

  4. torch.backends.cudnn.deterministic = False 这个设置与CUDA和cuDNN相关,它决定是否使用确定性算法。当设置为False时,允许使用非确定性算法,这可能会导致结果在不同的运行中有所不同,但通常可以提高训练速度。这种设置适用于对结果确定性要求不高,而更关注训练速度的情况。

  5. torch.backends.cudnn.benchmark = True 这个设置也是与CUDA和cuDNN相关。当设置为True时,cuDNN会在每次输入大小变化时,选择一个最优的卷积算法。这有助于提高模型训练和推理的性能,尤其是在输入大小变化频繁的情况下。

  6. train_label['target'].value_counts() 计算该列每类数量

  7. train_label.head(10) 展示前10个

  8. 将模型和数据移到GPU,通过.cuda()来实现

  9. round(val_acc.avg.item(), 2) 表示将验证集平均准确率四舍五入到小数点后两位。

改进方向:

  1. 更多的数据增强(旋转,颜色变换,mixup, cutmix)

  2. 更换模型(满足模型要求情况下最大的)

  3. 训练集与验证集,产生deepfake原本的逻辑是相同的

  4. 提前缩放一下数据集

  • 20
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值