一些废话:
好久没写综述之类的文章,本文 的发展史是基于去年和前年读的语义分割的论文,在去年的时候写的。毕业之际将自己手头有的资料分享出来。话不多说开始学习!!!
前言:
你不得不了解的人工智能基础知识
你不得不了解的机器学习知识
你不得不了解的深度学习知识(一)
你不得不了解的深度学习知识(二)
你不得不了解的卷积神经网络发展史
你不得不了解的目标检测发展史
在进入本文之前,大家可以看看上面的文章看看是否有你需要了解的知识。
计算机视觉
计算机视觉中的三大类任务:
- 分类 Classification:解决“是什么?”的问题,即给定一张图片或一段视频判断里面包含什么类别的目标
- 定位 Location:解决“在哪里”的问题,即定位出这个目标的位置
- 检测 Detection:解决“是什么?在哪里”的问题,即定位出这个目标的位置并且知道目标物是什么
- 分割 Segmentation:分为实例分割和场景分割,解决“每一个像素属于哪个目标物或场景”的问题。
语义分割与实例分割
语义分割
图像语义分割,它是将整个图像分成一个个像素组,然后对其进行标记和分类。特别地,语义分割试图在语义上理解图像中每个像素的角色。
如下图所示:
这里,除了识别人、道路、汽车、数目等之外,还必须确定每个物体的边界。因此,与分类不同,我们需要用模型对密集的像素进行预测。
实例分割
除了语义分割之外,实例分割将不同类型的实例进行分类,比如用5种不同颜色来标记汽车。分类任务通常来说就是识别出包含单个对象的图像是什么,但在分割实例时,我们需要执行更复杂的任务。我们会看到多个重叠物体和不同背景对的复杂景象,我们不仅需要对这些不同的对象进行分类,而且还要确定对象的边界、差异和彼此之间的关系!
语义分割发展史
语义分割介绍
图像语义分割可以说是图像理解的基石性技术,在自动驾驶系统中举足轻重。众所周知,图像是由一个个像素(Pixel)组成的,而语义分割就是将图像中表达语义含义的不同进行分组(Grouping)/分割(Segmentation)
。语义图像分割就是将每个像素都标注上其对应的类别。需要注意的是,这里不但单独区分同一类别的不同个体,而是仅仅关系该像素是属于哪个类别。
分割任务对于许多任务都非常有用,比如自动驾驶汽车(为了使自动驾驶汽车能够适应现存道路,其需要具有对周围环境的感知能力);医疗图像判断(可以通过机器辅助放射治疗师的分析,从而加速放射检查)
语义分割的任务描述
简而言之,我们给定一幅RGB彩色图像或一幅灰度图像,会输出一个分割图谱,其中包括每个像素的类别标注。具体如下图所示:
与图像分类的做法相似,这里也是创建一个one-hot编码的类别标注–本质上即为每个类别创建一个输出通道。
之后,预测的结果可以通过对每个像素在深度上求argmax
的方式被整合到一张分割图上,从而,我们就可以很轻松的观察看每个目标
谈到语义分割模型的开端,就要从一个FCN说起。
FCNN(全卷积神经网络)
论文地址:Fully Convolutional Networks for Semantic Segmentation (2015 CVPR)
FCN将特征提取层迁移到了分割任务中,并通过“fine-tuning”防晒霜对这部分参数进行更新。同时,设计了一种新颖的结构能够结合浅层语义和高层语义,从而获得精度更高的分割结果。
FCN的特点
-
卷积化(Convolutional):将分类网络的特征提取层迁移到语义分割结构中
-
上采样(Upsample):采用基于双线性插值滤波作为初始值的deconvolutions的方式对"低分辨率"的语义特征进行上采样
-
跳跃结构(Skip Layer):将encoder不同"层面"的特征进行融合(这些不同"层面"的特征具有不同"粗糙程度"的语义信息)
FCN由来
在卷积神经网络发展史中,可以看到CNN在图像分类方面已经取得了巨大的成就,CNN的强大之处在于它能自动学习特征:
- 较浅的卷积层感知域较小,能够学习到一些局部区域的特征;
- 较深的卷积层具有较大的感知域,能够学习到更加抽象一些的特征;
这些抽象特征对物体大小、位置和方向等敏感性更细,从而有助于分类性能的提高,可以很好的判断出一幅图像中包含什么类别的物体。而图像分类是图像级别的
。
与分类不同的是,语义分割需要判断图像中每个像素点的类别,进行精确分割,图像语义分割是像素级别的!
但是由于CNN在进行convolution和pooling丢失了图像细节,即feature map size逐渐减少,而这并不能很好地之处物体的具体轮廓,指出每个像素具体属于哪个物体,无法做到精确的分割。
而针对这个问题,2014年Jonathan Long等人提出了全卷积神经网络(Fully Convolutional Networks)用于图像语义分割。自从提出后,FCN已经成为语义分割的基本框架,后续算法其实都是在这个框架中改进而来。
FCN原理
FCN(Fully Convolutional Networks)全卷积,我们可以从名字中得到该网络并没有全连接层,全部用卷积层来替代了,全卷积的话也是其它领域深度模型的一个趋势。
卷积化(Convolutional)
FCN将传统CNN中的全连接层转化成一个个的卷积层。如下图所示,在传统的CNN结构中,前5层是卷积层,第6层和第7层分别是一个长度为4096的一维向量,第8层是长度为1000的一维向量,分别对应1000个类别的概率。FCN将这3层表示为卷积层,卷积核的大小(通道数,宽,高)分别为(4096,1,1)、(4096,1,1)、(1000,1,1)。所有的层都是卷积层,故称为全卷积网络。
卷积化即将普通的分类网络,比如VGG16,ResNet50/101等网络丢弃全连接层,换上对应的卷积层即可。
上采样(Upsample)
上采样(upsampling)一般包括两种方式:
- Resize:如线性插值直接缩放,类似于图像缩放
- Deconvolution:反卷积
可以发现,经过多次卷积(还有pooling)以后,得到的图像越来越小,分辨率越来越低(粗略的图像),那么FCN是如何得到图像中每一个像素的类别的呢?为了从这个分辨率低的粗略图像恢复到原图的分辨率,FCN使用了上采样。例如经过5次卷积(和pooling)以后,图像的分辨率依次缩小了2,4,8,16,32倍。对于最后一层的输出图像,需要进行32倍的上采样,以得到原图一样的大小。这个上采样是通过反卷积(deconvolution)实现的。
为了得到和原图等大的分割图,我们需要上采样/反卷积。反卷积和卷积类似,都是相乘相加的运算。只不过后者是多对一,前者是一对多。
跳跃连接(Skip Layer)
在常规的CNN分类结构中,pooling层能够增大感受野的同时降低feature map的“分辨率”。这在分类中起作用的原因主要在于分裂任务中我们只关心图片是否存在某种物体而不关心该物体的具体位置(即位置不敏感),因此pooling层被引入到每个卷积块的后面,能够帮助随后的卷积块从池化层提取更抽象的特征。
但在语义分割任务汇总,pooling或者strided convolutions会导致空间信息的丢失,大部分后续的分割结构都是在decoder上面试图“修复”因为encoder过程下采样所导致的信息损失。在FCN-8s,通过融合encoder阶段不同“层”对应不同“分辨率”的信息(conv3,conv4和fc7)来增强空间和特征信息,从而加强分割效果。
对第5层的输出(32倍放大)反卷积到原图大小,得到的结果还是不够精确,一些细节无法恢复。于是Jonathan将第4层的输出和第3层的输出也依次反卷积,分别需要16倍和8倍上采样,结果就精细一些了。
这个结构作用在于优化结果,因为如果将全卷积之后的结果直接上采样得到的结果是很粗糙的,所以作者将不同池化层的结果进行上采样之后来优化输出。具体结构如下:
- 用pool5的输出作为上采样(反卷积)的输入,由于经过了5个池化层,图像被缩小到原始图像的1/32,所以使用上采样将pool5的输出放大32倍,得到一个32倍放大的分割图。
- 用pool5的输出采用上采样2倍放大,与pool4的输出叠加后,再经过上采样16倍放大,得到一个输出16倍放大的分割图。
- 将pool5和pool4的叠加和2倍放大后,再叠加pool3的输出,然后进行上采样8倍放大,最后得到一个8倍放大的分割图。
需要说明的是途中nx是指对应的特征图上采样n倍(即变大n倍),并不是指有n个特征图,如32x unsampled中的32x是图像只变大32倍。
FCN结果
上图就是三种分割方案与真实分割的对比,显然,采用第三种分割方案的分辨率更高。这是由于,仅采用pool5的输出做上采样进行32倍放大,由于pool5输出的每一个元素的感受域更大,导致原始图像中很多细节的特征丢失,所以得到的分割图就相对比较粗糙。而后面的两种方案,分别加进了前面池化层的输出,由于前面池化层的输出数据的每一个元素的感受域相对较小,所以很多原始图像的细节特征得以保留,得到的分割图的分辨率就更高
感受域主要取决于卷积和池化的kernel和stride的大小。如上动图,在kernel大小为3*3,stride为1时,经过一个卷积层后,每一个像素的感受域即为9。所以在经过更多层卷积和池化后,图片的维度越来越小,每个元素的感受域也就会越来越大。
SegNet
SegNet: A Deep Convolutional Encoder-Decoder Architecture for Image Segmentation
SeNet的主要创新点是在于将decoder上“低分辨率”的特征上采样的方式。decoder“找到”encoder对应的“分辨率”上采样用的pool时对应的下标来进行上采样。这样就省去了上采样的学习过程。获得的上采样maps是稀疏的,然后通过后续的卷积学习来获得稠密的feature maps。
SegNet的网络结构,其中蓝色代表卷积+Batch Normalization+ReLU,绿色代表max-pooling,红色代表上采样,黄色是Softmax。
SegNet技术点:
- 提出一种encoder-decoder的分割网络架构
- 采用unpooling来对decoder上的特征层进行上采样,从而来保持分割中的空间信息。
- encoder并没有任何全连接层,因此所需的参数量更少(轻量级网络)
SegNet由来
SegNet是基于FCNN架构提出的,上图为SegNet的网络结构图,Encoder交替采用conv+pooling,Decoder交替采用deconv+upsampling,用Softmax做像素分类。在Encoder-Decoder过程中,采用Pooling Indices(pooling时的位置信息)转移Decoder,改善了图像分割率(参考DeconvNet)。
最大池化可以实现在输入图像上进行小的空间位移时保持平移不变性。连续的下采样导致了在输出的特征图上,每一个像素都重叠着着大量的输入图像中的空间信息。对于图像分类任务,多层最大池化和下采样由于平移不变性可以获得较好的鲁棒性,但导致了特征图大小和空间信息的损失。图像分割任务中边界划分至关重要,而这么多有损边界细节的图像表示方法显然不利于分割。因此,在进行下采样之前,在编码器特征映射中获取和存储边界信息是十分重要的。如果推理过程中的内存不受约束,则所有编码器特征映射(在下采样后)都可以存储。在实际应用中,情况通常不是这样,因此我们提出了一种更有效的方法来存储这些信息。它只存储最大池化索引,即存储每个池化窗口中最大特征值的位置,用于每个编码器特征映射。
SegNet原理
编解码器
SegNet是编解码器结构,具体来说,编码器的任务是给定输入图像后,通过神经网络学习得到输入图像的特征图谱;而解码器则在编码器提供特征图谱之后,逐步实现每个每个像素的类别标注,也就是分割。
解码方式
SegNet与FCN的对应结构相比,体量要小很多。这主要得益于SegNet中为了权衡计算量而采取的操作:用记录的池化过程的位置信息替代直接的反卷积操作。具体如下图所示。
对比SegNet和FCN实现Decoder的过程。SegNet保留pooling时的位置信息,upsampling时直接将数据放在原先的位置,而FCN采用transposed convolutions+双线性插值,每一个像素都是运算后的结果。
如上图所示:在encoder阶段记录下来max-pooling层对应的下标,之后在decoder阶段进行上采样时,利用记录的下标来帮助进行上采样。虽然这能够帮助保留高频信息,但是在对"低分辨率"的feature maps进行unpooling会缺乏"邻近信息"。
SegNet结果
不同decoder实验分析
为验证不同decoder结构的表现,作者针对SegNet以及FCN网络设计了不同的decoder结构,并进行了详细的实验分析
其中,解码网络架构如下:
- Bilinear-Interpolation : 双线性插值上采样。
- SegNet-Basic: 4*(encodes[conv+bn+relu+maxpooling] + decoders[conv+bn]) ,kenel size: 7*7。
- SegNet-Basic-SingleChannelDecoder: decoder采用单通道滤波器,可以有效减少参数数量
- SegNet-Basic-EncoderAddition: 将decoder与encoder对应的特征图相加。
- FCN-Basic:与SegNet-Basic具有相同的encoders,但是decoders采用FCN的反卷积方式。
- FCN-Basic-NoAddition:去掉特征图相加的步骤,只学习上采样的卷积核。
- FCN-Basic-NoDimReduction: 不进行降维。
通过上表分析,可以得到如下分析结果:
- bilinear interpolation 表现最差,说明了在进行分割时,decoder学习的重要性。
- SegNet-Basic与FCN-Basic对比,均具有较好的精度,不同点在于SegNet存储空间消耗小FCN-Basic由于feature map进行了降维,所以时间更短。
- SegNet-Basic与FCN-Basic-NoAddition对比,两者的decoder有很大相似之处,SegNet-Basic的精度更高,一方面是由于SegNet-Basic具有较大的decoder,同时说明了encoder过程中低层次feature map的重要性。
- FCN-Basic-NoAddition与SegNet-Basic-SingleChannelDecoder:证明了当面临存储消耗,精度和inference时间的妥协的时候,我们可以选择SegNet,当内存和inference时间不受限的时候,模型越大,表现越好。
最终的效果展示图
U-Net
论文地址:U-Net: Convolutional Networks for Biomedical Image Segmentation 2015 MICCAI
该结构由一条“收缩路径”(主要捕获特征信息)和一条“扩展路径”(主要帮助获取更精准的空间信息)。这种网络结构只需少量的数据进行端到端的学习就能超过之前最好的方法。
Decoupled deep neural network for semisupervised semantic segmentation
U-Net技术点
- U-Net简单地将encoder的特征层与进行了上采样的“分辨率”decoder的特征层进行concat操作,从而形成“阶梯结构”。
- 该结构通过concatenation的连接方式,从而允许不同阶段的decoder层能够弥补encoder因为pooled等操作丢失的信息。(因为这部分信息包含在与之进行concat的encoder对应层)。
- 支持少量的数据训练模型,速度快。
U-Net由来
U-Net原理
U-Net结果
U-Net在只包含了30幅标注了的医学图像上以及一些其他医学图像数据集上取得了state-of-art的结果。虽然U-Net最初是试验在医学图像上面,但是发现在其他一些领域,例如卫星图像分割上面也取得了非常好的效果。
Fully Convolutional DenseNets
论文地址:The One Hundred Layers Tiramisu: Fully Convolutional DenseNets for Semantic Segmentation
在这篇文章中,作者将DenseNets扩展到语义分割问题上面,提出的方法相比其它网络结构所需的参数更少。
Fully Convolutional DenseNet采用DenseNet作为encoder的基础架构,并且采用和U-Net类似的concat方法对encoder和decoder的特征进行结合。
PSPNet(2017 CVPR)
论文地址:PSPNet: Pyramid Scene Parsing Network
在这篇文章中,作者主要利用Pyramid pooling module来整合不同区域的context从而获取全局的context,整个结构称之为pyrmid scene parsing network(PSPNet)。作者采用的结构在场景解析任务中取得了非常好的效果,且这种结构对像素级别的预测任务是非常有效的。
创新点:
- PSPNet对基础结构ResNet的卷积采用dilated convolution。且在整个encoder部分,特征经过最初的pooling之后一直保持相同的“分辨率”(为原输入图像的1/4),直到进入spatial pooling module
- 在训练时引入了auxillary loss来帮助ResNet学习(训练技巧)
- 引入Spatial Pyrmid Pooling模块来整合不同区域的context从而获取更好的全局context。
RefineNet
论文地址: RefineNet: Multi-Path Refinement Networks for High-Resolution Semantic Segmentation
在这篇文章中,作者提出了RefineNet,将粗糙的高层语义特征和细粒度的低层特征融合。
RefineNet解决空间信息丢失的手段和PSPNet(采用计算代码更高的dilated convolutions)是非常不同的。作者采用RefineNet blocks不断增大池化后的特征的分辨率,最后产生高分辨率的segmentation map。
该架构的一些特点:
- multiple resolutions:采用多种不同分辨率对的输入,对提取的特征进行融合,并将其作为下一阶段的输入。
- Chained Residual Pooling:引入了Chained Residual Pooling,能够从图片大块区域中捕获背景信息。相当于对特征采用不同大小的窗进行池化并采用residual connections将其进行融合。
- 所有的特征融合均采用sum操作,从而允许端到端的训练
- 采用原始的ResNet而不是dilated convolutions。
数据集
| Dataset | Training | Testing | #Classes|
|------------------------------------ |--------------------- | | |
| CamVid| 468| 233 | 11 |
| PascalVOC2012 | 9963 | 1447 | 20 |
| NYUDv2 | 795 |645 |40 |
| Cityscapes | 2975 |500 |19 |
| Sun-RGBD | 10355 |2860 |37 |
| MS COCO ‘15 | 80000 |40000 |80 |
| ADE20K | 20210 |2000 |150 |
DANet
Dual Attention Network for Scene Segmentation (CVPR2019)
本文通过自注意力机制(self-attention)来捕获丰富的上下文依赖(rich contextual dependencies)。提出了DANet来自适应地整合局部特征与其全局依赖关系(global dependencies)。具体来说,通过引入空间(spatial)维度和通道(channel)维度的两种attention模块来建模语义依赖关系。Spatial attention module将所有位置的特征的加权和来选择性地聚合每个位置的特征。Channel attention module通过整合所有channel maps来选择性地强调某些相互依赖的channel maps。最后通过融合两个attention module的feature来提升语义分割的特征表达。
总结
基于FCN的分割
- FCN:首先将FCN用到语义分割–利用deconvolution作为上采样,以及结合skip connection来“修正”空间信息。
- SegNet:采样unpooling的方式进行上采样
- U-Net:“阶梯结构”,且采样concat操作
- Fully Convolutional DenseNets:将U-Net里面的基础架构改为DenseNet的Block
- E-Net和Link Net:主要为了消减参数
- PSPNet:引入Pyramid pooling module:整合不同区域的context从而获取全局的context
- RefineNet:通过RefineNet结构将粗糙的高层语义特征和细粒度的低层特征进行融合