感受野
感受野(Receptive Field)是指特征图上的某个点能看到的输入图像的区域,即特征图上的点是由出入图像中感受野大小区域的计算得到的。举个简单的例子,如下图所示为一个三层卷积网络,每一层的卷积核为33,步长为1,可以看到第一层对应的感受野是33,第二层是55,第三层则是77
卷积层和池化层都会影响感受野,而激活函数层通常对感受野没有影响。对于一般的卷积神经网络,感受野可由下面的两个公式计算得出:
其中RF_l+1与RF_l分别代表第l+1层与第l层的感受野,k代表第l+1层卷积核的大小,S_l代表前l层的步长之积。注意:当前层的步长并不影响当前层的感受野
通过上述公式求取出的感受野通常很大,而实际的有效感受野(Effective Receptive Field)往往小于理论感受野。从图中也可以看出,虽然第三层的感受野是7*7,但是输入层中边缘点的使用次数明显比中间点要少,因此做出的贡献不同,经过多层的卷积堆叠之后,输入层对于特征图点做出的贡献分布呈高斯分布情况
理解感受野是理解卷积神经网络工作的基础,尤其是对于使用Anchor作为强先体验区域物体检测算法,如Faster RCNN和SSD,如何设置Anchor的大小,Anchor应该对应在特征图的哪一层,都应当考虑感受野。通常来讲,Anchor的大小应该与感受野相匹配,尤其是有效的感受野,过大或过小都不好
在卷积网络中,有时还需要计算特征图的大小,一般可以按照下式进行计算:
其中,n_in与n_out分别为输入特征图与输出特征图的尺寸,p代表这一层的padding大小,k代表这一层的卷积核大小,s为步长
空洞卷积(Dilated Convolution)
空洞卷积最初始为解决图像分割的问题而提出的。常见的图像分割算法通常使用池化层来增大感受野,同时也缩小了特征图尺寸,然后再利用上采样还原图像尺寸。特征图缩小再放大的过程造成了精度上的损失,因此需要有一种操作可以在增加感受野的同时保持特征图的尺寸不变,从而替代池化与上采样操作,在这种需求下,空洞卷积就诞生了
近几年的物体检测发展中,空洞卷积也发挥了重要的作用。因为虽然物体检测不要求逐像素地检测,但是保持特征图的尺寸大小,对于小物体的检测及物体的定位来说也是至关重要的
空洞卷积,顾名思义就是卷积核中带有一些洞,跳过一些元素进行卷积。在此以33卷积为例,其中第一张图是普通的卷积过程,在卷积核紧密排列在特征图上滑动计算,而第二张图代表了空洞数为2的空洞卷积,可以看到,在特征图上每2行或者2列选取元素与卷积核卷积。类似的,第三张图代表了空洞数为3的空洞卷积:
在代码实现时,空洞卷积有一个额外的超参数dilation rate,表示空洞数,普通卷积dilation rate默认为1,上图中的2与3的dilation rate分别为2与3
在上图中,同样的一个33卷积,却可以起到55、77的卷积的效果。可以看出,空洞卷积在不增加参数量的前提下,增大了感受野。假设空洞卷积的卷积核大小为k,空洞数为d,则其等效卷积核大小k’计算如下式所表示:
在计算感受野时,只需要将原来的卷积核大小更换为k’即可
空洞卷积的有点显而易见,在不引入额外参数的前提下可以任意扩大感受野,同时保持特征图的分辨率不变。这一点在分割与检测任务中十分有用,感受野的扩大可以检测大物体,而特征图分辨率不变使得物体定位更加准确
PyTorch对于空洞卷积也提供了方便的实现接口,在卷积时传入dilation参数即可:
>>> from torch import nn
>>> #定义普通卷积,默认dilation为1
>>> conv1 = nn.Conv2d(3,256,3,stride=1,padding=1,dilation=1)
>>> conv1
Conv2d(3, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
>>> #定义dilation为2的卷积,打印卷积后会有dilation参数
>>> conv2 = nn.Conv2d(3,256,3,stride=1,padding=1,dilation=2)
>>> conv2
Conv2d(3, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), dilation=(2, 2))
当然,空洞卷积也有自己的一些缺陷,主要变现在以下3个方面:
- 网格效应(Gridding Effect):由于空洞卷积是一种稀疏的采样方式,当多个空洞卷积叠加时,有些像素根本没有被利用到,会损失信息的连续性与相关性,进而影响分割、检测等要求较高的任务
- 远距离的信息没有相关性:空洞卷积采取了稀疏的采样方式,导致远距离卷积得到的结果之间缺乏相关性,进而影响分类的结果
- 不同尺度物体的关系:大的dilation rate对于大物体分割与检测有利,但是对于小物体则有弊无利,如何处理好多尺度问题的检测,是空洞卷积设计的重点
对于上述问题,有多篇文章提出了不同的解决方法,典型的有图森未来提出的HDC(Hybrid Dilated Convolution)结构。该结构的设计准则是堆叠卷积的dilation rate不能有大于1的公约数,将dilation rate设置为类似于[1,2,5,1,2,5]这样的锯齿类结构。此外dilation rate之间还需要满足一个数学公式,这样可以尽可能地覆盖所有空洞,以解决网络效应与远距离信息的相关问题