Task1
Part1: Deepfake是什么?
● 定义:使用人工智能技术生成的伪造媒体,特别是视频和音频,看起来或听起来非常真实,但实际上是由计算机生成的,通常涉及深度学习算法,特别是生成对抗网络(GANs)。
● 危害:在政治、经济、法律等领域带来严重危害,如制造假新闻、操纵舆论、破坏企业形象、误导司法判断等,还可能加剧身份盗窃风险、成为恐怖分子工具、煽动暴力和社会动荡,威胁国家安全。
● 研究方向:分为面部交换、面部重演、说话面部生成、面部属性编辑四个主流方向。
Part2: 如何识别Deepfake?
● 视觉检测: 观察视频中的面部表情是否自然,是否有不协调的面部动作或不一致的光照和阴影。
● 技术检测: 使用专门的软件或算法来分析视频帧,检测Deepfake的典型特征,如不自然的纹理、像素级异常等。
● 通过观察图片细节(如人物面部特征、眨眼频率、口型与说话内容同步性)、检查光线和阴影(光源一致性、阴影方向)、分析像素(模糊或像素化部分)、注意背景(不协调元素、物体边缘平滑度、背景重复模式)等逻辑步骤进行人工识别。
Part3: 深度学习与Deepfake
● 机器学习与深度学习: 深度学习是机器学习的一个分支,专注于使用多层神经网络来学习数据的复杂模式。
● 深度学习在Deepfake中的应用: 通过训练神经网络,学习源图像和目标图像之间的映射关系,生成逼真的Deepfake内容。
Part4: Baseline 关键步骤
-
加载预训练模型: 使用预训练的深度学习模型可以加速开发过程,并提高生成内容的质量。
-
提取音频特征: 在生成或识别Deepfake内容时,音频特征的提取是一个关键步骤,有助于提高识别的准确性。
-
定义模型训练步骤: 明确训练模型的步骤和参数,确保模型能够有效地学习并生成或识别Deepfake内容。
-
数据集增强: 通过数据增强技术,可以增加训练数据的多样性,提高模型的泛化能力。
Kaggle实操
由于之前已经使用过Kaggle,所以教程中的注册阶段不再需要操作。完成报名和问卷。
通过baseline的文件,copy后选择好显卡,一键运行,得到第一次分数:
Task2
Part1 深度学习是什么?
● 神经元模型:深度学习的基础,理解单个神经元如何工作。
● 从机器学习到深度学习:介绍机器学习的概念,以及如何过渡到深度学习。
● 层次化假设:深度学习通过分层结构学习数据的不同层次和抽象。
● 特征工程:传统机器学习需要人工设计特征,深度学习自动学习特征,减少人工需求。
● 端到端学习:深度学习模型可以直接从输入到输出,无需中间步骤。
Part2 深度学习如何训练的?
● 梯度下降算法:深度学习中用于优化模型参数的基本算法。
● Pytorch训练代码:使用Pytorch框架进行深度学习模型的训练示例代码。
● 自动调整权重:深度学习通过大量数据和训练自动调整权重,提高任务完成的准确性。
Part3 深度学习与迁移学习
● ImageNet 介绍:介绍ImageNet数据集,它是深度学习中常用的图像识别数据集。
● 迁移学习的实现方法:解释如何利用预训练模型来解决新问题,即迁移学习。
Part4 常见的图像分类网络
● AlexNet:深度学习中的一个重要里程碑,是第一个在ImageNet竞赛中取得突破性成绩的网络。
● ResNet:引入残差学习框架,解决深层网络训练难题。
● EfficientNet:一种新的缩放方法,通过复合缩放方法系统地改进网络精度和效率。
● EfficientNet Papers with Code
Part5: 一些思路
一、多帧提取、面部识别与相似比较 - 多帧提取:从视频中提取多个帧进行分析。 - 面部识别:对帧中的面部进行识别和分析。 - 相似比较:比较不同帧之间的相似性,以检测异常。
二、音频 Fake - 对音频的伪造情况进行研究和分析。
三、特征提取 - 包括 chroma_stft、rms、spectral_centroid、spectral_bandwidth、rolloff、zero_crossing_rate、mfcc 等多种特征的提取,这些特征可能用于音频或视频的分析和处理,以识别 Deepfake 现象。
Kaggle实操
● 为了提升模型的性能,我们可以从以下几个方面进行改进:
○ 数据增强:增加更多的数据增强方法,如随机裁剪、随机旋转等,以提高模型的泛化能力。
○ 模型选择:尝试使用更复杂的模型,如ResNet50或EfficientNet,这些模型通常具有更强的特征提取能力。
○ 学习率调整:使用更复杂的学习率调整策略,如余弦退火学习率,以帮助模型更好地收敛。
○ 损失函数:尝试使用不同的损失函数,如Focal Loss,以更好地处理类别不平衡问题。
○ 优化器:尝试使用不同的优化器,如SGD with Momentum,以提高模型的训练速度和稳定性。
● 修改部分:
○ 数据增强:增加了随机旋转和随机裁剪,以提高模型的泛化能力。
○ 模型选择:从ResNet18改为ResNet50,以提高模型的特征提取能力。
○ 学习率调整:从StepLR改为CosineAnnealingLR,以帮助模型更好地收敛。
○ 优化器:从Adam改为SGD with Momentum,以提高模型的训练速度和稳定性。
○ 这些修改有助于提高模型的性能和泛化能力。
● FFDIDataset类可以做一些小的改进来提高代码的可读性和效率。以下是改进后的代码:
○ 使用torchvision.transforms而不是手动转换图像:这样可以更方便地进行数据增强和标准化。
○ 使用torch.tensor而不是np.array:这样可以避免不必要的转换,并且更符合PyTorch的习惯。
Task3
根据提供的文档内容,以下是针对每个部分的学习笔记概要:
Part1 数据增强基础
● 定义:数据增强是一种技术,用于通过变换操作增加训练数据的多样性,提高模型的泛化能力。
● 目的:模拟真实世界中的变化,如视角、光照和遮挡,使模型学习到更鲁棒的特征表示。
● 注意:数据增强应与目标任务的实际场景相符,避免引入无关噪音或导致图像失真。
Part2 常见数据增强方法
● 几何变换:包括图像大小调整、旋转、剪切、平移等,用于模拟不同视角和位置的观察。
● 颜色变换:调整图像的亮度、对比度、饱和度等,模拟不同光照条件下的图像。
● 自动增强:使用自动化工具或算法来选择和应用数据增强操作。
Part3 进阶数据增强方法
● Mixup:一种数据增强技术,通过线性插值的方式混合两个图像及其标签,增加数据的多样性。
● Cutmix:类似于Mixup,但混合时只取一部分图像区域进行插值,模拟遮挡情况,增加模型的鲁棒性。
Part4 实操代码地址
● 提供了Kaggle上的代码示例,包括:
● Deepfake-FFDI-图像赛题的修改版本。
● 展示数据增强变换的插图。
● 原始的Deepfake-FFDI代码。
Kaggle实操
继续改进代码
for video_path in glob.glob('/kaggle/input/ffdv-sample-dataset/ffdv_phase1_sample/trainset/*.mp4')[:2000]:
这里限制了数据集只取头400个,可以修改
这里修改训练epoch
在timm项目的github中可以查看内置模型的测试结果情况
有不同的数据集结果,这里主要参考下面两种:
mageNet-Adversarial - results-imagenet-a.csv
A collection of 7500 images covering 200 of the 1000 ImageNet classes. Images are naturally occurring adversarial examples that confuse typical ImageNet classifiers. This is a challenging dataset, your typical ResNet-50 will score 0% top-1.
For clean validation with same 200 classes, see results-imagenet-a-clean.csv
● Source: github.com/hendrycks/n…
● Paper: "Natural Adversarial Examples" - arxiv.org/abs/1907.07…
ImageNet-Rendition - results-imagenet-r.csv
Renditions of 200 ImageNet classes resulting in 30,000 images for testing robustness.
For clean validation with same 200 classes, see results-imagenet-r-clean.csv
● Source: github.com/hendrycks/i…
● Paper: "The Many Faces of Robustness" - arxiv.org/abs/2006.16…
修改模型为“eva02_large_patch14_448.mim_in22k_ft_in22k_in1k”,因为它在-r-clean排名中为第一,发现batchsize设为1,显存也会爆,模型太大。
考虑图片尺寸问题,往更小尺寸的模型找:
eva02_small_patch14_336.mim_in22k_ft_in1k,也不行
最终找到caformer_s36.sail_in22k_ft_in1k模型,
在batch_size=32, shuffle=True, num_workers=4, pin_memory=True可以运行(GPU:P100)
在总排行中还是比较靠前的,其384版本排第67
原本的训练数据使用的很少,通过[:400]只取了前400个数据,如果使用更多数据,效果应该会更好。
因此,如果选择全量数据,然后进行一定的处理,效果应该会更好.
由于时间不够,这里没法选择全体数据,最终选择了部分数据训练一个epoch: