提出背景
膨胀卷积是为解决语义分割任务而提出的。因为深度学习的蓬勃发展,其也被迁移应用于语义分割领域。当时的SOTA方法多是基于卷积神经网络,但卷积神经网络当初是为图像分类任务而设计的。语义分割作为一种稠密预测(Dense Prediction)任务——语义分割是像素级的分类任务,与图像分类具有结构上的不同。这里的不同指的应该是,图像分类的网络只需输出相应的物体类别的概率,而语义分割网络则需要输出与原图像大小相同的图像。
为了获得足够的感受野(感受野的概念将在下面解释),图像分类任务会通过池化层或大步幅的卷积对图像和特征图进行下采样,从而减小图像尺寸。或者特征图的分辨率,这与语义分割的输出要求背道而驰。当时解决这个问题主要有两种方法:
- 对图像或特征图进行上采样以恢复通过对感受野进行下采样而丢失的分辨率
- 将输入图像缩放成多种尺寸并输入到网络中,将多尺度图像组合起来得到最终的预测结果
但是扩张卷积的作者质疑这两种方法:网络中的下采样层对于语义分割任务真的有必要吗?是否需要多尺度图像的输入?有没有办法在不改变图像分辨率的情况下获得足够的感受野,从而使网络能够专注于多尺度的上下文语义信息?
基于以上疑问,作者受到小波变换领域的膨胀概念,提出了膨胀卷积,并将其做成即插即用的模块,放入卷积神经网络中。如图1所示,经测试,取得了不错的效果。
图1. 膨胀卷积在语义分割任务上的效果
感受野
感受野,是指在当前尺寸的特征图上的一个像素点在原图像的覆盖范围,即特征图上的这个点是由输入图像中感受野大小区域的计算得到的。举个简单的例子,如图2中所示,是一个三层的卷积神经网络,每一层的卷积核尺寸都是3×3,步长为1。可以很直观的看到,第一层的每个点都是由输入层的三个元素计算得到的,即感受野为3×3;以此类推,第二层的感受野为5×5,第三层的感受野为7×7。
图2. 三层卷积神经网络的感受野计算
此外,感觉场还有更科学的计算公式:
参数含义:
层的感受野
层感受野
卷积核大小
前层步长的乘积
注意当前层的步幅不影响当前层的感受野。
感受野是影响深度神经网络性能的重要因素之一。因此,在通常的深度神经网络设计中,要注意每一层的特征图的感受野,以保证在当前层能够得到适合待解决任务的感受野大小,即也就是说,特征图包含了足够多的原始图像语义信息。这样,可以发挥深度神经网络的最佳性能。
注意:从上边公式中可以看出,想要增大感受野,有两种办法。一是增大卷积核尺寸,二是增大卷积步长(池化层也可以用步长为2的卷积替代,参考Darknet53)
什么是空洞卷积
扩张卷积,顾名思义,就是为扩张而设计的卷积运算。它究竟是如何扩展的?让我们看一下图 3。
图3. 普通卷积核和膨胀卷积核的示意图
从图3可以看出,膨胀卷积的卷积核是在普通卷积核的基础上扩大了尺寸,但是真正参与运算的卷积核单元没有变化(图3中只有蓝色方块才是参与运算的单元,无色小方块中的元素用0填充。左半部分的普通卷积核尺寸为3×3,右半部分卷积核尺寸为5×5,但右半部分深蓝色的参与运算的元素依然是9 [] 个),看到这里大家应该知道膨胀卷积是什么样的了。
空洞卷积的设计原理
从图3中可以看出,膨胀卷积其实是通过扩大卷积核尺寸的方式来增大感受野,同时既没有增大计算量,也没有降低特征图的分辨率。等等…,这不正是语义分割所需要的神器吗?
除此之外,膨胀卷积有一个超参数:膨胀因子,通过膨胀因子我们可以控制卷积核的膨胀程度,图3中的膨胀因子为2。膨胀因子是如何控制卷积核的膨胀程度的呢?
参数含义:
常见的卷积核大小
普通卷积核经过扩展设计后的卷积核大小
例如,图3中,普通卷积核尺寸3×3,为2,那么膨胀之后的卷积核尺寸为5×5。
,图3中,行列元素间隔各为1。
接下来,如图4所示,看一下膨胀卷积的感受野的计算方式。作者说他们的架构受到以下事实的启发:膨胀卷积支持指数级扩展的感受野,而不会丢失分辨率或覆盖范围。
图4. 膨胀卷积的感受野示意图
分别是第1,2,3层特征图。是级联形式,即是由原图得到的,是由得到的,是由得到的。每层特征图均采用步长为1的方式计算得到。根据上边计算感受野的公式可知:
的感受野=1+(3-1)*1=3,3×3注意:原图的感受野为1
的感受野=3+(5-1)*1=7,7×7
的感受野=7+(9-1)*1=15,15×15
作者在论文中给出的计算公式:
在,
:层的特征图的感受野
根据上面的计算公式,作者说空洞卷积在不损失分辨率和覆盖率的情况下支持指数级扩展的感受野。这种指数感受野增长是精心设计的膨胀因子的结果。
原论文中的网络结构设计规则如图5所示。
图5. 原论文中网络设计及感受野详情
空洞卷积的优缺点
优势:
- 使输出更密集,适应语义分割任务;
- 在不降低分辨率的情况下增加感受野。
缺点:
- gridding problem
,如果我们叠加多个相同的膨胀卷积,会发现感受野中有很多像素没有利用上(感受野的方阵中只有蓝色和红色方块参与计算,白色方块使用零填充,相当于没有参与运算),出现大量空洞,如图6所示。此时,会丢失数据之间的连续性及完整性,不利于学习。
图6. 多个相同膨胀卷积堆叠带来的gridding problem - 远距离信息有时无关紧要
,空洞卷积扩大了感受野,所以可以获得远距离信息(在图像中,这有利于大目标的分析),但是一些远距离信息和当前点完全无关,会影响数据的一致性(对小目标不太友好)。
对扩张卷积的改进
针对以上缺点,图森未来的研究人员对膨胀卷积进行了改进,并提出了Hybrid Dilated Convolution(HDC)。HDC主要有三个特性:
- 叠加卷积的膨胀因子不能有大于1的公约数。比如 [2, 4, 6] 则不是一个好的三层卷积,依然会出现 gridding effect。
- 膨胀因子可以设计成锯齿状结构,例如 [1, 2, 5, 1, 2, 5] 循环结构。
- 膨胀系数需要满足以下公式:
参数含义:
第i层的膨胀因子
这i层的最大的膨胀因子
假设总共有n层的话,默认。假设我们应用于的卷积核,我们的目标则是,这样我们至少可以用膨胀因子为1(即 普通卷积)的方式来覆盖掉所有空洞。
膨胀卷积基于Pytorch的代码实现
Pytorch中膨胀卷积和普通卷积共用一个API,只是通过膨胀因子的参数进行区分,膨胀因子设置为1时就是普通卷积。
torch.nn.Conv2d(in_channels, out_channels, kernel_size, stride=1, padding=0, dilation=1, groups=1, bias=True, padding_mode='zeros', device=None, dtype=None)
参数含义:
- in_channels (int) – Number of channels in the input image
- out_channels (int) – Number of channels produced by the convolution
- kernel_size (int or tuple) – Size of the convolving kernel
- stride (int or tuple, optional) – Stride of the convolution. Default: 1
- padding (int, tuple or str, optional) – Padding added to all four sides of the input. Default: 0
- padding_mode (string, optional) – ‘zeros’, ‘reflect’, ‘replicate’ or ‘circular’. Default: ‘zeros’
- dilation (int or tuple, optional) – Spacing between kernel elements. Default: 1
- groups (int, optional) – Number of blocked connections from input channels to output channels. Default: 1
- bias (bool, optional) – If True, adds a learnable bias to the output. Default: True
dilation为膨胀因子,默认为1,即普通卷积。
总结
本篇博客从背景、设计理念和改进方向来介绍空洞卷积。 Dilated convolution 是一个简单的设计,但本质上对具体的任务做了很大的改进,有一种返璞归真的感觉。有时,简单的方法往往是最好的。我们需要做的是如何更好地将空洞卷积与其他任务结合起来,以最大限度地发挥其优势。如果可能的话,我们也可以分析一下改进后的空洞卷积的缺点和不足,并加以改进。
文章出处登录后可见!