赞
踩
基于图像的语义分割又被理解为密集的像素预测,即将每个像素进行分类,这不仅仅对于算法是一个考验,而且对于硬件的计算性能也有很高的要求。
因此,本文从两方面着手考虑,一方面是基于语义分割经典网络的介绍,向大家展示语义分割方向上的,经典的网络模型。另一方面,从计算的性能入手,向大家介绍一下语义分割方向的轻量化模型。
论文地址:
https://arxiv.org/abs/1411.4038
代码实现地址:
https://github.com/MarvinTeichmann/tensorflow-fcn[Tensorflow]
FCN神经网络作为深度学习中,语义分割网络的经典之作,是必须要理解和掌握的一个网络结构,它借鉴了传统的分类网络结构,而又区别于传统的分类网络,将传统分类网络的全连接层转化为卷积层。然后通过反卷积(deconvolution)进行上采样,逐步恢复图像的细节信息并扩大特征图的尺寸。
在恢复图像的细节信息过程中,FCN一方面通过可以学习的反卷积来实现,另一方面,采用了跳跃连接(skip-connection)的方式,将下采样过程中得到的特征信息与上采样过程中对应的特征图相融合。
虽然从目前的研究来看,FCN存在着诸如语义信息丢失,缺乏对于像素之间关联性的研究,但是FCN引入了编码-解码的结构,为深度学习在语义分割方向上的应用打开了一扇大门,也为后续的研究做出了许多借鉴之处。
FCN-8s在VOC-2012上的准确率如下图所示:
论文地址:
https://arxiv.org/abs/1511.00561
代码实现地址:
https://github.com/tkuanlun350/Tensorflow-SegNet[Tensorflow]
SegNet采用了FCN的编码-解码的架构,但是与FCN不同的是,SegNet没有使用跳跃连接结构,并且在上采样的过程中,不是使用反卷积,而是使用了unpooling的操作。
SegNet相较于FCN有了两点的改进。第一,由于unpooling不需要进行学习,所以相比于FCN,SegNet的参数数量明显下降,从而降低了计算量。第二,由于SegNet在解码器中使用那些存储的索引来对相应特征图进行去池化操作。从而保证了高频信息的完整性,但是对于较低分辨率的特征图进行unpooling时,同样会忽略像素近邻之间的信息。
SegNet在CamVid数据集上的测试结果如下图所示:
deeplab系列是由Google团队设计的一系列的语义分割网络模型。是一个不断进化改进的过程,通过阅读deeplab系列的论文,理解作者一步步的改进思路,无论对于文章的理解,还是设计我们自己的网络结构,都有很大的帮助。
deeplabv1的设计亮点在于,采用了空洞卷积和CRF的处理。利用空洞卷积在不增加参数的情况下扩大了感受野的范围。而CRF的后期处理可以更好的提升语义分割的准确率。deeplabv2在v1的基础之上增加了ASPP(空洞空间金字塔池化)模块。如下图所示:
通过不同尺度的空洞率来提取不同尺寸的特征,更好的融合不同的特征,达到更好的分割效果。
deeplabv3的创新点有两个,一个是改进了ASPP模块,第二个是参考了HDC的设计思想,也就是横纵两种结构。对于改进的ASPP模块,如下图所示。
对比于v2的ASPP模块,可以发现V3的ASPP模块增加了一个1x1的卷积和全局池化层。对于ASPP模块的构建,作者采用了“纵向”的设计方式,如下图所示:
与”纵向“向对应的是”横向“的设计,如下图所示:
作者将conv4的结构连续复制了3次,后面的每一个block块都有一个基础的空洞率,而在每一个block块里面,作者又参考了HDC的思想,将卷积层的空洞率设计为[1,2,1]的形式。这里的[1,2,1]设计模式是作者经过试验得到的最好设计结构。deeplabv3+的设计相较于v3有两点改进,第一点是解码的方式,第二点是采用改进后的xception网络作为backbone。下图是deeplabv3+原文中对于v3和v3+以及编码-解码结构的模型对比。
deeplabv3+文章中使用了两种backbone,分别是Resnet101和改进后的xception网络。通过文章中的实验对比,以改进后的xception作为backbone效果要优于Resnet101。
deeplab的官方也发布过一个ppt,讲述的是deeplab v1,v2和v3的主要区别,大家可以从ppt中获取到更多的信息。下载链接:
http://web.eng.tau.ac.il/deep_learn/wp-content/uploads/2017/12/Rethinking-Atrous-Convolution-for-Semantic-Image-Segmentation-1.pdf。
deeplabv1论文地址:
https://arxiv.org/abs/1412.7062
deeplabv2论文地址:
https://arxiv.org/abs/1606.00915
deeplabv3论文地址:
https://arxiv.org/abs/1706.05587
deeplabv3+论文地址:
https://arxiv.org/abs/1802.02611
deeplabv3 代码实现地址:
https://github.com/rishizek/tensorflow-deeplab-v3[Tensorflow]
deeplabv3+ 代码实现地址:
https://github.com/rishizek/tensorflow-deeplab-v3-plus[Tensorflow]
论文地址:
https://arxiv.org/abs/1611.06612
代码实现地址:
https://github.com/eragonruan/refinenet-image-segmentation[Tensorflow]
RefineNet提出了一种多路径的提炼网络,通过使用远距离的残差连接,尽可能多的利用下采样过程中的信息。从而得到高分辨率的预测图。文章通过细心的设计RefineNet模块,通过链式残差池化(CRP)来融合上下文信息,将粗糙的深层特征和细节特征进行融合。实现了端到端的训练。文章针对于目前语义分割存在的问题进行改进。
目前的分割算法采用降采样使得很多的细节信息丢失,这样得到的结果较为粗糙。而针对于这种情况,文章的Introduction部分介绍了目前的主要改进方式。
作者围绕如何有效的利用各个层的信息,设计了RefineNet网络结构,如下图所示:
该网络将不同分辨率的特征图进行融合,通过上图左侧的ResNet101预训练模型,产生四个分辨率的特征图,然后将四个特征图分别通过对应的RefineNet block模块进行进行融合。由上图也可以看出,除了RefineNet-4模块外,其余的RefineNet block都是有两个输入,用于不同尺寸特征图的提炼融合。RefineNet block的细节图如下所示。
主要的组成部分包括Residual convolution unit(RCU,残差卷积单元), Multi-resolution fusion(MRF,多分辨率融合),Chained residual pooling(CRP,链式残差池化)和最后的Output convolutions(输出卷积 )。其中各个部分的作用为:
RefineNet再VOC2012数据集上的测试结果如下图所示:
论文地址:
https://arxiv.org/abs/1612.01105
代码实现地址:
https://github.com/hellochick/PSPNet-tensorflow[Tensorflow]
PSPnet全称为Pyramid Scene Parsing Network ,它采用的金字塔池化模块,来融合图像的上下文信息,注重像素之间的关联性。如何理解像素之间的关联性和图像中的上下文信息呢?比如我们看到了一个物体,由于拍摄角度,光线等问题,很难从物体本身来分别它究竟是条船还是一辆小汽车。但是我们知道船在水里,而车在路上,因此,结合物体所处的周围环境信息,就能很好的分辨这个物体是什么了。PSPnet利用预训练模型提取特征后,将采用金字塔池化模块提取图像的上下文信息,并将上下文信息与提取的特征进行堆叠后,经过上采样得到最终的输出。而特征堆叠的过程其实就是讲目标的细节特征和全局特征融合的过程,这里的细节特征指的是浅层特征,也就是浅层网络所提取到的特征,而全局特征指的是深层的特征,也就是常常说的上下文特征。对应的就是深层网络提取的特征。
PSPNet在VOC2012上的测试结果如下图所示:
以上介绍的是近些年来的深度学习领域中语义分割方向比较经典的文章,上述的文章注重的是分割准确率的提升,但是在计算速度上并不是很出色。下面为大家介绍的是语义分割领域的轻量化模型。轻量化模型在注重计算的速度的同时,也保证了分割的准确率。
论文地址:
https://arxiv.org/abs/1606.02147
代码地址:
https://github.com/kwotsin/TensorFlow-ENet[Tensorflow]
ENet是基于SegNet改进的实时分割的轻量化模型,相比于SegNet,ENet的计算速度提升了18倍,计算量减少了75倍,参数量减少了79倍。并且在CityScapes和CamVid的数据集上,ENet的效果都要好于SegNet。ENet作为轻量化模型,设计的初衷就是如何最大限度的减少计算量,提升计算速度。ENet的网络架构如下图所示。
其中initial block 和bottleneck分别如下所示。
从提升网络的计算速度来看,文章主要有以下几点改进。
从提升网络的准确率来看,文章主要有以下的几点改进。
论文地址:
https://arxiv.org/abs/1704.08545
代码实现地址:
https://github.com/hellochick/ICNet-tensorflow[Tensorflow]
ICNet是针对于高分辨率图片的实时分割模型,网络设计的目标是能够快速分割,同时保证一个合适的准确率。ICNet采用了多尺度的图像输入,首先让低分辨率的图像经过一个Heavy CNN,得到较为粗糙的预测特征图,然后提出了级联特征融合单元和级联标签指导的策略,来引入中、高分辨率的特征图,逐步提高精度。整个网络的结构如下图所示。
该网络结构十分有趣,值得学习,对于较低分辨率的输入图像,ICNet采用Heavy CNN来提取网络的特征,这里的Heavy CNN可以看作是计算量较大的编码器。而针对于中、高分辨率的输入图像而言,ICNet采用的网络层数以此减少,这样,虽然较低分辨率的输入图像经过了最深层的网络结构,但是由于其分辨率较小,因此计算量也受到了限制。而较高分辨率的输入图像,则是采用较浅的网络结构,计算量同样得到降低。这样,就利用了低分辨率图片的高效处理和高分辨率图片的高推断质量。而这也恰恰是ICNet和其他cascade structures网络结构不同的地方,虽然也有其他的网络从单一尺度或者多尺度的输入融合不同层的特征,但是其他的网络都是采取的是所有的输入经过相同的网络,这就会造成计算量的加大,从而使得计算的速度大大降低。
上图中的CFF(cascade feature fusion unit) 就是级联特征融合单元。如下图所示。
CFF模块用来融合不同分辨率的输入,与反卷积相比,CFF使用二线性插值上采样+空洞卷积的组合只需要更小的卷积核来获取相同大小的感受野,而且空洞卷积可以整合相邻像素的特征信息,而直接上采样使得每个元素变得相对孤立,缺少了像素与周围像素之间的关联。
ICNet在Cityscapes数据集上的表现如下图所示。
CGNet网络的核心架构是文章提出的CG模块,也就是上下文指导模块。CG模块能够学习局部特征和周围环境上下文的联合特征,并通过引入全局上下文特征进一步改善联合特征。文中指出CG模块的四个优势,分别是:
CGNet的网络结构如下图所示。
CGNet的网络架构遵循了“深而浅”的原则,整个网络只有51层。并且CG模块采用的是逐通道卷积(channel-wise convolutions)的方式。从而降低了计算的成本。
CG模块的结构如下图所示。
CG模块还采用了残差学习来学习高复杂度的特征并在训练期间改善梯度反向传播。文中提出了两种方式,分别为局部残差学习(LRL)和全局残差学习(GRL)。LRL将输入和联合特征提取器进行连接,GRL则是将输入和全局特征提取器进行连接。从直观上来说,GRL比LRL更能促进网络中的信息传递,而文章后面的实验也证明,GRL更能提升分割精度。
以上总结是基于深度学习中语义分割领域的经典算法和轻量化模型。随着技术的发展和硬件条件的不断进步,基于像素级别的分割才是图像分类的主流方向。从FCN至今的短短几年,语义分割技术已经取得了很大的发展,越来越多的新颖的技术不断的被提出。小编总结了最近几年的文章,总结了一下未来的语义分割发展方向,仅供大家参考。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。