SegNet以及DeepLab系列学习笔记

本专栏将从论文的角度解读一下CV方向的一些经典神经网络模型及其贡献与意义,以期加深自己的印象,后续可以随时翻看并且学习其中好的tricks。这一期接着介绍语义分割任务中的经典模型。

SegNet

论文全名为《SegNet: A Deep Convolutional Encoder-Decoder Architecture for Image Segmentation》(原文链接),是2017年的工作。
SegNet以及DeepLab系列学习笔记_第1张图片
SegNet也是一个Encoder-Decoder结构,并且编码器与解码器一一对应,tricks其实就一个——为了权衡计算量,提出了反池化来代替反卷积的操作去进行上采样。

首先讲一下池化的优点吧。池化的本质是采样,其实现了对图像的压缩,最直观的作用就是减少参数,其次就是平移不变性——当某些像素在邻域发生微小位移时,池化层的输出是不变的,这就使网络的鲁棒性增强了,有一定抗扰动的作用。此外,原始图像中的相邻像素倾向于具有相似的值,因此经由卷积层输出的特征图中相邻像素也倾向于具有相似的值,再加上非常大的通道数,这意味着特征图中包含的大部分信息都是冗余的,所以池化层的优点就呼之欲出了:进行特征压缩以保留显著特征、降低特征维度以减少参数、增大感受野。

常见的池化方式就是均值池化以及最大池化,通常来说,均值池化能更多的保留图像的背景信息,而最大池化能更多的保留图像的边缘、纹理信息。在SegNet中使用的是最大池化以及最大池化的反池化,具体操作就是在池化时记录下最大池化后的每一个值原本在特征图中的位置信息,然后在反池化时根据对应位置填回去,其他位置补0,如图所示:
SegNet以及DeepLab系列学习笔记_第2张图片
该论文还比较了其他一些变体,比如使用双线性插值上采样、取消池化和下采样过程,但都没有更好的结果,反池化起作用的原因我猜测应该是提高了通过上采样还原信息时的边界刻画的能力。

DeepLab v1

首先,需要明确的一点是,无论如何,下采样过程是肯定有信息损失的,所以对图像分割这种需要精确的定位以及轮廓信息的任务天然就是一个挑战。因此,不能过分缩小特征图,比较广泛接受的是下采样比率不超过1/8。传统DCNN由于连续的最大池化和下采样导致分辨率严重下降,若使用FCN,但又会带来增加内存和计算时间的问题 。

到目前为止,之前讲的无论是FCN、U-Net还是SegNet,都是在上采样过程中想尽办法恢复足够多且有用的信息,以加强对边界、轮廓的估计。DeepLab系列的思路则不同——能不能在下采样过程中就想办法减少轮廓信息损失或者索性在模型后加入一些后处理操作呢?这其实就是DeepLab v1中的两大亮点了。

论文全名为《Semantic Image Segmentation with Deep Convolutional Nets and Fully Connected CRFs》(原文链接),2015年的工作。
SegNet以及DeepLab系列学习笔记_第3张图片
首先讲第一个亮点,又不让缩小特征图,又要增加感受野,那怎么办呢?所以论文提出了Atrous Convolution 空洞卷积来解决,也叫Dilated Convolution 带孔卷积。普通的3×3卷积取的九个点是连续的(上图左,比率为1的空洞卷积退化成普通卷积),而空洞卷积就是取的九个点与点之间空出一些点,隔几个点再取,很明显提高了卷积核的感受野,但特征图大小不变。

SegNet以及DeepLab系列学习笔记_第4张图片
网络结构是对照VGG-16修改的,首先将所有的全连接层改为了卷积层,然后将最后两个最大池化层去掉,并将后续的所有卷积改为空洞卷积,让最后输出的特征图变大,避免池化层丢失太多信息。

第二个亮点就是利用 Fully Connected CRF 全连接条件随机场对网络输出结果再进行微调。关于CRFs后处理可以直接看这篇和这篇,大致思路就是将每个像素点作为节点,像素与像素间连接作为边,通过二元势函数描述像素点与像素点之间的关系,鼓励相似像素分配相同的标签,而相差较大的像素分配不同标签,而其中相似度的定义与颜色值、相对距离有关。

因此,整体模型的大概流程就是先通过CNN得到一个粗糙的特征图并通过双线性插值还原成原图大小,最后通过 Fully Connected CRF 对这个结果进行微调优化:
SegNet以及DeepLab系列学习笔记_第5张图片

DeepLab v2 & v3

论文全名为《DeepLab: Semantic Image Segmentation with Deep Convolutional Nets, Atrous Convolution, and Fully Connected CRFs》(原文链接),2017年的工作。
SegNet以及DeepLab系列学习笔记_第6张图片
相比于v1的最大tricks就在于提出了一个ASPP(Atrous Spatial Pyramid Pooling,空洞卷积空间金字塔池化)模块,其实就是SPP的空洞卷积版本,即在给定的某一特征图上使用不同采样率的空洞卷积重采样,由于同一类的物体在图像中可能有不同的比例,ASPP有助于考虑不同的尺度,以提高准确性。此外就是用ResNet架构替换掉了v1中的VGG架构。
SegNet以及DeepLab系列学习笔记_第7张图片
DeepLab v3的论文全名为《Rethinking Atrous Convolution for Semantic Image Segmentation》(原文链接),也是2017年的工作,之所以和v2放一起,是因为v2论文中没给出具体的网络架构,只有一张上图这样模糊的示意图,而下图这个v3中的具体架构图让我感觉v2和v3没什么区别,只是对ASPP模块做了一点修改…
SegNet以及DeepLab系列学习笔记_第8张图片
总归两个都是应用ASPP的论文,感觉v3就是在v2基础上做了一些细节上的修改吧,如果以后有机会代码实现的时候再来细讲区别吧。

此外还有一个PSPNet,大致结构和idea也是一样的,聚焦于结合上下文信息(就是说通常汽车会在路上、船在水上、飞机在天上这样)以及多尺度融合,论文全名为《Pyramid Scene Parsing Network》(原文链接)
SegNet以及DeepLab系列学习笔记_第9张图片

DeepLab v3+

最后就是DeepLab v3+的论文了,全名为《Encoder-Decoder with Atrous Separable Convolution for Semantic Image Segmentation》(原文链接),2018年的工作。主要贡献就是将整个DeepLab结构嵌套在了Encoder-Decoder框架之下:
SegNet以及DeepLab系列学习笔记_第10张图片
v3+使用的是改进版Xception,加入Decoder部分之后mIOU精度还是有一定提升的。

你可能感兴趣的:(CV炼丹之路,卷积,神经网络,计算机视觉,深度学习)