空洞卷积
1. 背景
空洞卷积(Dilated Convolution)最初是为解决图像分割的问题而提出的。常见的图像分割算法通常使用池化层来增大感受野,同时也缩小了特征图尺寸,然后再利用上采样还原图像尺寸。特征图先缩小再放大的过程造成了精度上的损失,因此需要有一种操作可以在增加感受野的同时保持特征图的尺寸不变,从而替代池化与上采样操作,在这种需求下,空洞卷积就诞生了。
在近几年的物体检测发展中,空洞卷积也发挥了重要的作用。因为虽然物体检测不要求逐像素地检测,但是保持特征图的尺寸较大,对于小物体的检测及物体的定位来说也是至关重要的。
2. 卷积过程
空洞卷积,顾名思义就是卷积核中间带有一些洞,跳过一些元素进行卷积。在此以3x3卷积为例,其中,图1 a)是普通的卷积过程,在卷积核紧密排列在特征图上滑动计算,而图1 b)代表了空洞数为2的空洞卷积,可以看到,在特征图上每2行或者2列选取元素与卷积核卷积。类似地,图1 c)代表了空洞数为3的空洞卷积。
在代码实现时,空洞卷积有一个额外的超参数dilation rate,表示空洞数,普通卷积dilation rate默认为1,图1 中的b与c的dilation rate分别为2与3。
在图1中,同样的一个3X3卷积,却可以起到5X5、7X7等卷积的效果。可以看出,空洞卷积在不增加参数量的前提下,增大了感受野。假设空洞卷积的卷积核大小为
k
k
k,空洞数为
d
d
d,则其等效卷积核大小
k
′
k^{'}
k′计算如式(1) 所示。
k ′ = k + ( k − 1 ) × ( d − 1 ) (1) k^{'}=k+\left ( k-1 \right )\times \left ( d-1 \right ) \tag{1} k′=k+(k−1)×(d−1)(1)
在计算感受野时,只需要将原来的卷积核大小 k k k更换为 k ′ k^{'} k′即可。
3. 优点
空洞卷积的优点显而易见,在不引入额外参数的前提下可以任意扩大感受野,同时保持特征图的分辨率不变。这一点在分割与检测任务中十分有用,感受野的扩大可以检测大物体,而特征图分辨率不变使得物体定位更加精准。
4. 缺点
当然,空洞卷积也有自己的一些缺陷, 主要表现在以下3个方面:
- 网格效应
由于空洞卷积是一种稀疏的采样方式,当多个空洞卷积叠加时,有些像素根本没有被利用到,会损失信息的连续性与相关性,进而影响分割、检测等要求较高的任务。
- 远距离的信息没有相关性
空洞卷积采取了稀疏的采样方式,导致远距离卷积得到的结果之间缺乏相关性,进而影响分类的结果。
- 不同尺度物体的关系
大的dilation rate 对于大物体分割与检测有利,但是对于小物体则有弊无利,如何处理好多尺度问题的检测,是空洞卷积设计的重点。
5. 示例
PyTorch对于空洞卷积也提供了方便的实现接口,在卷积时传入dilation 参数即可。
from torch import nn
conv1 = nn.Conv2d(3, 256, 3, stride=1, padding=1,dilation=1)
print('conv1:',conv1)
conv2 = nn.Conv2d(3, 256, 3, stride=1, padding=1,dilation=2)
print('conv2:',conv2)
conv1:Conv2d(3, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
conv2:Conv2d(3, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), dilation=(2, 2))