DC-CDN学习笔记

论文题目:Dual-Cross Central Difference Network for Face Anti-Spoofing

论文地址:https://arxiv.org/pdf/2105.01290.pdf

代码地址:GitHub – ZitongYu/CDCN: Central Difference Convolutional Networks (CVPR’20)

研究意义

人脸识别技术以其便捷性和准确性在许多交互式智能系统中得到广泛应用。然而,人脸识别系统仍然容易受到包括打印、视频和 3D mask 在内的演示攻击 (PA)。因此,学术界和工业界都认识到人脸反欺骗(FAS)对于保护人脸识别系统的关键作用。

FAS 任务中的一个关键挑战是如何使用有限的数据来学习特征表示,因为现有的 FAS 数据集由于欺骗生成和视频记录的高收集成本而没有大量的训练数据。虽然通用的数据增强方式能够扩大数据集的规模和多样性,但它仍然没有对性能提升做出太大贡献。因此,值得重新思考 FAS 的增强和设计任务专用的增强范式。

本文主要贡献

(1)设计了一个称为交叉中心差分卷积 (C-CDC) 的稀疏卷积算子,它将 CDC 分别解耦为两个交叉(即水平/垂直 (HV) 和对角线 (DG))方向的卷积,用于挖掘相互关系和增强局部细节表示,且计算成本也降低了。

(2)提出了 FAS 专用的数据增强方法 Patch Exchanges (PE),用于合成具有不同攻击和域的混合样本,它能够在 DC-CDN 和现有 FAS 方法中即插即用。

DC-CDN学习笔记

CDC

引入了中心梯度特征来增强表示和提升泛化能力,可表示为:

DC-CDN学习笔记

其中,R 为感受野区域,

DC-CDN学习笔记 为感受野区域内各像素点相对于中心像素点的偏移量,如 (−1, −1),(−1, 0), · · · ,(0, 1),(1, 1)。

DC-CDN学习笔记

其中,

DC-CDN学习笔记 用来平衡标准卷积与 CDC 提供信息的比例。

C-CDC

从上式可以发现,CDC 聚合了整个局部相邻区域 R 的标准特征和中心梯度特征,这可能是冗余且难以优化的。作者因此提出了稀疏跨中心差分卷积 (C-CDC) 系列,旨在学习更集中和内在的特征表示。与 CDC 相比,C-CDC 倾向于在局部区域内进行稀疏采样,公式如下:

DC-CDN学习笔记

具体来说,作者将 R 解耦为两个交叉相邻区域 (HV 与 DG),其中,

DC-CDN学习笔记 = {(−1, 0),(0, −1),(0, 0),(0, 1),(1, 0)},DC-CDN学习笔记 = {(−1, −1),(−1, 1),(0, 0),(1, −1),(1, 1)}。此外,这种解耦方式有利于模型收敛和获取鲁棒特征表示。

DC-CDN学习笔记

代码如下:

(1)C-CDC(HV)

class Conv2d_Hori_Veri_Cross(nn.Module):
    def __init__(self, in_channels, out_channels, kernel_size=3, stride=1,
                 padding=1, dilation=1, groups=1, bias=False, theta=0.7):

        super(Conv2d_Hori_Veri_Cross, self).__init__()
        self.conv = nn.Conv2d(in_channels, out_channels, kernel_size=(1, 5), stride=stride, padding=padding, dilation=dilation, groups=groups, bias=bias)
        self.theta = theta

    def forward(self, x):

        [C_out,C_in,H_k,W_k] = self.conv.weight.shape
        tensor_zeros = torch.FloatTensor(C_out, C_in, 1).fill_(0).cuda()
        conv_weight = torch.cat((tensor_zeros, self.conv.weight[:,:,:,0], tensor_zeros, self.conv.weight[:,:,:,1], self.conv.weight[:,:,:,2], self.conv.weight[:,:,:,3], tensor_zeros, self.conv.weight[:,:,:,4], tensor_zeros), 2)
        conv_weight = conv_weight.contiguous().view(C_out, C_in, 3, 3)

        out_normal = F.conv2d(input=x, weight=conv_weight, bias=self.conv.bias, stride=self.conv.stride, padding=self.conv.padding)

        if math.fabs(self.theta - 0.0) < 1e-8:
            return out_normal
        else:
            [C_out,C_in, kernel_size,kernel_size] = self.conv.weight.shape
            kernel_diff = self.conv.weight.sum(2).sum(2)
            kernel_diff = kernel_diff[:, :, None, None]
            out_diff = F.conv2d(input=x, weight=kernel_diff, bias=self.conv.bias, stride=self.conv.stride, padding=0, groups=self.conv.groups)

            return out_normal - self.theta * out_diff

(2)C-CDC(DG)

