空洞卷积(dilated convolution)和Dilated Residual Networks

Dilated/Atrous Convolution(中文叫做空洞卷积或者膨胀卷积) 或者是 Convolution with holes 从字面上就很好理解,是在标准的 convolution map 里注入空洞,以此来增加 reception field。相比原来的正常convolution,dilated convolution 多了一个 hyper-parameter 称之为 dilation rate 指的是kernel的间隔数量(e.g. 正常的 convolution 是 dilatation rate 1)。

Standard Convolution with a 3 x 3 kernel (and padding) 

Dilated Convolution with a 3 x 3 kernel and dilation rate 2

Deep CNN 对于其他任务还有一些致命性的缺陷。较为著名的是 up-sampling 和 pooling layer 的设计。
主要问题有:

  • Up-sampling / pooling layer (e.g. bilinear interpolation) is deterministic. (参数不可学习)
  • 内部数据结构丢失;空间层级化信息丢失。
  • 小物体信息无法重建 (假设有四个pooling layer 则 任何小于 2^4 = 16 pixel 的物体信息将理论上无法重建。)
    在这样问题的存在下,语义分割问题一直处在瓶颈期无法再明显提高精度, 而 dilated convolution 的设计就良好的避免了这些问题。

在图像分割领域,图像输入到CNN(典型的网络比如FCN[3])中,FCN先像传统的CNN那样对图像做卷积再pooling,降低图像尺寸的同时增大感受野,但是由于图像分割预测是pixel-wise的输出,所以要将pooling后较小的图像尺寸upsampling到原始的图像尺寸进行预测(upsampling一般采用deconv反卷积操作,deconv可参见知乎答案如何理解深度学习中的deconvolution networks?),之前的pooling操作使得每个pixel预测都能看到较大感受野信息。因此图像分割FCN中有两个关键,一个是pooling减小图像尺寸增大感受野,另一个是upsampling扩大图像尺寸。在先减小再增大尺寸的过程中,肯定有一些信息损失掉了,那么能不能设计一种新的操作,不通过pooling也能有较大的感受野看到更多的信息呢?答案就是dilated conv。

下面看一下dilated conv原始论文[4]中的示意图:

dilated conv

(a)图对应3x3的1-dilated conv,和普通的卷积操作一样,(b)图对应3x3的2-dilated conv,实际的卷积kernel size还是3x3,但是空洞为1,也就是对于一个7x7的图像patch,只有9个红色的点和3x3的kernel发生卷积操作,其余的点略过。也可以理解为kernel的size为7x7,但是只有图中的9个点的权重不为0,其余都为0。 可以看到虽然kernel size只有3x3,但是这个卷积的感受野已经增大到了7x7(如果考虑到这个2-dilated conv的前一层是一个1-dilated conv的话,那么每个红点就是1-dilated的卷积输出,所以感受野为3x3,所以1-dilated和2-dilated合起来就能达到7x7的conv),(c)图是4-dilated conv操作,同理跟在两个1-dilated和2-dilated conv的后面,能达到15x15的感受野。对比传统的conv操作,3层3x3的卷积加起来,stride为1的话,只能达到(kernel-1)*layer+1=7的感受野,也就是和层数layer成线性关系,而dilated conv的感受野是指数级的增长。

dilated的好处是不做pooling损失信息的情况下,加大了感受野,让每个卷积输出都包含较大范围的信息。

空洞卷积存在的问题

潜在问题 1:The Gridding Effect

假设我们仅仅多次叠加 dilation rate 2 的 3 x 3 kernel 的话,则会出现这个问题:

我们发现我们的 kernel 并不连续,也就是并不是所有的 pixel 都用来计算了,因此这里将信息看做 checker-board 的方式会损失信息的连续性。这对 pixel-level dense prediction 的任务来说是致命的。

潜在问题 2:Long-ranged information might be not relevant.

我们从 dilated convolution 的设计背景来看就能推测出这样的设计是用来获取 long-ranged information。然而光采用大 dilation rate 的信息或许只对一些大物体分割有效果,而对小物体来说可能则有弊无利了。如何同时处理不同大小的物体的关系,则是设计好 dilated convolution 网络的关键。

通向标准化设计:Hybrid Dilated Convolution (HDC)

对于上个 section 里提到的几个问题,图森组的文章对其提出了较好的解决的方法。他们设计了一个称之为 HDC 的设计结构。

  • 第一个特性是,叠加卷积的 dilation rate 不能有大于1的公约数。比如 [2, 4, 6] 则不是一个好的三层卷积,依然会出现 gridding effect。

  • 第二个特性是,我们将 dilation rate 设计成锯齿状结构,例如 [1, 2, 5, 1, 2, 5] 循环结构。

  • 第三个特性是,我们需要满足一下这个式子:

 其中ri是 i 层的 dilation rate 而 M_i是指在 i 层的最大dilation rate,那么假设总共有n层的话,默认 M_n=r_n 。假设我们应用于 kernel 为 k x k 的话,我们的目标则是M_2 \leq k,这样我们至少可以用 dilation rate 1 即 standard convolution 的方式来覆盖掉所有洞。

