Kaggle比赛之全球Deepfake攻防挑战赛音视频赛题baseline(1)(Datawhale AI 夏令营)

赛事任务:

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


数据集描述

训练集的标签文件train_label.txt用于训练模型,而验证集的标签文件val_label.txt仅用于模型调优。例如,在train_label.txt或val_label.txt中,每行包含两部分,由逗号分隔。第一部分是文件名(后缀为.mp4),第二部分是真实值。目标值为1表示深度伪造音视频,目标值为0表示真实的人脸音视频。


评估指标:

真阳性率 (TPR):

TPR = TP / (TP + FN)

假阳性率 (FPR):

FPR = FP / (FP + TN)

其中:

TP:攻击样本被正确识别为攻击;
TN:真实样本被正确识别为真实;
FP:真实样本被错误识别为攻击;
FN:攻击样本被错误识别为真实。


代码解析:

  1. 检查样本
    使用 wc -l 命令统计文件的行数,确认训练集和验证集中的样本数量。
!wc -l /kaggle/input/ffdv-sample-dataset/ffdv_phase1_sample/train_label.txt
!wc -l /kaggle/input/ffdv-sample-dataset/ffdv_phase1_sample/val_label.tx

输出结果:
241991 /kaggle/input/ffdv-phase1-sample-10k/ffdv_phase1_sample-0708/trainset_label.txt
79509 /kaggle/input/ffdv-phase1-sample-10k/ffdv_phase1_sample-0708/valset_label.txt
训练集与验证集样本数量大概3:1。

  1. 显示视频
    在 Jupyter Notebook 中嵌入并播放视频,用于检查视频数据是否正常。
from IPython.display import Video
Video("/kaggle/input/ffdv-sample-dataset/ffdv_phase1_sample/valset/00882a2832edbcab1d3dfc4cc62cfbb9.mp4", embed=True)

注:在kaggle中遇到不清楚的函数可以直接“函数名+?”查看函数定义

3.安装所需要的库

!pip install moviepy librosa matplotlib numpy timm

4.导入相关库

import torch
torch.manual_seed(0)#随机种子
torch.backends.cudnn.deterministic = False #在Pytorch中使用GPU时,底层的CuDNN库负责加速神经网络的运算。CuDNN库在每次运行前会自动选择一种算法来执行计算。然而,由于算法涉及到随机性的因素,同一段代码在多次运行中可能会得到不同的结果。有时候这是我们期望的,但在某些情况下,我们需要保证结果的确定性。这时,就可以使用’torch.backends.cudnn.deterministic=True’这个参数。‘torch.backends.cudnn.deterministic=True’参数在每次运行CuDNN库之前,会固定CuDNN库的随机数种子。这样,无论代码运行多少次,得到的结果都将是相同的。这对于训练模型时的可复现性非常重要,特别是在调试和优化模型时。需要注意的是,使用’torch.backends.cudnn.deterministic=True’参数会导致训练的速度变慢,因为使用了固定的随机数种子。此外,部分使用了CuDNN库的函数可能会受到限制,因为固定种子可能会降低某些算法的效率。
torch.backends.cudnn.benchmark = True #在代码前加设torch.backends.cudnn.benchmark = True可以提升训练速度。会让程序在开始时花费一点额外时间,为整个网络的每个卷积层搜索最适合它的卷积实现算法,进而实现网络的加速。

import torchvision.models as models
import torchvision.transforms as transforms
import torchvision.datasets as datasets
import torch.nn as nn
import torch.nn.functional as F
import torch.optim as optim
from torch.autograd import Variable
from torch.utils.data.dataset import Dataset
import timm
import time

import pandas as pd
import numpy as np
import cv2, glob, os
from PIL import Image
  1. MEL 频谱图
import moviepy.editor as mp
import librosa
import numpy as np
import cv2

def generate_mel_spectrogram(video_path, n_mels=128, fmax=8000, target_size=(256, 256)):
    # 提取音频
    audio_path = 'extracted_audio.wav'
    video = mp.VideoFileClip(video_path)
    video.audio.write_audiofile(audio_path, verbose=False, logger=None)

    # 加载音频文件
    y, sr = librosa.load(audio_path)

    # 生成MEL频谱图
    S = librosa.feature.melspectrogram(y=y, sr=sr, n_mels=n_mels)

    # 将频谱图转换为dB单位
    S_dB = librosa.power_to_db(S, ref=np.max)

    # 归一化到0-255之间
    S_dB_normalized = cv2.normalize(S_dB, None, 0, 255, cv2.NORM_MINMAX)
    
    # 将浮点数转换为无符号8位整型
    S_dB_normalized = S_dB_normalized.astype(np.uint8)

    # 缩放到目标大小
    img_resized = cv2.resize(S_dB_normalized, target_size, interpolation=cv2.INTER_LINEAR)

    return img_resized

# 使用示例
video_path = '/kaggle/input/ffdv-phase1-sample-10k/ffdv_phase1_sample-0708/trainset/00154f42886002f8a2a6e40343617510.mp4'  # 替换为您的视频文件路径
mel_spectrogram_image = generate_mel_spectrogram(video_path)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值