Deepfake-Detection
随着人工智能领域技术的飞速发展,深度伪造技术已成为一把双刃剑。它不仅创造了大量 AI 生成的内容,还对数字安全提出了前所未有的挑战Global Multimedia Deepfake旨在真实场景中针对各种类型的 Deepfake 攻击开发、测试和进一步发展更准确、有效和创新的检测模型,并激发创新的防御策略并提高 Deepfake 识别的准确性。
1. 什么是Deepfake?
Deepfake是一种运用深度学习技术(尤其是生成式对抗网络, GANs)来创建高度逼真的合成媒体内容的方法。这种技术能够精确地模拟某人的形象、声音乃至动作。Deepfake 最常见的用途是在视频中替换人物的面部,使之看起来像是另一人的脸,同时保持原有的表情和口型动作自然流畅。
尽管 Deepfake 技术在许多领域展示了其创新潜力,但其不当使用也引发了诸多严重问题。具体而言:
- 政治领域:Deepfake 可能被用于制造假新闻或操纵舆论,进而影响选举结果及政治稳定。
- 经济影响:它可能损害企业声誉,引起市场恐慌,甚至被用来操纵股票市场。
- 法律体系:伪造的证据可能会误导司法程序。
- 身份盗窃:Deepfake 技术加大了身份盗窃的风险。
- 恐怖主义:该技术可能成为恐怖分子的新工具,用以煽动暴力和社会动荡,威胁国家安全。
Deepfake 技术的滥用不仅对政治稳定和经济秩序构成威胁,还可能对法律公正性产生负面影响,并加剧身份盗窃的风险,甚至成为恐怖主义活动的助推器,从而对国家安全构成威胁。
深度伪造技术通常可以分为四个主流研究方向:
-
面部交换专注于在两个人的图像之间执行身份交换;
-
面部重演强调转移源运动和姿态;
-
说话面部生成专注于在角色生成中实现口型与文本内容的自然匹配;
-
面部属性编辑旨在修改目标图像的特定面部属性;
2. 如何识别Deepfake?
如果想要人工识别Deepfake的图片,可以通过以下逻辑步骤进行:
首先,观察图像或视频中的细节,仔细检查面部特征,例如眼睛的状态可能会突然变化,说话时嘴唇的动作与声音不同步,皮肤可能显得过于光滑或有不自然的斑点。
接着,检查照明或阴影,分析图片中的光源是否一致,阴影的方向是否与光源相符,不自然的光线或阴影可能是图片被修改的迹象。
然后,分析像素。放大图片,寻找是否有模糊或像素化的部分,这可能是Deepfake技术留下的瑕疵。Deepfake视频可能会有抖动或闪烁的现象,分辨率低于原视频,播放速度忽快忽慢。
此外,注意背景。人物边缘是否模糊或不自然,以及人物与背景是否协调。
3. Deepfake检测主要代码解读
完整代码地址:GitHub - 24447808721/kaggle-The-Global-Multimedia-Deepfake-Detection: 用于多媒体深度伪造检测,包含了代码和数据集用于多媒体深度伪造检测,包含了代码和数据集. Contribute to 24447808721/kaggle-The-Global-Multimedia-Deepfake-Detection development by creating an account on GitHub.https://github.com/24447808721/kaggle-The-Global-Multimedia-Deepfake-Detection.git
音视频数据预处理
在识别Deepfake视频时,音频分析之所以相对简单,是因为Deepfake技术生成的视频中,音频部分可能存在不自然或重复的模式,例如重复的单词或短语。通过分析音频的频谱图,可以更容易地发现这些异常,从而帮助判断视频是否经过了深度伪造处理。通常,Deepfake视频中的语音合成技术可能导致音频与视频不完全同步,或者产生不自然的停顿、重复的声音模式。这些特点在频谱图上会表现为不连续或非自然的模式,与真实录音的平滑连贯特性形成对比。
MEL频谱图(Mel-spectrogram)是一种在音频信号处理领域常用的可视化工具,它基于人耳的听觉特性来表示音频信号的频率内容。梅尔刻度是一种对频率进行非线性缩放的方法,它将线性频率映射到梅尔频率上,使得梅尔刻度上的间隔更接近人耳感知的间隔。MEL频谱图将声音信号转换为一个二维图像,其中横轴代表时间,纵轴代表按Mel标度排列的频率,而颜色或灰度值则表示对应时间和频率下的声能强度。Mel标度反映了人类听觉系统对于不同频率范围内的敏感度差异,使得MEL频谱图能够更好地捕捉到信号的细节。在检测Deepfake视频中的异常时,MEL频谱图尤其有用,因为它能够突出显示音频信号中的不一致性,如不自然的停顿、重复的声音模式等,这些在MEL频谱图上会表现为异常的模式或不连续性。
#实现将视频音频转换成MEL频谱图
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/alldeepfake/phase1/trainset/00154f42886002f8a2a6e40343617510.mp4' # 替换为您的视频文件路径
# mel_spectrogram_image = generate_mel_spectrogram(video_path)
#下面内容是直接将数据集的所有视频音频转换成MEL频谱图,处理时间较长,这边上传了转换好的所有频谱图,可以跳过这段代码,感兴趣的也可以自己尝试一下转换
# !mkdir ffdv_phase1_sample
# !mkdir ffdv_phase1_sample/trainset
# !mkdir ffdv_phase1_sample/valset
# 时间太长可以将241991和79500修改较小的数
# for video_path in glob.glob('/kaggle/input/alldeepfake/phase1/trainset/*.mp4')[:241991]:
# mel_spectrogram_image = generate_mel_spectrogram(video_path)
# cv2.imwrite('./ffdv_phase1_sample/trainset/' + video_path.split('/')[-1][:-4] + '.jpg', mel_spectrogram_image)
# for video_path in glob.glob('/kaggle/input/alldeepfake/phase1/valset/*.mp4')[:79509]:
# mel_spectrogram_image = generate_mel_spectrogram(video_path)
# cv2.imwrite('./ffdv_phase1_sample/valset/' + video_path.split('/')[-1][:-4] + '.jpg', mel_spectrogram_image)
数据集增强
数据增强是提升机器学习和深度学习模型性能的关键技术之一。它通过在训练集上应用一系列随机变换来增加数据的多样性,这样可以有效地扩大训练集的规模并提高模型的泛化能力。常见的数据增强技术包括旋转、缩放、翻转图像等操作,这些变换可以帮助模型学习到更多样化的特征表示。
transforms.Compose: 这是一个转换操作的组合,它将多个图像预处理步骤串联起来:
transforms.Resize((256, 256))
:将所有图像调整为256x256像素的大小。
transforms.RandomHorizontalFlip()
:随机水平翻转图像。
transforms.RandomVerticalFlip()
:随机垂直翻转图像。
transforms.ToTensor()
:将PIL图像或Numpy数组转换为torch.FloatTensor
类型,并除以255以将像素值范围从[0, 255]缩放到[0, 1]。
transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])
:对图像进行标准化,使用ImageNet数据集的均值和标准差。
train_loader = torch.utils.data.DataLoader(
FFDIDataset(train_label['path'].values, train_label['target'].values,
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=12, pin_memory=True
)
val_loader = torch.utils.data.DataLoader(
FFDIDataset(val_label['path'].values, val_label['target'].values,
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=10, pin_memory=True
)
PS
首先感谢dataWhale提供这次难得学习机会,还有感谢Inclusion会议提供的这次比赛,很遗憾因为个人原因没有提交最后的结果导致错失了决赛,但是也从这次比赛中学到了很多,在此对两个团队人员表示真挚的感谢。这篇内容是对这次学习的一个总结,对于这次音视频的识别主要还是对于音频进行一个检测,虽然没有用到多模态的检测,但也取得了不错的效果。讲一下可以优化的点:1.在进行音频转化时,可以进行一个并行处理或利用GPU处理,提升转换速度。 2.增加数据多样性,可以增加高斯处理。3.利用多模态进行一个处理,只利用音频还是较为局限。