Task1
Part1: Deepfake是什么?
● 定义:使用人工智能技术生成的伪造媒体,特别是视频和音频,看起来或听起来非常真实,但实际上是由计算机生成的,通常涉及深度学习算法,特别是生成对抗网络(GANs)。
● 危害:在政治、经济、法律等领域带来严重危害,如制造假新闻、操纵舆论、破坏企业形象、误导司法判断等,还可能加剧身份盗窃风险、成为恐怖分子工具、煽动暴力和社会动荡,威胁国家安全。
● 研究方向:分为面部交换、面部重演、说话面部生成、面部属性编辑四个主流方向。
Part2: 如何识别Deepfake?
● 视觉检测: 观察视频中的面部表情是否自然,是否有不协调的面部动作或不一致的光照和阴影。
● 技术检测: 使用专门的软件或算法来分析视频帧,检测Deepfake的典型特征,如不自然的纹理、像素级异常等。
● 通过观察图片细节(如人物面部特征、眨眼频率、口型与说话内容同步性)、检查光线和阴影(光源一致性、阴影方向)、分析像素(模糊或像素化部分)、注意背景(不协调元素、物体边缘平滑度、背景重复模式)等逻辑步骤进行人工识别。
Part3: 深度学习与Deepfake
● 机器学习与深度学习: 深度学习是机器学习的一个分支,专注于使用多层神经网络来学习数据的复杂模式。
● 深度学习在Deepfake中的应用: 通过训练神经网络,学习源图像和目标图像之间的映射关系,生成逼真的Deepfake内容。
Part4: Baseline 关键步骤
● 加载预训练模型: 使用在大规模数据集上预训练的模型,可以提高训练效率和模型性能。
● 定义模型训练步骤:
● 前向传播: output = model(input),模型对输入数据进行预测。
● 计算损失: loss = criterion(output, target),评估预测输出与目标标签的差异。
● 梯度归零: optimizer.zero_grad(),重置梯度,防止累积。
● 反向传播: loss.backward(),计算损失对模型参数的梯度。
● 参数更新: optimizer.step(),根据梯度更新模型参数。
● 数据集增强: 通过随机变换增加训练数据的多样性,提高模型的泛化能力。
数据增强技术详解
● transforms.Resize((256, 256)): 调整图像大小到统一的分辨率。
● transforms.RandomHorizontalFlip(): 随机水平翻转图像,增加数据多样性。
● transforms.RandomVerticalFlip(): 随机垂直翻转图像,进一步增加数据多样性。
● transforms.ToTensor(): 将图像转换为适合深度学习模型处理的格式,并进行归一化处理。
● transforms.Normalize(): 使用ImageNet数据集的均值和标准差对图像进行标准化。
训练函数示例
● Python函数定义:
Task1
Part1: Deepfake是什么?
● 定义:使用人工智能技术生成的伪造媒体,特别是视频和音频,看起来或听起来非常真实,但实际上是由计算机生成的,通常涉及深度学习算法,特别是生成对抗网络(GANs)。
● 危害:在政治、经济、法律等领域带来严重危害,如制造假新闻、操纵舆论、破坏企业形象、误导司法判断等,还可能加剧身份盗窃风险、成为恐怖分子工具、煽动暴力和社会动荡,威胁国家安全。
● 研究方向:分为面部交换、面部重演、说话面部生成、面部属性编辑四个主流方向。
Part2: 如何识别Deepfake?
● 视觉检测: 观察视频中的面部表情是否自然,是否有不协调的面部动作或不一致的光照和阴影。
● 技术检测: 使用专门的软件或算法来分析视频帧,检测Deepfake的典型特征,如不自然的纹理、像素级异常等。
● 通过观察图片细节(如人物面部特征、眨眼频率、口型与说话内容同步性)、检查光线和阴影(光源一致性、阴影方向)、分析像素(模糊或像素化部分)、注意背景(不协调元素、物体边缘平滑度、背景重复模式)等逻辑步骤进行人工识别。
Part3: 深度学习与Deepfake
● 机器学习与深度学习: 深度学习是机器学习的一个分支,专注于使用多层神经网络来学习数据的复杂模式。
● 深度学习在Deepfake中的应用: 通过训练神经网络,学习源图像和目标图像之间的映射关系,生成逼真的Deepfake内容。
Part4: Baseline 关键步骤
● 加载预训练模型: 使用在大规模数据集上预训练的模型,可以提高训练效率和模型性能。
● 定义模型训练步骤:
● 前向传播: output = model(input),模型对输入数据进行预测。
● 计算损失: loss = criterion(output, target),评估预测输出与目标标签的差异。
● 梯度归零: optimizer.zero_grad(),重置梯度,防止累积。
● 反向传播: loss.backward(),计算损失对模型参数的梯度。
● 参数更新: optimizer.step(),根据梯度更新模型参数。
● 数据集增强: 通过随机变换增加训练数据的多样性,提高模型的泛化能力。
数据增强技术详解
● transforms.Resize((256, 256)): 调整图像大小到统一的分辨率。
● transforms.RandomHorizontalFlip(): 随机水平翻转图像,增加数据多样性。
● transforms.RandomVerticalFlip(): 随机垂直翻转图像,进一步增加数据多样性。
● transforms.ToTensor(): 将图像转换为适合深度学习模型处理的格式,并进行归一化处理。
● transforms.Normalize(): 使用ImageNet数据集的均值和标准差对图像进行标准化。
训练函数示例
● Python函数定义:# Task1
Part1: Deepfake是什么?
● 定义:使用人工智能技术生成的伪造媒体,特别是视频和音频,看起来或听起来非常真实,但实际上是由计算机生成的,通常涉及深度学习算法,特别是生成对抗网络(GANs)。
● 危害:在政治、经济、法律等领域带来严重危害,如制造假新闻、操纵舆论、破坏企业形象、误导司法判断等,还可能加剧身份盗窃风险、成为恐怖分子工具、煽动暴力和社会动荡,威胁国家安全。
● 研究方向:分为面部交换、面部重演、说话面部生成、面部属性编辑四个主流方向。
Part2: 如何识别Deepfake?
● 视觉检测: 观察视频中的面部表情是否自然,是否有不协调的面部动作或不一致的光照和阴影。
● 技术检测: 使用专门的软件或算法来分析视频帧,检测Deepfake的典型特征,如不自然的纹理、像素级异常等。
● 通过观察图片细节(如人物面部特征、眨眼频率、口型与说话内容同步性)、检查光线和阴影(光源一致性、阴影方向)、分析像素(模糊或像素化部分)、注意背景(不协调元素、物体边缘平滑度、背景重复模式)等逻辑步骤进行人工识别。
Part3: 深度学习与Deepfake
● 机器学习与深度学习: 深度学习是机器学习的一个分支,专注于使用多层神经网络来学习数据的复杂模式。
● 深度学习在Deepfake中的应用: 通过训练神经网络,学习源图像和目标图像之间的映射关系,生成逼真的Deepfake内容。
Part4: Baseline 关键步骤
● 加载预训练模型: 使用在大规模数据集上预训练的模型,可以提高训练效率和模型性能。
● 定义模型训练步骤:
● 前向传播: output = model(input),模型对输入数据进行预测。
● 计算损失: loss = criterion(output, target),评估预测输出与目标标签的差异。
● 梯度归零: optimizer.zero_grad(),重置梯度,防止累积。
● 反向传播: loss.backward(),计算损失对模型参数的梯度。
● 参数更新: optimizer.step(),根据梯度更新模型参数。
● 数据集增强: 通过随机变换增加训练数据的多样性,提高模型的泛化能力。
数据增强技术详解
● transforms.Resize((256, 256)): 调整图像大小到统一的分辨率。
● transforms.RandomHorizontalFlip(): 随机水平翻转图像,增加数据多样性。
● transforms.RandomVerticalFlip(): 随机垂直翻转图像,进一步增加数据多样性。
● transforms.ToTensor(): 将图像转换为适合深度学习模型处理的格式,并进行归一化处理。
● transforms.Normalize(): 使用ImageNet数据集的均值和标准差对图像进行标准化。
训练函数示例
● Python函数定义:
def train(train_loader, model, criterion, optimizer, epoch):
model.train()
for i, (input, target) in enumerate(train_loader):
input = input.cuda(non_blocking=True)
target = target.cuda(non_blocking=True)
output = model(input)
loss = criterion(output, target)
optimizer.zero_grad()
loss.backward()
optimizer.step()
● 说明: 这个函数是一个典型的训练循环,用于训练深度学习模型。它包括数据加载、模型预测、损失计算、梯度清零、反向传播和参数更新等步骤。
Kaggle实操
由于之前已经使用过Kaggle,所以教程中的注册阶段不再需要操作。完成报名和问卷。
通过baseline的文件,copy后选择好显卡,一键运行,得到第一次分数:
Task2
Part1 深度学习是什么?
● 神经元模型:深度学习的基础,理解单个神经元如何工作。
● 从机器学习到深度学习:介绍机器学习的概念,以及如何过渡到深度学习。
● 层次化假设:深度学习通过分层结构学习数据的不同层次和抽象。
● 特征工程:传统机器学习需要人工设计特征,深度学习自动学习特征,减少人工需求。
● 端到端学习:深度学习模型可以直接从输入到输出,无需中间步骤。
Part2 深度学习如何训练的?
● 梯度下降算法:深度学习中用于优化模型参数的基本算法。
● Pytorch训练代码:使用Pytorch框架进行深度学习模型的训练示例代码。
● 自动调整权重:深度学习通过大量数据和训练自动调整权重,提高任务完成的准确性。
Part3 深度学习与迁移学习
● ImageNet 介绍:介绍ImageNet数据集,它是深度学习中常用的图像识别数据集。
● 迁移学习的实现方法:解释如何利用预训练模型来解决新问题,即迁移学习。
Part4 常见的图像分类网络
● AlexNet:深度学习中的一个重要里程碑,是第一个在ImageNet竞赛中取得突破性成绩的网络。
● ResNet:引入残差学习框架,解决深层网络训练难题。
● EfficientNet:一种新的缩放方法,通过复合缩放方法系统地改进网络精度和效率。
● EfficientNet Papers with Code
其他要点
● 学习顺序:建议先学习基础的机器学习知识,再过渡到深度学习。
● 经典算法:掌握一些基础的机器学习算法,如线性回归、逻辑回归等。
● 神经网络结构:理解基础的神经网络结构,包括神经元、层、前向传播和反向传播。
● 深度学习框架:学习使用TensorFlow或PyTorch等深度学习框架。
● 模型类型:掌握不同类型的深度学习模型,如CNN、RNN、LSTM和Transformer。
注意事项
● 数据需求:深度学习通常需要大量数据,对于数据获取困难的领域可能不适用。
● 问题解决范围:虽然深度学习在多个领域有显著成就,但不能解决所有问题。
另外,微调中在训练时,可能会使用比预训练时更低的学习率。这是之前没有注意到过的。
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实操
继续改进代码
这里限制了数据集只取头1000行,去掉head
这里修改训练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
原本的训练数据使用的很少,通过.head(1000)只取了前1000个数据,如果使用更多数据,效果应该会更好。
同时,数据不均衡:
train_label['target'].value_counts()
target 1 425043 0 99386 Name: count, dtype: int64
val_label['target'].value_counts()
target 1 88281 0 59082 Name: count, dtype: int64
因此,如果选择全量数据,然后进行一定的均衡化处理,效果应该会更好,比如针对target0进行更多的数据增强方法。
由于时间不够,这里没法选择全体的50w数据,最终选择了10w数据训练一个epoch: