deeplab(v1&v2)

论文题目:Semantic Image Segmentation with Deep Convolutional Nets and Fully Connected CRFS.

论文下载地址:http://arxiv.org/pdf/1412.7062v3.pdf

参考文献:https://blog.csdn.net/zhuzemin45/article/details/79769154

                 https://blog.csdn.net/C_row/article/details/52161394?locationNum=4

前面所学的FCNSegNetDilated Convolutions,都是基于VGG解码进行改进,FCN将全连接用反卷积代替,使得heartmap通过反卷积的大小和原图一样大,SegNet是将FCN中的反卷积变成uppoling,Dilated Convolutions改成了扩张卷积来增大感受野。

主要贡献:

  • 使用膨胀卷积
  • 提出了暗黑空间金字塔池化 (ASPP)
  • 使用全连接的条件随机场

说明:

基本网络和 dilated convolutions 一致。最后的结构化预测 (精细分割) 采用全连接的 CDF。提出了ASPP,但结果不如 FC-CDF 。


Background:

        CNN的一个特性是invariance(不变性),这个特性使得它在high-level的计算机视觉任务比如classification中,取得很好的效果。但是在semantic segmentation任务中,这个特性反而是个障碍。毕竟语义分割是像素级别的分类,高度抽象的空间特征对如此low-level并不适用。所以,用CNN来做分割,就需要考虑feature map的尺寸,以及空间位置不变性问题

Solution:

        对于第一个问题,Deeplab的对常规的卷积做了而改变,创造性的用了hole算法(下面会细说)。第二个问题,Deepla引入了fully connected CRF(后边会细说)。

DeeplabV1方法分为两步走,第一步仍然采用了FCN得到 coarse score map并插值到原图像大小,然后第二步借用fully connected CRF对从FCN得到的分割结果进行细节上的refine。(有关FCN的内容介绍,可以参考我的前面的一篇博客:FCN) 下面这张图很清楚地展示了整个结构如下: 


2、DeeplabV1相比FCN更加细腻的处理方式:

         在第一步中,deeplab仍然采用了FCN来得到score map,并且也是在VGG网络上进行fine-tuning。但是在得到score map的处理方式上,要比原FCN处理细腻很多。 
        CVPR 2015的FCN中输入是一张514x514的图像,在第一个卷积层上conv1_1来了一个100的大padding。最终在fc7层勉强得到一个16x16的score map。虽然处理上相对粗糙,但确是第一次将图像分割在CNN上完成end-to-end,并且在当时performance是state-of-the-art,也很理解。 

        DeeplabV1摒弃了这种做法,取而代之的是对VGG的网络结构上做了小改动:将VGG网络的pool4和pool5层的stride由原来的2改为了1。就是这样一个改动,使得vgg网络总的stride由原来的32变成8,进而使得在输入图像为514x514,正常的padding时,fc7能得到67x67的score map, 要比FCN确实要dense很多很多。但是这种改变网络结果的做法也带来了一个问题: stride改变以后,如果想继续利用vgg model进行fine tuning,会导致后面filter作用的区域发生改变,换句话说就是感受野发生变化。这个问题在下图(a) (b)中通过花括号体现出来了。

3、Hole算法:

        作者想出了一招,来解决两个看似有点矛盾的问题:  既想利用已经训练好的模型进行fine-tuning,又想改变网络结构得到更加dense的score map . 这个解决办法就是采用Hole算法。如下图(a) (b)所示,在以往的卷积或者pooling中,一个filter中相邻的权重作用在feature map上的位置都是物理上连续的。如下图(c)所示,为了保证感受野不发生变化,某一层的stride由2变为1以后,后面的层需要采用hole算法,具体来讲就是将连续的连接关系是根据hole size大小变成skip连接的(图(c)为了显示方便直接画在本层上了)。注意虽然(c)中的padding为2,但是padding的两个像素不会连在同一个filter上。 

pool4的stride由2变为1,则紧接着的conv5_1, conv5_2和conv5_3中hole size为2。接着pool5由2变为1, 则后面的fc6中hole size为4。 

 一开始,pooling layer stride = 2,convolution layer kernel size = 2,convolution layer第一个点的receptive field是{1,2,3,4},size为4


为了得到更加dense的feature map,将pooling layer stride改为1,如果这个时候保持convolution layer的kernel size不变的话,可以看到,虽然是更dense了,可是不再存在RF = {1,2,3,4}的点了。


当采用hole算法,在kernel里面增加“hole”,kernel size变大,相当于卷积的时候跨过stride减小额外带来的像素,RF就保持不变了,当然如果调整hole的size还能得到比原来更大的RF


这个扩大后的卷积核直观上可以以通过对原卷积核填充0得到,不过在具体实现上填0会带来额外的计算量,所以实际上是通过im2col调整像素的位置实现的,这里不展开,有兴趣的可以看看caffe源码(hole算法已经集成在caffe里了,在caffe里叫dilation)

    于是,通过hole算法,我们就得到了一个8s的feature map,比起FCN的32s已经dense很多了

4、fully connected CRF:

        图像输入CNN是一个被逐步抽象的过程,原来的位置信息会随着深度而减少甚至消失。Conditional Random Field (CRF,条件随机场)在传统图像处理上的应用有一个是做平滑。CRF简单来说,能做到的就是在决定一个位置的像素值时(在这个paper里是label),会考虑周围邻居的像素值(label),这样能抹除一些噪音。但是通过CNN得到的feature map在一定程度上已经足够平滑了,所以short range的CRF没什么意义。于是作者采用了fully connected CRF,这样考虑的就是全局的信息了。有关CRF的介绍可以参考https://blog.csdn.net/zk_ken/article/details/80461854

        CRF是后处理,是不参与训练的,在测试时对特征提取后得到的feature map进行双线性插值,恢复到原图尺寸,然后再进行CRF处理,因为feature map是8s的,所以直接放大到原图是可以接受的。下图展示了CRF处理前后的效果对比,可以看出用了CRF以后,细节确实改善了很多: 

DeepLab V2:

         继DeepLabV1之后,Liang-Chieh Chen很快又推出了DeepLabV2版本。由于变动不是很大,就只说说改进的地方。Multi-scale对performance提升很大,而我们知道,receptive field,视野域(或者感受野),是指feature map上一个点能看到的原图的区域,那么如果有多个receptive field,是不是相当于一种Multi-scale?出于这个思路,V2版本在V1的基础上增加了一个多视野域。具体看图可以很直观的理解。




        
rate也就是hole size,这个结构作者称之为ASPP(atrous spatial pyramid pooling),基于洞的空间金字塔此外,DeepLab V2有两个基础网络结构,一个是基于vgg16,另外一个是基于resnet101的。






猜你喜欢

转载自blog.csdn.net/zk_ken/article/details/80460220