什么是膨胀卷积/空洞卷积
膨胀卷积(Dilated Convolution/Atrous Convolution)(下面都使用膨胀卷积 这个名词)
先来一张图,让大家对于膨胀卷积有个直观的理解,上图左边就是普通卷积,右边是膨胀卷积
为什么要使用上面这种膨胀卷积
主要是膨胀卷积的两种作用
-
增大感受野 相较于左边这张图,右边这张图每一个元素的感受野明显是大一点的
-
保持原输入特征图的W、H 右边这张图没有设置padding,一般是要设置padding的,可以保持输入输出大小不变,比如上图输入的特征图是3×3,通过膨胀卷积之后输出的特征图也是3×3
在我们使用诸如FCN等网络模型进行语义分割的时候,往往都是使用CNN网络作为主干,进行特征提取的,但是CNN网络进行特征提取的时候下采样倍数太大,对于后面还原回原图影响很大
在CNN网络中一般进行下采样的时候都使用maxpooling网络。但是maxpooling 降低高宽,会丢失细节信息和小的目标,那我们是否可以修改CNN网络结构,直接将maxpooling层给去掉呢。
答案是不能够去掉,因为maxpooling具有增大输出层感受野的作用,而且maxpooling之后的一系列操作都是在之前对应的感受野之上进行进一步操作的
不能够去掉maxpooling层,但是我们可以使用膨胀卷积进行替换,因为它既可以增大感受野,又可以让输入输出特征矩阵的高宽不会发生改变
gridding effect问题
但是膨胀卷积层也不能够随意设置进行叠加,因为这会导致一个gridding effect的问题
下面介绍gridding effect问题
通过上图可以看到很明显b这种的这种膨胀卷积方式像素利用率明显高于a的方式
再使用图示让大家更加直观的感受一下:
下面3张图是连续使用3个r=2的膨胀卷积操作后layer3对于layer1上像素利用率的示意图(像素点上数字代表像素点被使用的次数)
再下面三张图是将r1设置为1,r2,r3仍然为2的时候进行连续膨胀卷积的效果
可以看到第二种膨胀卷积方式明显对于layer1上像素的利用率要比第一种膨胀卷积的方式要高
但是如果我们将r1、r2、r3都设置为1,也就是全部使用普通卷积的时候:
可以看到全部使用普通卷积的时候,感受野要比使用膨胀卷积小得多
那么我们在要进行连续设置膨胀卷积的时候,该如何设置膨胀卷积系数呢?这就是下面要将HDC设计准则
(我对于gridding effect的理解就是膨胀卷积系数设置的不好会导致底层像素利用率低,丢失严重的问题)
HDC设计准则
通过上面对比可以知道不能够连续使用膨胀系数的设置对于膨胀卷积像素利用率的影响是很大的,那么我们应该如何设置膨胀系数呢
在”Understanding Convolution for Semantic Segmentation“ 这篇论文中作者提出了当我们要连续使用膨胀卷积的时候,我们应该使用HDC的设计准则去设计膨胀卷积的膨胀系
上图论文内容是作者建议膨胀系数r都是从1开始的,这是因为如果我们希望高层能够用到底层所有的像素,就必须底层的膨胀卷积的系数为1,即Ri为1
下面看一下论文中给的第二个建议:建议将膨胀系数设计成锯齿结构
第三个建议:公约数不能够大于1(公约数大于1就会存在gridded effect问题)
比如[2,4,8]:
只要记住作者的三个建议,在我们自己设计需要使用膨胀卷积的网络模型的时候按照建议来规划即可
到这里,膨胀卷积的相关内容就介绍完毕了,如果对于大家有帮助,麻烦大家给我点个关注,感谢感谢