当前位置: 首页 > article >正文

《基于单中心损失监督的频率感知判别特征学习用于人脸伪造检测 》学习笔记

paper:2103.09096

三、方法

3.1 概述

为了解决以往方法在判别特征学习和频率信息挖掘中的问题,我们提出了一种频率感知的判别特征学习框架。正如图所示,我们的框架同时从RGB域频率域提取特征,并在框架的早期阶段将其融合。经过特征嵌入后,得到高级表示。框架的最后部分是一个分类器,用于输出输入样本的预测结果。频率线索的挖掘通过我们的AFFGM模块来实现。我们通过简单的逐点卷积块将频率域特征与RGB域特征融合,这有助于减少参数和计算开销。最后,在我们提出的单中心损失和softmax损失的联合监督下,网络学习到一个嵌入空间,使得自然面孔聚集在中心点周围,而篡改面孔则远离中心点。

3.2 自适应频率特征生成模块

随着合成真实面孔技术的成功,找到视觉伪造线索变得越来越困难。然而,如图所示,天然面孔和篡改面孔在频率域,特别是中高频带上的差异非常明显。以往的研究大多使用固定的滤波器组或来自其他领域的手工方法提取频率信息。然而,考虑到背景、性别、年龄、肤色和特别是篡改方法的多样性,这些基于不全面先验知识的方法不足以捕捉频率的伪造模式。为了解决这个问题,我们受 启发,提出了一种自适应频率特征生成模块(AFFGM),旨在高效地从频率域中挖掘微妙的伪造痕迹。我们的AFFGM由两部分组成:数据预处理和自适应频率信息挖掘块。接下来,我们将分别介绍这两部分内容。

3.2.1 数据预处理

数据预处理的流程如图所示。

(1)将输入的RGB图像转换为YCbCr颜色空间。

(2)对每个8×8的图像块应用2D DCT(离散余弦变换)。

值得注意的是,上述两个步骤也广泛应用于当前流行的图像压缩标准中,例如JPEG。我们认为,这将有助于从两个方面进行伪造检测。一方面,现有压缩算法的加速工具可以提高我们预处理的计算效率;另一方面,它将使我们的方法更加兼容由于压缩造成的痕迹。

(3)将来自同一频率带的 DCT 变换系数从所有8×8块中分组,保持它们的原始位置关系。因此,转换后的图像可以直接利用现有的神经网络。

(4)将所有频率通道连接成一个张量。输入图像的形状在预处理前后会发生变化。假设原始输入图像的形状为H×W×3,那么预处理后的输入张量形状变为H/8×W/8×192。此外,转换后的图像的大部分能量集中在低频带,而中频和高频带在伪造检测中发挥着更重要的作用。因此,所有频率通道通过从训练数据集中计算的均值和方差进行归一化。

3.2.2 自适应频率信息挖掘块

与以往的方法不同,我们的AFFGM通过数据驱动的方式学习频率特征,避免过度依赖不全面的先验知识。我们经验性地设计了一个简单而有效的网络块来提取频率特征。

预处理后的数据:

(1)通过一个3×3的卷积块,分成三个组进行处理。这意味着来自Y、Cb、Cr的不同通道数据会分别处理。

(2)数据依次经过一个普通的 3×3 卷积块和一个最大池化层。在这个过程中,来自不同通道的Y、Cb、Cr信息会相互作用。

(3)我们采用一个通道注意力块,由前述的最大池化层和两个线性层组成,以增强特征。最后,使用一个普通的1×1卷积层进一步提取与频率相关的特征。

 3.3 单中心损失(Single-center loss)

目前,基于深度学习的面部伪造检测方法通常使用 softmax 损失来监督网络训练。然而,由softmax 损失监督学习的特征在判别性上往往不足,因为softmax损失仅关注找到一个决策边界以分离不同类别,而没有显式地考虑类内紧凑性和类间可分性。显然,深度度量学习是一种有前景的解决方案。然而,大多数度量学习方法,如三元组损失(triplet loss)和中心损失(center loss),通常在嵌入空间中不加区分地压缩天然面孔和篡改面孔的类内变异性。然而,不同的篡改方法会导致面孔的特征分布差异。例如,Deepfakes会生成整个面孔,而NeuralTextures仅篡改目标人物的嘴部区域。直观上,它们在嵌入空间中的分布应该有明显的差异。进一步的证据是,监督学习所学到的特征在未见过的篡改方法上的泛化能力显著减弱。这表明,监督学习所学的特征与篡改方法高度相关。不同篡改方法生成的样本的特征差异使得很难将所有篡改的面孔聚集在一起。因此,在嵌入空间中不加区分地约束类内紧凑性通常会导致次优解,因为优化困难,甚至由于过拟合损害性能。为了解决这个问题,我们设计了一种新的单中心损失(Single-center Loss,SCL)。

3.3.1 定义

