【形形色色的卷积】差分卷积

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. 参考

差分卷积在计算机视觉中的应用

猜你喜欢

转载自blog.csdn.net/zxdd2018/article/details/130914307