一个简单的例子: dilation rate [1, 2, 5] with 3 x 3 kernel (可行的方案)

 

而这样的锯齿状本身的性质就比较好的来同时满足小物体大物体的分割要求(小 dilation rate 来关心近距离信息,大 dilation rate 来关心远距离信息)。

这样我们的卷积依然是连续的也就依然能满足VGG组观察的结论,大卷积是由小卷积的 regularisation 的 叠加。

以下的对比实验可以明显看出,一个良好设计的 dilated convolution 网络能够有效避免 gridding effect.

 

多尺度分割的另类解:Atrous Spatial Pyramid Pooling (ASPP)

在处理多尺度物体分割时,我们通常会有以下几种方式来操作:

 

然仅仅(在一个卷积分支网络下)使用 dilated convolution 去抓取多尺度物体是一个不正统的方法。比方说,我们用一个 HDC 的方法来获取一个大(近)车辆的信息,然而对于一个小(远)车辆的信息都不再受用。假设我们再去用小 dilated convolution 的方法重新获取小车辆的信息,则这么做非常的冗余。

基于港中文和商汤组的 PSPNet 里的 Pooling module (其网络同样获得当年的SOTA结果),ASPP 则在网络 decoder 上对于不同尺度上用不同大小的 dilation rate 来抓去多尺度信息,每个尺度则为一个独立的分支,在网络最后把他合并起来再接一个卷积层输出预测 label。这样的设计则有效避免了在 encoder 上冗余的信息的获取,直接关注与物体之间之内的相关性。

总结

Dilated Convolution 个人认为想法简单,直接且优雅,并取得了相当不错的效果提升。他起源于语义分割,大部分文章也用于语义分割,具体能否对其他应用有价值姑且还不知道,但确实是一个不错的探究方向。有另外的答主提到WaveNet, ByteNet 也用到了 dilated convolution 确实是一个很有趣的发现,因为本身 sequence-to-sequence learning 也是一个需要关注多尺度关系的问题。则在 sequence-to-sequence learning 如何实现,如何设计,跟分割或其他应用的关联是我们可以重新需要考虑的问题。

推荐阅读

图森组和 Google Brain 都对于 dilated convolution 有着更细节的讨论,推荐阅读:

参考

空洞卷积
 

               基础DL模型-Dilated Residual Networks

论文:Dilated Residual Networks CVPR2017
代码:GitHub - fyu/drn: Dilated Residual Networks pytorch

现在用于分类的大多数卷积神经网络,都是将图片分辨率降低了32倍的。在输入固定的情况下(分类一般都是224×224),最后的输出是7×7的feature map,选择这个倍数,在减少模型的参数量和计算量的同时保证最后的feature map不至于丢失太多信息。这对于分类问题来说是比较合理的,但是对于分割或者定位或者检测来说,毕竟属于像素级别的分类任务,如果还是选择32的总步长,势必会丢掉一些信息。但是如果选择小的步长,又会使感受野变小。所以现在有些文章会采用 up-convolutions, skip connections, and posthoc dilation等操作在降低步长的同时,维持感受野。

这篇文章使用了 Dilated Convolution ,也就是空洞卷积,或者膨胀卷积,或者带孔卷积。空洞卷积的使用使得网络可以在减少步长的情况下,保持感受野不变。关于空洞卷积的原理见 [参考资料 1],这里不再叙述。

Dilated Convolution 与ResNet的结合,所以本文叫做Dilated Residual NetWorks,简称DRN。

1 DRN

ResNet的总步长为32,由于直接降低步长会影响感受野,所以作者使用 Dilated Convolution 来改进ResNet。

如下图,DRN与ResNet的对比。

mark

  • DRN中的Group4和Group5的步长stride变成了1,这导致整个DRN的总步长变为8.

  • Group4中,第一层 dilation=1,本层感受野没有变,但是后续卷积层的感受野会变小,因此采用dilation=2,维持感受野不变

  • Group5与原来相比,相当于少了2个stride=2的层,为了维持感受野不变,使dilation=4

    这里稍微解释下:

假设输入,输出为:Input: (N,Cin,Hin,Win)(N,Cin,Hin,Win),Output: (N,Cout,Hout,Wout)(N,Cout,Hout,Wout)

输出的计算是这样的:

mark

感受野的计算 [参考资料 2,3]。

