Datawhale AI 夏令营 | CV方向 2024 Task1 笔记

219 阅读2分钟

#Datawhale AI 夏令营

1.比赛专题:Deepfake 图像识别

链接地址:

Inclusion・The Global Multimedia Deepfake Detection | Kaggle

报名后直接使用零基础友好的BaseLine:

Deepfake-FFDI-图像赛题 baseline (kaggle.com)

报名后开始在Kaggle平台运行项目,结果卡在了手机号验证导致用不了平台提供的算力资源......

2. 流程分析

看了看BaseLine的代码,可以说划分地非常细。 概括就是:

  1. 引入依赖
  2. 数据处理
  3. 模型训练与验证
  4. 加载模型

3.代码迁移

BaseLine使用的是PyTorch,而我想尝试使用Tensorflow跑一遍,在此基础上进行了一些改动,就拿FFDIDataset类举例:

class FFDIDataset: 
    def __init__(self, img_path, img_label, train: bool = True):
        self.img_path = img_path
        self.img_label = img_label
        self.train = train
    def __getitem__(self, index):
        try:  
            # 加载图像
            img = Image.open(self.img_path[index]).convert('RGB')          
            # 数据增强  
            if self.train:  
                # 归一化  
                img = np.array(img) / 255.0 
                img = (img - [0.485, 0.456, 0.406]) / [0.229, 0.224, 0.225]   
                # 转换为Tensor  
                img = tf.convert_to_tensor(img, dtype=tf.float32)  
                # 大小调整  
                img = tf.image.resize(img, [128, 128])  
                # 垂直随机旋转  rot90是90度的倍数旋转
                img = tf.image.rot90(img, k=np.random.randint(0, 4)) 
                # 水平随机翻转  
                img = tf.image.random_flip_left_right(img)  
            else:  
                # 测试或验证时,只进行归一化和大小调整  
                img = np.array(img) / 255.0  
                img = (img - [0.485, 0.456, 0.406]) / [0.229, 0.224, 0.225]  
                img = tf.convert_to_tensor(img, dtype=tf.float32)  
                img = tf.image.resize(img, [128, 128])  
            img_label_tensor = tf.convert_to_tensor(np.array(self.img_label[index]), dtype=tf.int32)  # 如果类型有误,请尝试tf.float32
            return img, img_label_tensor
        except Exception as e:  
            print(f"Error processing image {self.img_path[index]}: {e}")  
            return None, None         
    def __len__(self):
        return len(self.img_path)

在使用方面也有所调整:

def ffdidataset_generator(dataset: FFDIDataset):  
    for index in range(len(dataset)):  
        img, label = dataset.__getitem__(index)  
        if img is not None and label is not None:  # 跳过错误处理的None返回  
            yield img, label  
  
# 创建FFDIDataset实例  
train_dataset = FFDIDataset(train_data['path'], train_data['target'], train=True)  
val_dataset = FFDIDataset(val_data['path'], val_data['target'], train=False)  
  
# 使用生成器函数创建tf.data.Dataset  
train_loader = tf.data.Dataset.from_generator(  
    lambda: ffdidataset_generator(train_dataset),  
    output_types=(tf.float32, tf.int32),  
    output_shapes=([128, 128, 3], [])  
).shuffle(100).batch(5).prefetch(tf.data.experimental.AUTOTUNE)  
  
val_loader = tf.data.Dataset.from_generator(  
    lambda: ffdidataset_generator(val_dataset),  
    output_types=(tf.float32, tf.int32),  
    output_shapes=([128, 128, 3], [])  
).batch(5).prefetch(tf.data.experimental.AUTOTUNE)  

其他的模型构建、模型训练就相对简单了,这里不一一列举了。 贴上最后跑出来的分数:

image.png