当前位置:网站首页>DC-CDN学习笔记
DC-CDN学习笔记
2022-07-31 05:15:00 【Cassiel_cx】
论文题目: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 方法中即插即用。
CDC
引入了中心梯度特征来增强表示和提升泛化能力,可表示为:
其中,R 为感受野区域, 为感受野区域内各像素点相对于中心像素点的偏移量,如 (−1, −1),(−1, 0), · · · ,(0, 1),(1, 1)。
其中, 用来平衡标准卷积与 CDC 提供信息的比例。
C-CDC
从上式可以发现,CDC 聚合了整个局部相邻区域 R 的标准特征和中心梯度特征,这可能是冗余且难以优化的。作者因此提出了稀疏跨中心差分卷积 (C-CDC) 系列,旨在学习更集中和内在的特征表示。与 CDC 相比,C-CDC 倾向于在局部区域内进行稀疏采样,公式如下:
具体来说,作者将 R 解耦为两个交叉相邻区域 (HV 与 DG),其中, = {(−1, 0),(0, −1),(0, 0),(0, 1),(1, 0)},
= {(−1, −1),(−1, 1),(0, 0),(1, −1),(1, 1)}。此外,这种解耦方式有利于模型收敛和获取鲁棒特征表示。
代码如下:
(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 模型捕获内在特征。给定大小为 3*256*256 的单张 RGB 人脸图像,提取多级融合特征用于预测大小为 32*32 的人脸深度图。 C-CDN的详细信息如下表:
尽管 C-CDC 解耦并学习具有特定视图的局部梯度特征,但与 CDC 相比,它仍然存在信息丢失的问题。 为了充分利用局部特征并在 HV 和 DG 视图之间进行交互,提出了一种双交叉中心差分网络 (DC-CDN),如下图所示。
CFIM
为了有效挖掘双流(HV与DG)之间的关系并增强局部详细表示能力,提出了交叉特征交互模块(CFIM)自适应地融合双流多级特征,公式如下:
其中, 为sigmoid激活函数;
、
都是可学习的参数,分别表示对应
与
的注意力权值,在训练迭代期间自适应调整。部分代码如下:
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)具有相应密集标签的交换补丁将强制模型学习更详细和内在的特征以进行欺骗检测。伪代码如下:
损失函数
L = 均方误差 (MSE) + 对比深度损失 (CDL)
实验
下表为 OULU-NPU 数据集上的实验结果:
下表为 SiW-M 数据集上的实验结果:
下表为CASIA-MFSD 和 Replay-Attack 之间的跨数据集测试结果:
结论
作者提出了两个跨中心差分卷积(C-CDC,基于这两个解耦的C-CDC,建立了一个强大的双交叉中心差分网络(DC-CDN)和交叉特征交互模块(CFIM),用于相互关系挖掘和局部细节表示增强。此外,通过简单地从随机样本中交换面部补丁及其密集标签,提出了一种新的 FAS 补丁交换 (PE) 增强策略,这有利于内在和鲁棒的特征学习。
边栏推荐
猜你喜欢
随机推荐
[uiautomation] Get WeChat friend list (stored in txt)
Powershell中UTF-8环境中文乱码解决办法
unicloud 发布后小程序提示连接本地调试服务失败,请检查客户端是否和主机在同一局域网下
understand js operators
sql 外键约束【表关系绑定】
使用ps | egrep时过滤排除掉egrep自身
VS通过ODBC连接MYSQL(一)
The server time zone value ‘й‘ is unrecognized or represents more than one time zone
VS connects to MYSQL through ODBC (1)
SSH自动重连脚本
场效应管 | N-mos内部结构详解
cocos2d-x-3.2创建项目方法
MySQL高级学习笔记
Artifact SSMwar exploded Error deploying artifact.See server log for details
UiBot存在已打开的MicrosoftEdge浏览器,无法执行安装
MySQL高级SQL语句(二)
configure:error no SDL library found
Understanding SSRF, this article is enough
【云原生】开源数据分析 SPL 轻松应对 T+0
[Cloud native] Ribbon is no longer used at the bottom layer of OpenFeign starting from the 2020.0.X version