Multi-Scale Context Aggregation by Dilated Convolution 对空洞卷积(扩张卷积)、感受野的理解

来源:互联网 发布:amx m4 54数据 编辑:程序博客网 时间:2024/06/05 04:14

        dilated convolution是针对图像语义分割问题中下采样会降低图像分辨率、丢失信息而提出的一种卷积思路。

        在基于FCN思想的语义分割问题中,输出图像的size要和输入图像的size一致。但是FCN中由于有若干stride>1的池化层,所以越到较高的网络层,单位像素中包含的原始图像的信息就越多,也就是感受野越大,但这是以通过池化降低分辨率、损失原始图像中的信息作为代价而得来的;由于pooling层的存在,后面层的feature map的size会越来越小,但由于需要计算loss等原因,最后输出图像的size要和输入图像的size保持一致,所以在FCN中的后段网络层中,必须对feature map进行上采样操作,将缩小的feature map再还原到原始尺寸,在这个过程中,不可能将在池化过程中丢失的信息完全还原回来,这样就造成了信息的丢失、语义分割的精度降低。

        若如果不加pooling层,在较小的卷积核尺寸的前提下,感受野会很小;但如果为了增大感受野,在中段的网络层中使用size较大的卷积核计算量又会暴增,内存扛不住!因为中段的channel一般会非常大,比如1024、2018,跟最开始rgb图像的3个channel比起来,增大了几百倍。

Dilated Convolution的提出

       加pooling层,损失信息,降低精度;不加pooling层,感受野变小,模型学习不到全局信息...怎么办?

        ====> 我们先做一个决定:不要pooling层。没有pooling层,后续网络层中,较小size的卷积核的感受野会很小,没有全局视野;

        ====> 既然小size的卷积核感受野小,那就增大卷积核的size;

        ====> 但卷积核size越大,计算量就会随之加大;

        ====> 那可不可以让卷积核增大,使感受野增大,但计算量不变呢?

        ====> 有啊,把原本紧密贴着的卷积核变得"蓬松"一些,但卷积核需要计算的点不变,也就是蓬松出来的位置全填进去0,还按照卷积核原本的计算方式计算就)可以了。

        ====> 这样,由于卷积核的"蓬松",感受野变大了,又由于卷积核中的有效计算点不变,所以计算量不变。除此之外,每层的feature map的size都不变,所以图像信息都保存了下来一举三得,OK!妥了!

       

        文章中的卷积核的dilated和感受野有一个关系,按我自己的理解可以写成下面这个形式(和文章中的原始公式实际上是同样的含义)

F(dilated) = [pow(2, (dilated / 2) +2) - 1] × [pow(2, (dilated / 2) +2) - 1]

其中,dilated表示卷积核中每个计算点自己的"半径", F(dilated)就是卷积核的感受野尺寸。比如上图中(a),dilated=1,F(dilated) = 3×3;图(b)中,dilated=2,F(dilated)=7×7;图(c)中,dilated=4, F(dilated)=15×15。


Dilated Convolution感受野指数级增长

        对于经典卷积核情况,比如用3*3卷积核经过1、2层卷积层,在第3层中得到1个Feature点,那么第3层这个Feature点换算回第1层覆盖了多少个Feature点呢?

                                                           第3层:

 

                                                  第2层:


                                               第1层:


也就是从size上来讲,2层3*3卷积转换相当于1层5*5卷积。但对于dilated=2,3*3卷积核来讲,还按照上面3层计算:

第1层:


第2层:


第3层:


从size上来讲,2层3*3卷空洞卷积转换相当于1层13*13卷积.

原创粉丝点击