文章目录
- 0. 前言
- 1. 中心差分卷积
- 2. 像素差分卷积
- 3. 参考
0. 前言
普通卷积不能显式地提取图像的梯度信息,因此不能较好地描述细粒度的纹理信息,在人脸活体检测、边缘检测等对细粒度纹理信息敏感的任务中难以取得理想的结果。针对上述问题,Oulu大学的研究者们提出了一系列差分卷积,在人脸活体检测和边缘检测等任务中取得了很好的效果。
1. 中心差分卷积
论文:Searching central difference convolutional networks for face anti-spoofing
代码:https://github.com/ZitongYu/CDCN/blob/master/CVPR2020_paper_codes/models/CDCNs.py
Vanilla卷积通常直接聚合局部intensity-level的信息,故 1)容易受到外界光照等因素的影响;2)比较难表征细粒度的特征。在人脸活体检测任务中,前者容易导致模型的泛化能力较弱,如在未知的光照环境下测试性能较低;后者会导致难以学到防伪本质的细节信息,如spoof的材质。考虑到空间差分特征具有较强光照不变性,同时也包含更细粒度的spoof线索(如栅格效应,屏幕反射等),借鉴传统LBP的差分思想,我们提出了中心差分卷积(Central difference convolution, CDC)。
从上图中可以看出中心差分卷积的流程,分为Sampling和Aggregation两步。其中,Sampling是在输入特征图中采样一个patch(尺寸与卷积kernel一致),Aggregation是将patch中的每个元素减去中心元素(与LBP中的差分类似),然后经过普通卷积得到输出。
用公式描述如下:
对于普通卷积
:
对于中心差分卷积
:
其中,
p
0
p_0
p0表示中心元素位置,
p
n
p_n
pn表示
p
0
p_0
p0的邻域,若卷积尺寸为3×3,那么
p
n
p_n
pn为八邻域。为了同时利用Vanilla卷积提取indensity-level和中心差分卷积提取gradient-level信息,引入了参数
θ
∈
[
0
,
1
]
\theta \in[0,1]
θ∈[0,1]作为控制两者重要性程度的权重,
θ
\theta
θ越大表示中心差分卷积的贡献越大。
作者大大也贴心地开源了代码:
class Conv2d_cd(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_cd, self).__init__()
self.conv = nn.Conv2d(in_channels, out_channels, kernel_size=kernel_size, stride=stride, padding=padding, dilation=dilation, groups=groups, bias=bias)
self.theta = theta
def forward(self, x):
out_normal = self.conv(x)
if math.fabs(self.theta - 0.0) < 1e-8:
return out_normal
else:
#pdb.set_trace()
[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
中心差分卷积在实现时将激活值的差分转换为了3×3卷积和1×1卷积的差值,这个转换在下面介绍的像素差分卷积中进行了详细地推导。另外值得一提的是,3×3卷积和1×1卷积差值的这种形式可以在推理时重参数化为单个3×3卷积。(重参数化参考丁霄汉博士的RepVGG和DBB)
2. 像素差分卷积
论文:Pixel Difference Networks for Efficient Edge Detection
代码:https://github.com/hellozhuo/pidinet
在边缘检测中,如下图(a)所示,经典的传统操作子(如Roberts, Sobel和LoG)都采用差分信息来表征边缘上下文的突变及细节特征。但是这些基于手工传统算子的模型往往局限于它的浅层表征能力。另外一方面, CNN通过卷积的深层堆叠,能够有效地捕捉图像的语义特征。在此过程中,卷积核扮演了捕捉局部图像模式的作用。 而如下图(b)所示,VanillaCNN在对卷积核的初始化过程中并没有显式的梯度编码限制,使其在训练过程中很难聚焦对图像梯度信息的提取,从而影响了边缘预测的精度。
使用像素差分卷积后,gradient信息的增强有利于更精确的边缘检测。值得一提的是,在笔者的项目中,使用差分卷积代替vanilla卷积后,可视化特征图时也发现细粒度的纹理信息明显增多,网络的细节恢复能力也得到了较大的提升。
作者在论文中提出了3种形式的像素差分卷积:
① CPDC:等价于中心差分卷积
② APDC:对邻域特征进行顺时针的两两差分
③ RPDC:在5×5的感受野范围内,对外环和内环进行差分
最后,论文中给出了将各种形式的差分卷积转换为vanilla卷积的推导。
对于CPDC:
对于APDC:
对于RPDC:
3. 参考
差分卷积在计算机视觉中的应用