交叉熵损失CrossEntropyLoss

交叉熵损失鼓励模型对同一类别提取相似特征。这可能有助于对Imagenet或cityscape等数据集进行分类或分割,在这些数据集中,相同类别的对象应该具有类似的特征。然而,在图像伪造定位中,由于不同的操作会在被篡改区域留下不同的伪造足迹,因此对数据集中所有被篡改区域提取相似的特征并不是最优的。因此,在没有附加约束的情况下,一个常见的基于交叉熵损失的框架容易对特定的伪造模式进行过拟合,这不利于泛化。

import torch.nn as nn
criterion = nn.CrossEntropyLoss(weight = imbalance_weight)
loss = criterion(pred, tar.long().detach())

块对比损失PatchContrastLoss

来自于CFL-Net

  我们首先将 $ F∈R^{256×H×W} $ 在空间上划分为k×k个块,从而得到 $ f_iR^{256hw} $ ,其中 $ i{1,2,3…k^2} $ 、 $ h= $ 和 $ w= $ 。然后,我们取每个局部区域中像素嵌入的平均值。从而使每个 $ f_i $ 都变成了 $ R^{256} $ 的形状。以类似的方式,我们将地面真实掩模M划分为k×k个块。Mask在未被篡改区域的值为0,在伪造区域的值为1。我们得到 $ m_iR^{hw} $ ,其中 $ i{1,2,3…k^2} $ 、 $ h= $ 和 $ w= $ 。为了得到每个 $ m_i $ 的标签值,我们计算了h×w个块中的0和1的数量。然后,我们指定块中的最大值为 $ m_i $ 的值。

  然后,我们有了像素嵌入 $ f_i $ 和每个嵌入 $ m_i $ 的相应标签。我们现在得到监督对比损失: \[L_i=\frac{1}{|A_i|}\sum_{k\in A_i}-log(\frac{exp(f_i\cdot k^+/ \tau)}{exp(f_i\cdot k^+/ \tau)+\sum_{k^-}exp(f_i\cdot k^-/ \tau)})\]   其中, $ A_i $ 表示与 $ f_i $ 具有相同标签的所有其他像素嵌入 $ k^+ $ 的集合。类似地, $ k^− $ 是所有与 $ f_i $ 有不同标签的负像素嵌入。损失函数中的所有嵌入都是 $ L_2 $ 归一化的。对于单个图像样本,我们通过对所有嵌入的平均得到最终的对比损失: \[L_{CON}=\frac{1}{k^2}\sum_{i\in k^2}L_i\]

CFL-Net-contrast-loss.drawio

InfoNCE对比损失

​  FOCAL 的训练过程如图3 (b)所示:

image-20240518144850862

​  一旦我们从给定的输入X中提取高级特征F,我们就通过像素级对比学习直接监督F。地面真实伪造掩模Y自然为我们提供了正和消极类别的索引,使有效的像素级对比学习。正如很快就会更清晰的那样,焦点的对比学习以逐图像的方式进行监督,这与现有的对整个正向小批执行监督的算法[19,6,15,54,56]有很大的不同。

​  具体来说,我们采用了一种改进的InfoNCE损失[16,35]来实现焦点中的对比学习。

​  我们首先通过执行一个扁平化操作来构造一个字典 $ f( \cdot ) : { \mathbb {R}}^{ \hat{H} \times \hat{W} \times \hat{C}} \rightarrow { \mathbb{R}}^{ \hat{H} \hat{W} \times \hat{C}} $ \[f(F) \rightarrow \{ q , k^+_1 , k^+_2 , ..., k^+_J , k^-_1 , k^-_2 , ..., k^-_K \}\] ​  其中, $ { q , k^+_1 , k^+_2 , ..., k^+_J , k^-_1 , k^-_2 , ..., k^-_K } $ 被定义为字典,q是一个编码查询。我们让 $ { q , k^+_1 , k^+_2 , ..., k^+_J } $ 表示属于原始区域的特征(以Y中的0为索引),而 $ { k^-_1 , k^-_2 , ..., k^-_K } $ 表示伪造区域的特征(以Y中的1索引)。

​  在图像伪造检测任务中,伪造或原始区域通常覆盖超过1像素(特征)的区域,这意味着字典中正键J的数量也远远大于1。然后,根据图像伪造任务而定制的改进的信息损失可以计算为 \[{\cal {L}}_{InfoNCE++}=-log \frac { \frac 1 J \sum _{ j \in [1,J] } exp(q \cdot k^+_J / \tau ) } { \sum _{ i \in [1,K] } exp(q \cdot k^+_i / \tau ) }\] ​  其中, $ $ 是一个温度超参数[51]。注意,在原始的InfoNCE loss [16,35]中,字典中只有一个q匹配的正键。在我们改进的InfoNCE损失(2)中,我们通过取q的 $ { k^+_j } $ 的期望,在每个损失计算中涉及所有的正键。这将促进优化过程。

​  需要强调的是,训练阶段的监督是直接在地面真实伪造掩模Y和提取的特征F之间进行的,而没有生成预测的伪造掩模。

​  此外,对于前向小批量中的每一幅图像, $ { \cal {L}} _ { InfoNCE++ } $ 以逐图像的方式(one-by-one)计算,而不是对整个批量进行计算,然后求和计算总体损失。更具体地说,给定一个小批特征 $ {F_1、F_2、···、F_B} $ ,总体对比损失 $ { \cal {L}} _ { ct } $ : \[{\cal {L}}_{ct}=\frac {1} {B} \sum _{b=1} ^{B} ({\cal {L}}_{InfoNCE++}(F_b))\] ​  请注意,在上述(3)式中,没有合并小批特征来计算整体的 $ { \cal {L}}_{InfoNCE++} $ ,避免了训练数据的交叉图像影响。在伪造/原始像素的相对定义的指导下设计的总损失与[5,15,16,32]中的损失有很大的不同,[5,15,16,32]中的损失计算是在批处理级别进行的。

​  为了进一步证明(3)的合理性,我们在图4中绘制了传统的基于批处理和我们的逐图像图像的对比损失曲线。
image-20240518153103103

​  可以清楚地看到,损失函数(橙色线)的逐图像设计不仅使收敛速度更快,而且使优化更加稳定。特别是,在蓝线中检测到的高振幅脉冲表明相关的图像中可能存在严重的冲突,例如,类似于图2 (a)和(b)的情况,其中出现冲突的标签。

image-20240519102823673