文章目录
Dilated convolution 膨胀卷积
(Atrous convolution 空洞卷积)
膨胀卷积的计算
正常卷积的计算:
膨胀卷积的计算:
-
在膨胀卷积中,引入了一个新的变量 r r r, r r r 表示膨胀因子(dilation rate)
在上图中, r r r=2,也就是读取特征图的像素点的距离为2
如果 r r r=1,那么读取的像素点距离为1,即直接读取相邻的像素点,也就是正常的卷积操作。
-
在上图中,如果我们将 padding设置为1,那么经过膨胀卷积的特征图的高宽会保持不变。
Why Dilated Convolution ?
在语义分割任务中,我们通常使用图像分类网络作为backbone。在backbone中,图片往往会经过一系列的下采样。这时,我们需要再经过上采样操作,将特征图还原成原图的大小。
但是,如果下采样倍率过大的话,会对我们上采样还原特征图造成影响。
以VGG16网络为例,经过最大池化下采样层后,图片会被下采样32倍,此时,有可能会丢失图像的一些细节信息以及比较小的目标。但是,丢失的细节信息和小目标是无法通过上采样操作进行还原的,这会影响语义分割任务的效果。
如果直接去掉最大池化下采样层,会导致特征图的感受野变小。
膨胀卷积(Dilated Convolution)的优势就在于:
- 既能增大感受野
- 还能保持原输入特征图W、H
Gridding Effect
gridding effect主要是针对膨胀卷积对感受野的影响;所以,我们有必要先对感受野进行一个简单的介绍:
感受野
感受野(Receptive Field) 是指特征图上的某个点能看到的输入图像的区域。换句话说,特征图上的每个点对应于输入图像中的一个区域,这个区域的大小就是感受野。
感受野的计算公式 :
初始层的感受野 = 1
当前层感受野 = 上一层感受野 + (卷积核大小 - 1) × 步长
若输入图像的尺寸大小是5x5,经过两次3x3的卷积核(其中stride=1,padding=0)后,其感受野大小为5*5,如下图所示:
在上图中,初始的输入图片大小为5x5,经过一个3x3的卷积核后,特征图大小变为(5-3+2x0)/1+1 = 3;
再经过一个3x3的卷积核后,特征图大小变为(3-3+2x0)/1+1 = 1;
由此,我们可知,一个5x5的图片经过两个3x3的卷积核(其中stride=1,padding=0)后,会变为1个pixel;反过来思考,这个pixel的感受野就是5x5。
我们再使用感受野的计算公式来验证一下:
第一层感受野 = 1
第二层感受野 = 1 + (3-1)x1 = 3
最后的pixel的感受野 = 3 + (3-1)x1 = 5
Gridding effect 的具体内容
对于一个特征图,我们采用3个大小都为3x3,膨胀因子为2的膨胀卷积层:
膨胀卷积和普通卷积在感受野的处理上会有些许不同,此处的正向推导对于我来说比较困难,所以我从Layer 1 来倒推:
Layer 1的图片大小为13x13,再经过一个3x3,膨胀因子为2的膨胀卷积层后,得到特征图Layer 2,大小变为9x9:
Layer 2的图片大小为9x9,再经过一个3x3,膨胀因子为2的膨胀卷积层后,得到特征图Layer 3,大小变为5x5:
Layer 3的图片大小为9x9,再经过一个3x3,膨胀因子为2的膨胀卷积层后,得到特征图Layer,大小变为1x1,也就是一个像素点(pixel)
综上可得,在3个大小都为3x3,膨胀因子为2的膨胀卷积设计中,图像的感受野为13x13。
但观察Layer 1,我们会发现13x13的方阵中,有很多点都没有被计算过(每个方格里的数字表示改像素点被计算的次数),说明图像中的很多信息都被卷积网络忽略了,这会影响分割的效果。
但保持膨胀卷积大小不变,适当改变膨胀系数;我们可以在不减小感受野的前提下,避免图像中像素点被忽略的问题。
在下一部分中,我们会从一篇论文中,学习具体的解决gridding effect的方法
解决gridding effect的方法
在论文 [Understanding Convolution for Semantic Segmentation]中,作者提供了一些解决gridding effect的方法和注意事项:
Hybrid Dilated Convolution (HDC)
-
作者将 ‘maximum distance between tow nonzero values’ 两个非零值间的最大距离定义为 :
M i = m a x [ M i + 1 − 2 r i , M i + 1 − 2 ( M i + 1 − r i ) , r i ] M_i = \mathop {max}[M_{i+1}-2r_i, M_{i+1}-2(M_{i+1}-r_i), r_i] Mi=max[Mi+1−2ri,Mi+1−2(Mi+1−ri),ri]
-
M n = r n M_n = r_n Mn=rn
-
K K K 表示 Kernel Size,即卷积核的大小;
-
HDC的目标是令 M 2 ≤ K M_2 \le K M2≤K
-
下面用一个例子来解释一下:
已知: K K K = 3; r r r = [1, 2, 5]
由 K , r K, r K,r 可知: r 1 r_1 r1=1, r 2 r_2 r2=2, r 3 r_3 r3=5; M 1 M_1 M1=1, M 2 M_2 M2=2, M 3 M_3 M3=5
带入上面的定义得: M 2 = m a x [ M 3 − 2 r 2 , M 3 − 2 ( M 3 − r 2 ) , r 2 ] M_2 = \mathop {max}[M_{3}-2r_2, M_{3}-2(M_{3}-r_2), r_2] M2=max[M3−2r2,M3−2(M3−r2),r2]
带入 r r r 可得: M 2 = m a x [ 5 − 2 ∗ 2 , 5 − 2 ∗ ( 5 − 2 ) , 2 ] M_2 = \mathop{max}[5-2*2, 5-2*(5-2), 2] M2=max[5−2∗2,5−2∗(5−2),2]
化简得: M 2 = m a x [ 1 , − 1 , 2 ] = 2 M_2 = \mathop{max}[1, -1, 2] = 2 M2=max[1,−1,2]=2
因此 M 2 ≤ K M_2 \le K M2≤K 所以这组膨胀系数 r r r的选择是合适的。
-
在HDC的论文中,作者往往将 r 1 r_1 r1设置为1,这是一个很具借鉴意义的做法:
我们希望高层的膨胀卷积利用到底层特征的所有pixel,避免有间隙存在,也就是避免grid effect。
那么,在最底层的卷积设计中,我们就希望 M 1 = 1 M_1=1 M1=1,也就是元素全部相邻,没有空隙。
根据 M i M_i Mi 的定义公式,我们可以知道, M 1 ≥ r 1 M_1\ge r_1 M1≥r1,所以 r 1 r_1 r1 必须等于1.
dilation rates设置成锯齿结构
例如:[1, 2, 3, 1, 2, 3],图像表示如下:
也就是说,膨胀系数可以按照一定的组合不断重复,就像例子中的[1, 2, 3]不断重复
dilation rates 公约数不能大于1
当膨胀系数设置为[2, 4, 8],这样公约数大于1的组合时,grid effect会产生:
本节课使用统计使用像素的代码已上传到霹雳吧啦老师的Github上,需要的可以自行下载: https://github.com/WZMIAOMIAO/deep-learning-for-image-processing/tree/master/others_project/draw_dilated_conv
大家可以通过这一代码实验不同的膨胀系数,感受一下以上几条规则的作用。