深度学习在图像语义分割中的应用
本文主要分为三个部分:
- 图像的语义分割问题是什么
- 分割方法的概述
- 对语义分割方面有代表性的论文的总结
什么是图像的语义分割?
在计算机视觉领域,分割、检测、识别、跟踪这几个问题是紧密相连的。不同于传统的基于灰度、颜色、纹理和形状等特征的图像分割问题,图像语义分割是从像素级理解图像,需要确定图像中每个像素的对应的目标类别。如下图:
除了识别出摩托车和骑摩托车的人,我们还必须划定每个物体的边界。图像分类问题输出几个代表类别的值,而语义分割需要输出每个像素对应的类别。
有哪些语义分割的方法?
在深度学习统治计算机视觉领域之前,有Texton Forests和Random Forest based classifiers等方法来进行语义分割。深度学习的方法兴起以后,在图像分类任务上取得巨大成功的卷积神经网络同样在图像语义分割任务中得到了非常大的提升。最初引入深度学习的方法是patch classification方法,它使用像素周围的区块来进行分类,由于使用了神经网络中使用了全连接结构,所以限制了图像尺寸和只能使用区块的方法。2014年出现了[Fully Convolutional Networks (FCN),FCN推广了原有的CNN结构,在不带有全连接层的情况下能进行密集预测。,因此FCN可以处理任意大小的图像,并且提高了处理速度。后来的很多语义分割方法都是基于FCN的改进。
然而将卷积神经网络应用在语义分割中也带来了一些问题,其中一个主要的问题就是池化层( pooling layers)。池化层增加了视野,但是同时也丢失了精确的位置信息,这与语义分割需要的准确的像素位置信息相矛盾。
针对这个问题,学术界主要有两种类型的解决方法。
一种是编码解码器(encoder-decoder)网络结构,编码器使用池化层逐渐减少空间维度,解码器逐渐恢复目标对象的细节和空间维度。通常从编码器到解码器的快捷连接帮助解码器更好地恢复对象细节,如下图所示。U-Net是这类方法的代表。
另一种方法是取消了池化层,并使用了空洞卷积。
条件随机场(Conditional Random Field,CRF)方法通常在后期处理中用于改进分割效果。CRF方法是一种基于底层图像像素强度进行“平滑”分割的图模型,在运行时会将像素强度相似的点标记为同一类别。加入条件随机场方法可以提高1~2%的最终评分值。
接下来是对一些有代表性的论文进行梳理,包括了从FCN开始的语义分割网络结构的演变过程。这些网络结构都使用了VOC2012进行评测。
论文梳理
按照论文的发表顺序,将会梳理一下论文:
- FCN
- SegNet
- Dilated Convolutions
- DeepLab (v1 & v2)
- RefineNet
- PSPNet
- Large Kernel Matters
- DeepLab v3
对于以上的每篇论文,下面将会分别指出主要贡献并进行解释,也贴出了这些结构在VOC2012数据集中的测试分值IOU。
FCN
Fully Convolutional Networks for Semantic Segmentation
Submitted on 14 Nov 2014
主要贡献:
- 将端到端的卷积网络推广到语义分割中
- 将Imagenet分类任务中训练好的网络结构,应用与语义分割中
- 使用反卷积层进行上采样
- 提出了跳层连接来改善上采样的粗糙程度
详细解释:
FCN将传统CNN中的全连接层转化成一个个的卷积层。如下图所示,在传统的CNN结构中,前5层是卷积层,第6层和第7层分别是一个长度为4096的一维向量,第8层是长度为1000的一维向量,分别对应1000个类别的概率。FCN将这3层表示为卷积层,卷积核的大小(通道数,宽,高)分别为(4096,1,1)、(4096,1,1)、(1000,1,1)。所有的层都是卷积层,故称为全卷积网络。
可以发现,经过多次卷积(还有pooling)以后,得到的图像越来越小,分辨率越来越低(粗略的图像),那么FCN是如何得到图像中每一个像素的类别的呢?为了从这个分辨率低的粗略图像恢复到原图的分辨率,FCN使用了上采样。例如经过5次卷积(和pooling)以后,图像的分辨率依次缩小了2,4,8,16,32倍。对于最后一层的输出图像,需要进行32倍的上采样,以得到原图一样的大小。
这个上采样是通过反卷积(deconvolution)和跳层连接实现的。对第5层的输出(32倍放大)反卷积到原图大小,得到的结果还是不够精确,一些细节无法恢复。于是Jonathan将第4层的输出和第3层的输出也依次反卷积,分别需要16倍和8倍上采样,结果就精细一些了。下图是这个卷积和反卷积上采样的过程:
下图是32倍,16倍和8倍上采样得到的结果的对比,可以看到它们得到的结果越来越精确:
与传统用CNN进行图像分割的方法相比,FCN有两大明显的优点:一是可以接受任意大小的输入图像,而不用要求所有的训练图像和测试图像具有同样的尺寸。二是更加高效,因为避免了由于使用像素块而带来的重复存储和计算卷积的问题。
同时FCN的缺点也比较明显:一是得到的结果还是不够精细。进行8倍上采样虽然比32倍的效果好了很多,但是上采样的结果还是比较模糊和平滑,对图像中的细节不敏感。二是对各个像素进行分类,没有充分考虑像素与像素之间的关系,忽略了在通常的基于像素分类的分割方法中使用的空间规整(spatial regularization)步骤,缺乏空间一致性。
补充:
反池化和反卷积:
FCN在VOC2012上的得分:
SegNet
SegNet: A Deep Convolutional Encoder-Decoder Architecture for Image Segmentation
Submitted on 2 Nov 2015
主要贡献:
- 将最大池化指数转移至解码器中,改善了分割分辨率
详细解释:
在FCN网络中,通过上卷积层和一些跳跃连接产生了粗糙的分割图,为了提升效果而引入了更多的跳跃连接。
然而,FCN网络仅仅复制了编码器特征,而Segnet网络复制了最大池化指数。这使得在内存使用上,SegNet比FCN更为高效。
SegNet在VOC2012上的得分:
空洞卷积
Multi-Scale Context Aggregation by Dilated Convolutions
Submitted on 23 Nov 2015
主要贡献:
- 使用了空洞卷积,这是一种可用于密集预测的卷积层
- 提出在多尺度聚集条件下使用空洞卷积的“背景模块”
详细解释:
池化操作增大了感受野,有助于实现分类网络。但是池化操作在分割过程中也降低了分辨率。
因此,该论文所提出的空洞卷积层工作方式如下图:
空洞卷积层在不降低空间维度的前提下增大了相应的感受野指数(注:在接下来将提到的DeepLab中,空洞卷积被称为多孔卷积atrous convolution)。从预训练好的分类网络中(这里指的是VGG网络)移除最后两个池化层,而用空洞卷积取代了随后的卷积层。特别的是,池化层3和池化层4之间的卷积操作为空洞卷积层2,池化层4之后的卷积操作为空洞卷积层4。这篇文章所提出的背景模型(frontend module)可在不增加参数数量的情况下获得密集预测结果。
这篇文章所提到的背景模块单独训练了前端模块的输出,作为该模型的输入。该模块是由不同扩张程度的空洞卷积层级联而得到的,从而聚集多尺度背景模块并改善前端预测效果。
在VOC2012上的得分:
评价:
需要注意的是,该模型预测分割图的大小是原图像大小的1/8。这是几乎所有方法中都存在的问题,将通过内插方法得到最终分割图。
DeepLab (v1 , v2)
v1 : Semantic Image Segmentation with Deep Convolutional Nets and Fully Connected CRFs
Submitted on 22 Dec 2014
详细解释:
DeepLab是Google搞出来的一个model,在VOC上的排名要比CRF as RNN的效果好。Deeplab仍然采用了FCN来得到score map,并且也是在VGG网络上进行fine-tuning。但是在得到score map的处理方式上,要比原FCN处理的优雅很多。
还记得FCN中是怎么得到一个更加dense的score map的吗? 是一张500x500的输入图像,直接在第一个卷积层上conv1_1加了一个100的padding。最终在fc7层勉强得到一个16x16的score map。虽然处理上稍显粗糙,但是毕竟人家是第一次将图像分割在CNN上搞成end-to-end,并且在当时performance是state-of-the-art。
而怎样才能保证输出的尺寸不会太小而又不必加100 padding这样“粗糙的”做法呢?可能有人会说减少池化层不就行了,这样理论上是可以的,但是这样直接就改变了原先可用的结构了,而且最重要的一点是就不能用以前的结构参数进行fine-tune了。
所以,Deeplab这里使用了一个非常优雅的做法:将VGG网络的pool4和pool5层的stride由原来的2改为了1,再加上 1 padding。就是这样一个改动,使得vgg网络总的stride由原来的32变成8,进而使得在输入图像为514x514时,fc7能得到67x67的score map, 要比FCN确实要dense很多很多。
但是这种改变网络结果的做法也带来了一个问题: stride改变以后,如果想继续利用vgg model进行fine tuning,会导致后面感受野发生变化。这个问题在下图(a) (b)体现出来了,注意花括号就是感受野的大小:
感受野就是输出featuremap某个节点的响应对应的输入图像的区域。比如我们第一层是一个33的卷积核,那么我们经过这个卷积核得到的featuremap中的每个节点都源自这个33的卷积核与原图像中33的区域做卷积,那么我们就称这个featuremap的节点感受野大小为33。
具体计算公式为:
其中:(r_n)表示第n层layer的输入的某个区域,(s_n)表示第n层layer的步长,(k_n)表示kernel/pooling size
Deeplab提出了一种新的卷积,带孔的卷积:Atrous Convolution。来解决两个看似有点矛盾的问题:
既想利用已经训练好的模型进行fine-tuning,又想改变网络结构得到更加dense的score map。
如下图(a) (b)所示,在以往的卷积或者pooling中,一个filter中相邻的权重作用在feature map上的位置上是连续的。为了保证感受野不发生变化,某一层的stride由2变为1以后,后面的层需要采用hole算法,具体来讲就是将连续的连接关系是根据hole size大小变成skip连接的。上图(C)中使用hole为2的Atrous Convolution则感受野依然为7。(C)中的padding为2,如果再增加padding大小,是不是又变”粗糙”了?当然不会,因为是Atrous Convolution,连接是skip的,所以2个padding不会同时和一个filter相连。
所以,Atrous Convolution能够保证这样的池化后的感受野不变,从而可以fine tune,同时也能保证输出的结果更加精细。即:
DeepLab后面接了一个全连接条件随机场(Fully-Connected Conditional Random Fields)对分割边界进行refine。 CRF简单来说,能做到的就是在决定一个位置的像素值时(在这个paper里是label),会考虑周围邻居的像素值(label),这样能抹除一些噪音。但是通过CNN得到的feature map在一定程度上已经足够平滑了,所以short range的CRF没什么意义。于是作者采用了fully connected CRF,这样考虑的就是全局的信息了。
另外,CRF是后处理,是不参与训练的,在测试的时候对feature map做完CRF后,再双线性插值resize到原图尺寸,因为feature map是8s的,所以直接放大到原图是可以接受的。
v2 : DeepLab: Semantic Image Segmentation with Deep Convolutional Nets, Atrous Convolution, and Fully Connected CRFs
Submitted on 2 Jun 2016
v1之后,论文作者又推出了DeepLab的v2版本。这里就简单讲讲改进的地方。
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的
在VOC2012上的得分:
RefineNet
RefineNet: Multi-Path Refinement Networks for High-Resolution Semantic Segmentation
Submitted on 20 Nov 2016
主要贡献:
- 带有精心设计解码器模块的编码器-解码器结构
- 所有组件遵循残差连接的设计方式
详细解释:
使用空洞卷积的方法也存在一定的缺点,它的计算成本比较高,同时由于需处理大量高分辨率特征图谱,会占用大量内存,这个问题阻碍了高分辨率预测的计算研究。DeepLab得到的预测结果只有原始输入的1/8大小。所以,这篇论文提出了相应的编码器-解码器结构,其中编码器是ResNet-101模块,解码器为能融合编码器高分辨率特征和先前RefineNet模块低分辨率特征的RefineNet模块。
每个RefineNet模块包含一个能通过对较低分辨率特征进行上采样来融合多分辨率特征的组件,以及一个能基于步幅为1及5×5大小的重复池化层来获取背景信息的组件。这些组件遵循恒等映射的思想,采用了残差连接的设计方式。
在VOC2012上的得分:
PSPNet
Pyramid Scene Parsing Network
Submitted on 4 Dec 2016
主要贡献:
- 提出了金字塔池化模块来聚合背景信息
- 使用了附加损失(auxiliary loss)
详细解释:
全局场景分类很重要,由于它提供了分割类别分布的线索。金字塔池化模块使用大内核池化层来捕获这些信息。和上文提到的空洞卷积论文一样,PSPNet也用空洞卷积来改善Resnet结构,并添加了一个金字塔池化模块。该模块将ResNet的特征图谱连接到并行池化层的上采样输出,其中内核分别覆盖了图像的整个区域、半各区域和小块区域。
在ResNet网络的第四阶段(即输入到金字塔池化模块后),除了主分支的损失之外又新增了附加损失,这种思想在其他研究中也被称为中级监督(intermediate supervision)。
在VOC2012上的得分:
大内核
Large Kernel Matters -- Improve Semantic Segmentation by Global Convolutional Network
Submitted on 8 Mar 2017
主要贡献:
- 提出了一种带有大维度卷积核的编码器-解码器结构。
详细解释:
这项研究通过全局卷积网络来提高语义分割的效果。
语义分割不仅需要图像分割,而且需要对分割目标进行分类。在分割结构中不能使用全连接层,这项研究发现可以使用大维度内核来替代。
采用大内核结构的另一个原因是,尽管ResNet等多种深层网络具有很大的感受野,有相关研究发现网络倾向于在一个小得多的区域来获取信息,并提出了有效感受野的概念。
大内核结构计算成本高,且具有很多结构参数。因此,k×k卷积可近似成1×k+k×1和k×1+1×k的两种分布组合。这个模块称为全局卷积网络(Global Convolutional Network, GCN)。
接下来谈结构,ResNet(不带空洞卷积)组成了整个结构的编码器部分,同时GCN网络和反卷积层组成了解码器部分。该结构还使用了一种称作边界细化(Boundary Refinement,BR)的简单残差模块。GCN结构:
在VOC2012上的得分:
DeepLab v3
Rethinking Atrous Convolution for Semantic Image Segmentation
Submitted on 17 Jun 2017
主要贡献:
- 改进了空间维度上的金字塔空洞池化方法(ASPP)
- 该模块级联了多个空洞卷积结构
详细解释:
与在DeepLab v2网络、空洞卷积中一样,这项研究也用空洞卷积/多空卷积来改善ResNet模型。这篇论文还提出了三种改善ASPP的方法,涉及了像素级特征的连接、加入1×1的卷积层和三个不同比率下3×3的空洞卷积,还在每个并行卷积层之后加入了批量归一化操作。
级联模块实际上是一个残差网络模块,但其中的空洞卷积层是以不同比率构建的。这个模块与空洞卷积论文中提到的背景模块相似,但直接应用到中间特征图谱中,而不是置信图谱。置信图谱是指其通道数与类别数相同的CNN网络顶层特征图谱。
该论文独立评估了这两个所提出的模型,尝试结合将两者结合起来并没有提高实际性能。两者在验证集上的实际性能相近,带有ASPP结构的模型表现略好一些,且没有加入CRF结构。
这两种模型的性能优于DeepLab v2模型的最优值,文章中还提到性能的提高是由于加入了批量归一化层和使用了更优的方法来编码多尺度背景。
在VOC2012上的得分:
References:
blog.qure.ai
QbitAI
从FCN到DeepLab
A Review on Deep Learning Techniques Applied to Semantic Segmentation 翻译
PASCAL VOC Challenge performance evaluation