前言:DeepLab v3+作为google的Deeplab系列文章的巅峰,提出了一些新的创新点,它是在DeepLab v3的基础之上进行了改进。
一、DeepLab v3+ 概览
1.1 语义分割的门派之争
当前的语义分割网络层出不穷,基本上形成了4种不同的实现架构
(1)图像金字塔的构架 (DeepMedic、2-scale-RefineNet等)
首先对输入图像进行尺度变换得到不同分辨率的版本(multi-scale input),然后将所有尺度的图像都放入CNN中得到不同尺度的分割结果,最后将其不同分辨率的分割结果融合得到原始分辨率的分割结果。这类方法的缺陷在于计算量大,运算时间长。
(2)编码器-解码器的构架 (FCN、SegNet、U-Net和RefineNet等)
编码器一般采用图像分类预训练得到的网络,采用不断的max pooling和strided convolution有利于获得长范围的语境信息从而得到更好的分类结果。然而在此过程中特征分辨率不断降低,图像细节信息丢失,对于分割任务而言具有巨大的挑战。因此在编码器之后需要利用解码器进行图像分辨率的恢复。值得注意的一点:一般解码器常常具有类似skip的结构将encoder得到的细节信息加入后续decoder的信息恢复中。
(3)语境模块 (Multi-scale context aggregation、DeepLab V1,V2和CRF-RNN等)
语境模块一般是级联在模型后面,以获得长距离的语境信息。以DenseCRF级联在DeepLab之后理解,DenseCRF能够对于任意长距离内像素之间的关系进行建模,因此改善逐项素分类得到的分割结果。
(4)金字塔池化方法(PSPNet、DeepLab V2,V3,V3+等)
金字塔池化的方法作用在卷积特征上,能够以任意的尺度得到对应的语境信息。一般采用平行的多尺度空洞卷积(ASPP)或者多区域池化(PSPNet)得到对应尺度语境信息的特征,最后再将其融合形成综合多个尺度语境的特征向量。下图是PSPNet中金字塔池化模块的具体构架。
1.2 诞生背景
我们说了DeepLab V3+是在DeepLab V3的基础之上改善的,DeepLab V3版本ASPP得到的特征分辨率即使在采用atrous convolution的情况下,依然有8倍的缩小(或者是16倍的缩小)。由于DeepLab V3没有继续使用条件随机场,而是直接使用双线性插值恢复到原图像的大小,然而在DeepLab v3的最后直接对1/8分辨率的结果图进行上采样,恢复成原始分辨率大小,得到逐项素的分割结果。
可想而知,这样直接上采样操作(可以理解成naive decoder)并不能充分恢复在降采样为1/8分辨率过程中损失的细节信息,所以造成了分割的不精确。所以这篇文章在DeepLab V3的基础上,类似于FCN、SegNet、U-Net的形式,加入decoder的形式恢复原始分辨率的分割结果,使得边缘细节信息能够较好的保留。
1.3 DeepLab V3+的改进点
创新点主要有两点:
(1)使用Encoder-Decoder的设计架构。将DeepLab V3作为编码器(利用atrous convolution生成任意维度的特征,并采用ASPP策略),在其后面级联解码器(注意,不再是直接一步恢复到原始大小哦)进而恢复边界细节信息。
(2)backbone的更改。探究了ResNet-101替换成Xception模型的可行性,采用depthwise separable convolution进一步提高分割算法的精度和速度。
总结:DeepLab V3采用了特征金字塔ASPP结构,有采用了编码器-解码器结构。
二、DeepLab V3+的主要结构
整个网络的编码器Encoder不用多说,这其实就是和DeepLab V3是一样的,依然采用了ASPP的设计思想;主要来看一下
解码器Decoder部分。与DeepLab V3不一样的是,V3+采用的是层级解码器(级联解码器),不是一步到位的。
首先采用1*1的卷积核主要是为了对low-level特征通道进行压缩(一般压缩到48),这样能够使得后面的特征对于encoder得到的特征(256通道)有一个偏重,这样可以保证更好的high-level语义信息。然后这边的话也仅仅融合了一个low-level的特征,并没有像FCN、U-Net一样在解码过程中融合很多low-level信息。