#Datawhale AI 夏令营
1.比赛专题:Deepfake 图像识别
链接地址:
Inclusion・The Global Multimedia Deepfake Detection | Kaggle
报名后直接使用零基础友好的BaseLine:
Deepfake-FFDI-图像赛题 baseline (kaggle.com)
报名后开始在Kaggle平台运行项目,结果卡在了手机号验证导致用不了平台提供的算力资源......
2. 流程分析
看了看BaseLine的代码,可以说划分地非常细。 概括就是:
- 引入依赖
- 数据处理
- 模型训练与验证
- 加载模型
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)
其他的模型构建、模型训练就相对简单了,这里不一一列举了。 贴上最后跑出来的分数: