简介

DeepLab系列出现用于分类,后来作为常用的backbone用于各类网络结构中,用来提取图像的特征。

DeeoLabV1

由于DeepLab网络结构是由VGG-16变换过来,因此这里首先比较一下两者的区别

首先是VGG-16的原结构:

VGG16输入224x224x3的图片,经过的卷积核大小为3x3x3,stride=1,padding=1,pooling为采用2x2的max pooling方式:

请输入图片描述

变形后的DCNN:

请输入图片描述

  • 其中pool4和pool5步长变为1
  • CONV5全部变成5的空洞卷积(原核大小为3,holesize为2所变)
  • fc6 7 8全部变为holesize为4的卷积核(原文称变为标准卷积核,但是不知道大小)
  • 最后输出为21通道(原来为1000)(盲猜1x1x21)
  • 在这里通过将标签下采样8倍与输出结果进行交叉熵训练

优化方法为SGD

loss函数为交叉熵

Q:前面提到的疑问:这个21怎么与标签下采样(224/8=28)进行交叉熵啊

A:因为最终DCNN输出的数据只缩小了8倍(Vgg16因为经过了5个pool所以其实图像是缩小了32倍),它就能够被CRF所接受

DeepLabV2

补充之前CRF的定义:(自己的理解)
请输入图片描述

E(x)是势能,i代表对应像素,这里E的意思即为一张图中所有像素点的势能
请输入图片描述
p(X)为DCNN输出的概率,这里理解为概率越高,势能越小

请输入图片描述

请输入图片描述

i,j代表两个像素点之间的关系 ,u则是用来判断是否为同一个点

后面这两个为高斯核函数

第一个$p_{i(j)}$为像素位置,第二个$I_{i(j)}$为RGB的颜色值

第一个高斯核函数判断点位置和颜色,距离越接近(即为越相似)值就越大

第二个只判断位置

余下函数都为超参

综上,这个势能函数E(x)是判断一整张图的性能函数

其值越大,说明此图能量越高,具体用途得根据超参决定

多孔空间金字塔池化的多尺度图像

对一个位置使用不同尺度的空洞卷积去卷,且这些空洞卷积为同一卷积,权值共享

请输入图片描述

  • 原本的学习率乘上这个式请输入图片描述

    实验中POWER=0.9,batch size = 10 and 20K iterations

  • 多孔空间金字塔池化(ASPP)

实验将

请输入图片描述

ASPP-S:r={2, 4, 8, 12}

ASPP-L:r={6, 12, 18, 24}

请输入图片描述

结果是IOU的重叠率的大小

  • 最后发现还是Resnet101的效果最好

    实验过程:除了将rennet的全连接像VGG16一样变成空洞卷积,最后两层池化的步长变为1外,

    对数据进行了预处理请输入图片描述

    名词解释

    msc:图片的多尺度输入

    COCO(MS-COCO):模型在MS-COCO上预训练过

    Aug:图片随机裁剪后输入

最后,实验最好的Resnet的最好结果为79.6(mIOU)

DeepLabV3

使用的数据增强方法:

B. Hariharan, P. Arbel ́aez, L. Bourdev, S. Maji, and J. Malik.Semantic contours from inverse detectors. InICCV, 2011.

多尺度输入

左右翻转

对比V1 V2版本的deeplabV3:

  1. 舍弃了最后升采样用的CRF,本文的上采样的方法是双线性插值(decode的新方法在V3+解释),训练过程则是把标签下采样成对应的步长(Stride)与训练结果进行匹配
  2. 使用了串联(cascaded)的空洞卷积结构
  3. 多尺度下降(Multi-grid Method)

Deeplab3流程:

请输入图片描述

Resnet50:

请输入图片描述

PS:这里的每个block定义为3个3x3的卷积核,最后一个的stride是2,其余都是1,然后其余的结构都类似Resnet的结构,到这里位置并不是任何一个Resnet!!!只是一个类似的,作者为了解释自己的方法设计的,后面的实验都是基于Resnet50和101做的(把block用上面那个表的卷积核替代,比如block1内就是3个unit)

请输入图片描述

图为Resnet34的结构

这里作者不同于Rsenet原作者的block描述,Deeplab作者描述的block是步长2的卷积是最后一个,因此最后一个block的最后一个卷积步长不变,仍然为1,而Resnet的作者的block步长为2的卷积是每个Block的第一个(除了第一个block),但是其实都是一样的意思。

  • 串联空洞卷积:

    就是把多个空洞卷积块连在一起,为了范围更大的提取原图的信息

    请输入图片描述第一行的图表示没用空洞卷积的类Resnet网络增加Block后的stride的变化(最后一个block的最后一个卷积的stride不是2,为1)

然后作者发现串联空洞卷积串的次数越多,到后面strides越大,效果越差()

于是作者提出了一种叫做多尺度下降(Multi-grid Method)的方法,具体做法是把每个Block内的空洞卷积的rate变成(1,2,4)的比例,比如上图rate=2的block4,中的3个空洞卷积的rate变为2*(1,2,4)=(2,4,8)。

到此,作者将这个定义为串联空洞卷积。


但是还有个问题,就是空洞卷积如果过大了,提取信息的能力也会下降(太大导致3*3的空洞卷积核只有中间那个发挥作用)

因此并不是block越多越好,因此作者为了提取更多信息,并且不增加block数,使用了空洞金字塔池化( Atrous Spatial Pyramid Pooling)(ASPP),这是deeplabV2的内容,最后的结构变成了这个模型:

请输入图片描述

这里要注意的就是,如果想改变输出的output stride,就改变从后面开始数的block的rate数即可

block下的数字我理解为比起原图缩小的倍数

(例如想output stride=8,则block3的rate=2,block4的rate=4)


以Resnet50为骨架,output stride=8搭建一个deeplabV3:

[](https://blog.csdn.net/aaon22357/article/details/94619101)

作者认为,在之前的网络中,类似由于resnet中的下采样次数太多,导致output_stride过大,每个像素包含的语义信息不够,但是为了达到和池化层一样降低Featuremap的效果,又不增加output_stride,于是采用了空洞卷积。最终的模型用来resnet50作为basebone,利用了一部分的串联空洞卷积和aspp来约束output_stride,最后还将上采样的全连接CRF取消了,直接使用双线性插值上采样了

DeepLabV3+

deeplabV3+主要做了两个工作:

  1. 设计了decode部分,使得上采样不仅仅是线性插值,在之前进行了一些特征提取
  2. 将骨干网络换成了Xception

但是比起V3最好的模型来说,效果也只是提升了一点。请输入图片描述

具体的网络结果如下:

请输入图片描述

  • 从编码部分解释

首先把DCNN的主干网络从原来的Resnet换成了Xception,Xception中使用了两种新卷积:请输入图片描述


(这部分理解仅仅来源于deeplapV3+的论文,不知道理解有没有错)

假设现在输入一个的16通道的图片,使用3x3的卷积核,为了获得32通道的结果,若是使用普通卷积(3x3),则需要3x3x16x32的参数,若是使用Depthwise conv和Poithwise conv,则只需要3x3x16+16x1x1x32,省下不少计算资源。请输入图片描述

Depthwise conv:这里姑且叫深度智能卷积,它是在图片上三个通道上的不同卷积(有多少个通道就有多少个卷积)

Poithwise conv:我叫他点智能卷积,它的作用是将上面的深度智能卷积中的输出结果通过新的1*1卷积核,来达到最后所需的通道数

然后本文的新空洞卷积就是结合了上面的两种卷积。


在DeeplabV3+中,Xception是魔改过的:

请输入图片描述

因为不是resnet了,所以不能用block的概念来套了

在原来的基础上,在一些卷积后加了BN和Re层,而且改了卷积核的结构(详细还是看代码)

在图上标注的skip处为编码部分中的低维度特征提取的地方,这个skip是到时候解码的时候用的

在os=16的时候,波浪部分的stride=1了(文中并没有说明调整的规律)

接下来与V3一样,通过多尺度金字塔结构后,合并起来,经过一些必要的池化后,通过1x1卷积改变通道数(到这里为止都是金字塔池化中的),然后再经过bn和re层后再用1x1卷积改变通道数

  • 接下来是解码部分

首先是上采样部分,依旧使用线性插值的方法暴力改变图像尺寸再进行解码

将上面说的skip部分的低维度特征与deeplabV3编码部分的输出联合起来,最后通过一个3x3的卷积核还原出原本的通道大小(这里作者做过实验发现还是一个3x3的效果就够了)

没有具体提及bn和re已经一些增加的1x1卷积,还是得看源码(

  • ps 还有一些数据增强的方法也与前面的一样
如果对你有帮助就太好了)))