当然这种方法也是可以加到 Group2和3的,那样就达到总步长为1了,但是这样参数量会很多。文章的分析,步长为8已足够应对,分割这种像素级别的任务了。

以上就是对ResNet的基础改进,比较简单,只加了dilation。

2 Localization

在针对定位或者分割任务时,作者还做了一点改动,如下图:

mark

这就是将最后的average global pooling换成了 1×1 卷积,使得输出变成一个channel=n,n为类别数的feature map,这在分割中是比较常见的处理,输出的是一个28×28的score map,而其他文章中比较常用的是14×14大小的score map。28×28明显可以保留更多信息。

做Object Localization时的处理:

假设最后生成的score map是C×W×H的,C为类别,W,H为宽高,对对ImageNet来说就是 1000×28×28.
令 f(c,w,h)f(c,w,h) 为 坐标 (w,h)(w,h) 处的激活值后者叫做得分。

那么用下式表示 坐标 (w,h)(w,h)处的类别:

mark

  • 坐标 (w,h)(w,h) 在所有C个类别中,得分最大的作为当前坐标的类别 c

bounding box由下式确定:

mark

  • 类别为 cici ,且得分大于 阈值 tt 的那些坐标集合构成的bounding box

以上bounding box的确定,对于class cici ,肯定会确定下多个bounding box,使用下式找到与目标最贴切的那个。

mark

更有趣的是,对这个 Object Localization 可以直接拿 分类网络来做,连fine-tuning都不用了。

3 Degridding

Dilated Convolution 的网格化现象,这是由于空洞卷积本身的问题带来的。

比如下面 (c) 列,feature map上有很明显的网格化现象.

mark

作者也给了一个图来解释,网格化现象产生的原因:

mark

网格化现象会影响网络的性能,于是作者设计了去网格化(Degridding)的结构,如下图:

mark

  • DRN-A-18与ResNet18的结构类似,只做了stride 和 dilation的转换

  • DRN-B-26:为了消除网格化现象,在整个网络后面再加两个shortcut block

  • 但是考虑到shortcut block中的shortcut会把输入层直接加到输出,还是会产生网格现象,所以取出shortcut connection

为了消除网格现象,作者的改进方法有如下三种:

Removing max pooling

mark

如上图,考虑到ResNet中 第一个卷积层后面的 max pooling,其提取到的信息高频部分占主要地位(figure 6(b)),这些高频信息会使后续的feature map中的网格化现象加重,因此作者移除了 max pooling 换成了stride=2的卷积层,figure 6(c)作为对比结果。

Adding layers

在网络后面添加 dilation 较小的卷积层,如Figure 5(b),通过网络学习,消除网格现象。

Removing residual connections

因为shortcut connection 的存在,会使 level6(dilation=4)的输出直接加到 level7 的输出上(level7和8也是同样的),因此将shortcut connection 去掉,如Figure 5(c)。

下图是DRN-C结构中不同层的feature map可视化结果:

mark

level5(dilation=2)和level6(dilation=4)的网格现象还比较严重,而最终的 class activation 中的网格现象已经消除的很不错了。

4 Experiments

4.1 Image Classification

Training is performed by SGD with momentum 0.9 and weight decay 10e-4. The learning rate is
initially set to 10e-1 and is reduced by a factor of 10 every 30 epochs. Training proceeds for 120 epochs total.

ImageNet 分类实验,top-1和top-5错误率

mark

  • 同等深度情况下 DRN的效果比ResNet好
  • 而且效果 DRN-C > DRN-B > DRN-A ,说明消除网格现象的措施是有用的
  • DRN-C-42与 ResNet101的结果相当,而深度只有不到一半,计算量也更少

4.2 Object Localization

在ImageNet上的 Localization结果,也是错误率

mark

  • 还是DRN 好
  • DRN-C-26比ResNet101结果都要好,而深度只有26层
  • DRN-C比DRN-B和DRN-A效果更好

4.3 Semantic Segmentation

Cityscapes 数据集上的分割结果:

mark

  • baseline 是ResNet101,其结果是 66.6,DRN的效果要更好。
  • DRN-A-50虽然存在网格化现象,但仍然赶上 ResNet了
  • DRN-C-26比DRN-A-50还要好,而网络深度只有一半多一点,说明消除网格很有必要

下图是DRN不同配置的最终分割结果展示,DRN-C-26的结果已经很好了。

mark

5 总结

  • 对于分割任务,减少了步长,使最后用于分类的feature map更精细,并将dilated convolution与ResNet结合,保持感受野。
  • DRN对于分类,定位,分割的效果均好于以ResNet为backbone的模型。
  • 大大减少了网络深度,而且减少了计算量。

本文标题:基础DL模型-Dilated Residual Networks-论文笔记

本文作者:arleyzhang

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值