语义分割-膨胀卷积


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+12ri,Mi+12(Mi+1ri),ri]

  • M n = r n M_n = r_n Mn=rn

  • K K K 表示 Kernel Size,即卷积核的大小;

  • HDC的目标是令 M 2 ≤ K M_2 \le K M2K

  • 下面用一个例子来解释一下:

    已知: 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[M32r2,M32(M3r2),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[522,52(52),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 M2K 所以这组膨胀系数 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 M1r1,所以 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

大家可以通过这一代码实验不同的膨胀系数,感受一下以上几条规则的作用。

  • 19
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值