如图所示,SCL的目标是最小化天然面孔表示与中心点之间的距离,同时将篡改面孔的表示推远于中心点。设给定的训练数据集为(x_i, y_i)(i = 1, 2, \dots, N),其中x_i \in X为样本,y_i \in \{0, 1\}为对应的标签。通过神经网络f() 将样本映射到 D 维的向量表示。在我们的SCL中,我们仅设置天然面孔的中心点 C 。为了简化,我们采用f_i表示f(x_i)。与中心损失类似,我们的方法会基于小批量数据在每次迭代时更新中心点 C

给定一个训练数据的小批量,我们定义SCL为:

L_{sc} = M_{nat} + \max(M_{nat} - M_{man} + m\sqrt{D},0)

其中,M_{nat} 表示天然面孔与中心点 C 之间的均方欧几里得距离,M_{man} 表示篡改面孔与中心点C 之间的均方欧几里得距离。它们的函数定义如下:

M_{nat} = \frac{1}{\Omega _{nat}} \sum_{i \in \Omega _{nat}} \| f_i - C \|_2

M_{man} = \frac{1}{\Omega _{man}} \sum_{i \in \Omega _{man}} \| f_i - C \|_2

其中,\Omega _{nat} 和\Omega _{man} 分别表示天然面孔和篡改面孔的表示集合。SCL使得天然面孔的表示聚集在中心点周围,同时推动篡改面孔的表示距离中心点更远,且与天然面孔之间有一个边距。我们使用的欧几里得距离与特征维度的算术平方根相关,因此,为了方便设置超参数,边距设计为m\sqrt{D}

3.3.2 反向传播梯度计算

为了计算输入特征嵌入和中心点的反向传播梯度,假设一个小批量中有N_{nat} 个天然面孔和N_{man} ​个篡改面孔。且 y_i = 0 和 y_i = 1 分别表示第 i 个样本为天然面孔和篡改面孔。1[condition]是指示函数,如果条件满足则输出1,否则输出0。为了简化,我们定义:

L = M_{nat} - M_{man} + m\sqrt{D}

然后,SCL损失函数对第 i 个样本的特征嵌入和中心点的导数可以计算如下:

\frac{\partial L_{sc}}{\partial f_i} = \begin{cases} \frac{f_i - C}{s \cdot \| f_i - C \|_2} \left(1 + 1[L > 0]\right), & \text{if } y_i = 0 \\ -\frac{f_i - C}{t\cdot \| f_i - C \|_2} \left(1[L > 0]\right), & \text{if } y_i = 1 \end{cases}

\frac{\partial L_{sc}}{\partial C} = -\frac{1}{s} \sum_{i \in \Omega _{nat}} \frac{f_i - C}{\| f_i - C \|_2} \left(1 + 1[L > 0]\right) +\frac{1}{t} \sum_{i \in \Omega _{man}} \frac{f_i - C}{\| f_i - C \|_2} \left(1[L > 0]\right)

3.3.3 结合softmax损失

SCL的参数化中心是随机初始化的,并且基于小批量更新,而不是整个数据集,这可能导致训练不稳定。因此,我们引入了softmax损失,通过全局信息来指导中心点的更新。此外,softmax损失专注于将样本映射到离散标签,而我们的SCL旨在直接应用度量学习来处理学习到的嵌入。结合这两种损失有助于获得更具判别性的嵌入。总损失可以写为:

L_{\text{total}} = L_{\text{softmax}} +\lambda L_{sc}

其中,\lambda 是控制SCL和softmax损失之间权衡的超参数。

 


http://www.kler.cn/a/529306.html

相关文章:

  • 「Unity3D」在Unity中使用C#控制显示Android的状态栏
  • vim的特殊模式-可视化模式
  • 网件r7000刷回原厂固件合集测评
  • Qt调用FFmpeg库实时播放UDP组播视频流
  • C++ Primer 自定义数据结构
  • 【题解】AtCoder Beginner Contest ABC391 D Gravity
  • PostgreSQL 数据库视图基础操作
  • tf.Keras (tf-1.15)使用记录1-基础模型创建的两种方法
  • 【股票数据API接口48】如何获取股票最新分时BOLL数据之Python、Java等多种主流语言实例代码演示通过股票数据接口获取数据
  • 【Python】理解Python中的协程和生成器:从yield到async
  • PostgreSQL 数据库备份与还原
  • 如何使用SliverList组件
  • 数据分析系列--⑨RapidMiner训练集、测试集、验证集划分
  • 拉格朗日定理
  • C++编程语言:抽象机制:模板(Bjarne Stroustrup)
  • 【网站建设:HTTPS - 如何生成免费SSL证书,并自动更新】
  • 【自开发工具介绍】SQLSERVER的ImpDp和ExpDp工具01
  • RabbitMQ持久化队列配置修改问题
  • python-leetcode-二叉搜索树迭代器
  • 基于微信小程序的酒店管理系统设计与实现(源码+数据库+文档)
  • maven构件子模块步骤及注意事项
  • w185客户关系管理系统
  • AIGC技术中常提到的 “嵌入转换到同一个向量空间中”该如何理解
  • Golang 应用的 Docker 部署方式介绍及使用详解
  • 深入解析JMeter源码:AbstractThreadGroupGui抽象类的实现机制与设计哲学
  • MySQL 基础学习(5):数据库约束