class Conv2d_Diag_Cross(nn.Module):
    def __init__(self, in_channels, out_channels, kernel_size=3, stride=1,
                 padding=1, dilation=1, groups=1, bias=False, theta=0.7):

        super(Conv2d_Diag_Cross, self).__init__()
        self.conv = nn.Conv2d(in_channels, out_channels, kernel_size=(1, 5), stride=stride, padding=padding, dilation=dilation, groups=groups, bias=bias)
        self.theta = theta

    def forward(self, x):

        [C_out,C_in,H_k,W_k] = self.conv.weight.shape
        tensor_zeros = torch.FloatTensor(C_out, C_in, 1).fill_(0).cuda()
        conv_weight = torch.cat((self.conv.weight[:,:,:,0], tensor_zeros, self.conv.weight[:,:,:,1], tensor_zeros, self.conv.weight[:,:,:,2], tensor_zeros, self.conv.weight[:,:,:,3], tensor_zeros, self.conv.weight[:,:,:,4]), 2)
        conv_weight = conv_weight.contiguous().view(C_out, C_in, 3, 3)

        out_normal = F.conv2d(input=x, weight=conv_weight, bias=self.conv.bias, stride=self.conv.stride, padding=self.conv.padding)

        if math.fabs(self.theta - 0.0) < 1e-8:
            return out_normal
        else:
            [C_out,C_in, kernel_size,kernel_size] = self.conv.weight.shape
            kernel_diff = self.conv.weight.sum(2).sum(2)
            kernel_diff = kernel_diff[:, :, None, None]
            out_diff = F.conv2d(input=x, weight=kernel_diff, bias=self.conv.bias, stride=self.conv.stride, padding=0, groups=self.conv.groups)

            return out_normal - self.theta * out_diff

DC-CDN

基于伪深度图的监督利用真假人脸的 3D 形状来进行区分,该监督方式能够提供逐像素的详细线索来强制 FAS 模型捕获内在特征。给定大小为 3256256 的单张 RGB 人脸图像,提取多级融合特征用于预测大小为 32*32 的人脸深度图。 C-CDN的详细信息如下表:

DC-CDN学习笔记

尽管 C-CDC 解耦并学习具有特定视图的局部梯度特征,但与 CDC 相比,它仍然存在信息丢失的问题。 为了充分利用局部特征并在 HV 和 DG 视图之间进行交互,提出了一种双交叉中心差分网络 (DC-CDN),如下图所示。

DC-CDN学习笔记

CFIM

为了有效挖掘双流(HV与DG)之间的关系并增强局部详细表示能力,提出了交叉特征交互模块(CFIM)自适应地融合双流多级特征,公式如下:

DC-CDN学习笔记

其中,

DC-CDN学习笔记 为sigmoid激活函数;DC-CDN学习笔记DC-CDN学习笔记 都是可学习的参数,分别表示对应 DC-CDN学习笔记DC-CDN学习笔记 的注意力权值,在训练迭代期间自适应调整。部分代码如下:
self.HP_branch1 = Parameter(torch.zeros([3,1]))
self.HP_branch2 = Parameter(torch.zeros([3,1]))

fusion1
x_Block1_new = F.sigmoid(self.HP_branch1[0])*x_Block1 + (1-F.sigmoid(self.HP_branch1[0]))*x_Block1_2
x_Block1_2_new = F.sigmoid(self.HP_branch2[0])*x_Block1_2 + (1-F.sigmoid(self.HP_branch2[0]))*x_Block1

fusion2
x_Block2_new = F.sigmoid(self.HP_branch1[1])*x_Block2 + (1-F.sigmoid(self.HP_branch1[1]))*x_Block2_2
x_Block2_2_new = F.sigmoid(self.HP_branch2[1])*x_Block2_2 + (1-F.sigmoid(self.HP_branch2[1]))*x_Block2

fusion3
x_Block3_new = F.sigmoid(self.HP_branch1[2])*x_Block3 + (1-F.sigmoid(self.HP_branch1[2]))*x_Block3_2
x_Block3_2_new = F.sigmoid(self.HP_branch2[2])*x_Block3_2 + (1-F.sigmoid(self.HP_branch2[2]))*x_Block3

PE

由于欺骗攻击收集成本高,公共 FAS 数据集的数据大小和多样性有限。 因此作者还提出了一种名为 Patch Exchanges (PE) 的 FAS 专用数据增强方法,用于合成具有不同攻击和域的混合样本。 PE 增强有三个优点:(1)引入来自不同领域(例如,记录的场景、传感器和主题)的人脸 patch,以丰富数据分布;(2) 随机补丁交换以模拟任意形式攻击;(3)具有相应密集标签的交换补丁将强制模型学习更详细和内在的特征以进行欺骗检测。伪代码如下:

DC-CDN学习笔记

损失函数

L = 均方误差 (MSE) + 对比深度损失 (CDL)

实验

下表为 OULU-NPU 数据集上的实验结果:

DC-CDN学习笔记

下表为 SiW-M 数据集上的实验结果:

DC-CDN学习笔记

下表为CASIA-MFSD 和 Replay-Attack 之间的跨数据集测试结果:

DC-CDN学习笔记

结论

作者提出了两个跨中心差分卷积(C-CDC,基于这两个解耦的C-CDC,建立了一个强大的双交叉中心差分网络(DC-CDN)和交叉特征交互模块(CFIM),用于相互关系挖掘和局部细节表示增强。此外,通过简单地从随机样本中交换面部补丁及其密集标签,提出了一种新的 FAS 补丁交换 (PE) 增强策略,这有利于内在和鲁棒的特征学习。

Original: https://blog.csdn.net/qq_38964360/article/details/125902462
Author: Cassiel_cx
Title: DC-CDN学习笔记

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/686912/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球