Rethinking the Up-Sampling Operations in CNN-based Generative Network for Generalizable Deepfake Detection cvpr2024
activation
之前的论文考虑上采样时,通常使用频率方面的角度,由上采样产生的全局伪影作为forgery artifacts,但泛化性有限,作者考虑是否可以用像素间的局部相互依赖作为artifacts进行检测。
method
由于生成器的上采样过程,局部像素表现出很强的关系。例如,使用最近邻插值会导致局部 2×2 像素共享相同值。在上采样操作之后,通过卷积层进一步处理缩放的特征以生成图像。在此过程中,通过结合上采样操作和 CNN 层的平移不变性,在局部像素之间建立关系。并且GAN和diffusion在生成图片的过程中都会进行上采样
但是考虑到上采样产生的GANs频域的不同模式,基于频率的artifacts不足以实现泛化检测。作者通过分析接近输出层的上采样层和卷积层,当我们将卷积后的特征以为2拆分为许多个2X2的小patch后进行分析,可以发现这两层主要有三个特点:1)同一个patch内像素值是强相关的。2)卷积在推理阶段是固定的。3)卷积具有平移不变性。因此,每一个patch内都有元素相关性。作者通过这种每一个patch内的局部相关性作为artifacts。作者提取每个patch内的artifacts方式如下:
假设上采样前经过上采样层,上采样倍得到,之后将分为个的小块,即,最后使用减法提取内的相对关系:
在本文中,作者主要将和取为2和1。
其实作者公布的源码上非常简单巧妙。
ResNet(nn.Module)::
def __init__():
...
def interpolate(self, img, factor):
return F.interpolate(F.interpolate(img, scale_factor=factor, mode='nearest', recompute_scale_factor=True), scale_factor=1/factor, mode='nearest', recompute_scale_factor=True)
def forward(self, x) :
NPR = x - self.interpolate(x, 0.5)
x = self.conv1(NPR*2.0/3.0)
# 接下来和做的和ResNet一样,论文里好像没说为啥要*2/3,可能是为了增强这种关系吧