【计算机视觉】最全语义分割模型总结(从FCN到deeplabv3+)

一、前言

语义分割是指对图片中的像素进行类别上的分类,有别于实例分割,不能区分同一类别的不同个体。

参考文献:

  1. https://mp.weixin.qq.com/s/2EMOHeG_Z0CKHs1YwKL0uA
  2. https://zhuanlan.zhihu.com/p/27794982

1.1 语义分割

语义分割是计算机视觉中很重要的一个方向。

不同于目标检测和识别,语义分割实现了图像像素级的分类。

它能够将一张图片或者视频(视频以帧来提取的话其实就是图片),按照类别的异同,将图像分为多个块。如下图所示:

在这里插入图片描述
明白了分割就是将图像按类别划分为不同的块,那么我们如何来理解语义这个词语呢。

我们知道一句话或者一篇文章,都有其表达的意思,这叫做语义。

同样,当我们看见一张图片时,我们能够通过我们的大脑很快明白其意思,图像表达出的意思就是图像的语义。

语义分割就是将一张图片,表达成机器能够读懂的语言。那么,我们就需要对图像进行操作,将不同类型的事物分割。

语义分割有较多的方法,大致可以分成两类,一类是传统的方法,一类是基于深度学习的方法。其中,基于深度学习的语义分割,目前已经具有较大的发展,并且能够使用在一些现实生活中的场合里。

此外,还有两个与语义分割类似的说法,但是不是属于同一种概念。

  • 实例分割:实例分割就是对同一类的不同对象也要进行分割,比如说,语义分割会将车分为一类,人分为另一类。但是,实例分割不同的是,它会将车继续进行分类,每一辆车都是一个实例类别。
  • 全景分割:简单地来讲,全景分割是实例分割与语义分割的结合。全景分割中的每一个像素点都会分成对应的语义标签和实例标签。如果一种类别里有多个实例,会用不同的颜色进行区分,我们可以知道哪个像素属于哪个类中的哪个实例。

下图中,子图a、b、c、d分别表示图像、语义分割、实例分割和全景分割。通过图应该可以更好地区分它们:

在这里插入图片描述

本文对从FCN开始的语义分割网络进行了一些总结。

二、FCN:CNN语义分割的开山之作

在这里插入图片描述

2.1 结构

简单来说,FCN在网络上的改变就是基于当时最好的图像分类模型,将最后的全连接层替换成了卷积层,这样最后汇聚到一个点的网络结构,变成了汇聚成缩小一定比例的分类图,并且最后一层的21个通道代表着最后的21个分类结果。

同时也揭示了伴随着端到端语义分割的一个主流矛盾:既需要全局的感受野来完成分类任务,又需要在边缘部位,用局部信息和低层的低级视觉信息来达到准确的边缘分割。

2.2 特点

  • 用全卷积替代了全连接
  • 为了弥补下采样操作造成的损失,使用了反转卷积的操作来恢复信息
  • 单纯地使用反转卷积无法得到好的效果,用下采样之前的特征图与上采样之后的图片进行融合这样可以指引上采样过程恢复到比较好的效果。即高低通道特征融合。恢复低级视觉信息。

使用全卷积网络做语义分割的矛盾就在于,图片中的语义信息在大的感受野条件下,可以得到很好的分类结果。但是过大的感受野会丢失细节信息,丢失边缘,局部信息,又不利于局部分割信息的恢复,如何设计网络平衡这个矛盾是个比较重要的问题。

毫无疑问,FCN提过了一个很不错的方法和方向。即Encoder-Decoder并强调高低通道特征的融合。

三、Deeplab_v1

3.1 前言

空洞卷积的示意图如下:

在这里插入图片描述

因为主流的网络为了获取较大的感受野(理论上来说大的感受野有助于分类),都采用了conv中加上stride,或者采用pool(池化)来让神经网络高层获得的感受野更大,这样分类结果会更准确,但带来的缺点就是图像分辨率会下降,同时maxpool这个操作会丢失图像的部分细节信息,不利于分割任务,所以在deeplab中大范围用空洞卷积来扩大感受野,同时也尽量避免降低图像分辨率的操作,这样更容易恢复到原始分辨率大小。

3.2 特点

  • 空洞卷积,就是上图这个东西,不损失分辨率和边缘信息的情况下增大感受野。

在这里插入图片描述

  • 条件随机场,虽然使用空洞卷积,但仍然存在着池化操作,并且卷积本身就会让边缘信息弱化一些,使用传统的CRF条件随机场能让模糊的边界信息更清晰,使图像更加精细化,相当于网络中的Decoder部分的功能。实际实验中,CRF对于Deeplab的准确率提升非常显著。

在deeplab中对于缩小后的图像并没有使用神经网络实现和FCN一样的解码器结构,而是使用了上头的条件随机场这个偏向传统视觉处理的方法。后续的deeplabv3版本中已经不使用该方法。

四、U-Net

4.1 结构

在这里插入图片描述

4.2 特点

  • U-net的结构非常对称,优雅,清晰。作者论文中的图片简明易懂
  • 该网络结构强化了FCN中特征融合的思想,很明显,每一层中都加入了低级通道的特征图,并且,采用了通道叠加,而不是直接加和的思想,这样给了网络充足的能力去选择不同的区域叠加不同的通道,而不是暴力加和,这个应该是改进比较好的地方。
  • U-net在loss中引入了加权权重的思想,这个想法是很好的,因为由于感受野的问题,最后的特征图的边缘信息会弱一些,因为感受野捕获到的边界背景信息与主体信息几乎是一半一半可以说,边缘信息会弱化,那么增大边缘部分的loss权重,会促使网络在边缘部分多留意,这样会让边缘效果稍好一些。嗯就这样。这也是大的感受野,与细分边缘之间的矛盾。

可以看到这个网络结构还是比较浅的,不像其他主流网络堆得很深,目前在医疗图像分割领域用U-net的非常多,分割效果也很不错,但在分类任务很复杂的的语义分割数据集中表现的并不是很好,这跟网络本身比较浅也有关系。同时,正是由于U-net本身比较浅,很多低层视觉信息很重要,被保存了下来,所以在医疗图像分割上可以达到很精准的边缘提取,等等分割任务。

五、Seg-Net

5.1 结构

在这里插入图片描述

5.2 特点

  • 在上采样步骤那,进行了一个所谓的坐标上采样功能,这样恢复后的上采样特征图会将像素恢复在之前的坐标处,然后再结合低层的特征图,得到比之前直接上采样的效果会好一些,实际上这样做性能是大幅提升了,速度快了很多,计算量和参数都少了很多,不过准确率只能说一般吧。

六、Deeplab_v2

6.1 结构

ASPP模块:

在这里插入图片描述

6.2 特点

  • 用了新的Resnet结构,并将卷积替换成了空洞卷积部分。
  • ASPP模块,也就是使用不同扩张率的空洞卷积来获取最终特征图上的不同大小的物体,还是关于感受野的问题,作者认为之前一味地提高感受野也不是好事,因为毕竟有大的物体,和小的物体,不能通过一个固定不变的感受野来解决问题,所以不同尺度的感受野很重要,所以大概设计了四种不同大小的感受野来找到对应的物体。这个想法很不错,很work,并且之前大家似乎都没有提到,也没有改进。
  • 还是传统的CRF。

最大的改进就是ASPP模块了,之前提到扩大感受野对于正确的分类有很大的好处,但是也不是一味地提升感受野,这样必然会导致泛化能力太弱,图片中的物体大小自然是不一样的,用相同的感受野只能说对于某个大小的物体识别比较准确,一旦有比较大的,或者很小的自然效果很差,作者考虑到这个问题,在特征图的最后加入了ASPP,简单理解就是通过不同大小的空洞卷积模块来达到不同的感受野的目的,这样就可以对不同大小的物体都能做到比较准确地检测,进而提高准确率,事实也证明这个网络模块非常有效!

6.3 Fcis

基于实例分割的分割,其实实例分割有很多好处,实例分割,可以将分类和分割两件事分离开来,正如何凯明在论文中提到的类间竞争,分割的时候只负责分割,然后类的事交给专门的分类网络判断,这样可以减少相互之间的干扰,分类可以有较大的感受野,分割可以去获得低层的视觉信息。也是种不错的选择吧。

6.3.1 特点

实例分割改善分割效果应该会有帮助。最终语义分割也是要走向实例分割的,并且实例分割带来的分类和分割准确度的提升应该很大,具体可以看mask-rcnn中对这一问题的阐述。

七、RefineNet

7.1 结构

在这里插入图片描述

7.2 特点

  • 整个网络都是用Res-Net结构的参差思想设计每个模块,这是个很不错的想法,如果某个地方学不到有用的信息,那就不要添乱嘛,直接映射原来的信息,可以让网络的信息流传递更加健康;
  • 基本思路还是高低特征融合,也就加了点自己的pool链在里头,还是根据何凯明的那个参差思想做的一个最大池化操作,这个操作还是比较有用的,增大了整个特征图的感受野,有助于正确的分类结果;
  • 在每一个stage阶段都进行了conv3的卷积操作,可能对于任务过渡也有一定的好处,这样可以使网络更加平滑地过渡到下一个功能阶段;
  • 附加loss是个不错的决定,这样加强了对网络内部层的监督,这样可能会导致更有效的结果,并能加快网络的收敛吧。

八、Large Kernel Matters

8.1 结构

网络结果如下:
在这里插入图片描述

8.2 特点

  • 对于large kernel 的卷积模块做了具体地解释,尽管卷积操作能够理论上到来较高的感受野,但实际上由于卷积的反向传播,不重要的偏向边缘信息由于在逐层的卷积和连接过程中,会慢慢地被削弱,这就涉及到文中提及的有效感受野问题,具体在一片论文中专门研究了实际有效感受野的问题。
  • 当然直接在某一层使用大的感受野的卷积核,是一个非常直接、有效的扩充感受野的方法,但直接用大内核会带来很大的计算量。实际上之前googlenet中也介绍了这个问题,使用小的卷积核堆叠很多层来近似为一个大内核的来达到这样的效果。
  • 在分类任务上,文中专门对如何设计大的内核做了大量的详细实验,包括 k × k k\times k k×k k × 1 k\times 1 k×1 1 × k 1\times k 1×k相结合, 3 × 3 3\times 3 3×3的堆叠,实际上证明只有 1 × k 1\times k 1×k- k × 1 k\times 1 k×1是work的,甚至直接kxk的这样的结构效果都不够好,这个和xception中提到的想法类似,都是讲两个操作分离化,这样既减少了计算量,同时甚至带来了效果上的提升,至于为什么会带来很大的提升,作者说的都是我们猜,我们假设,神经网络本来很多东西都是基于经验
  • 同时网络中为了细化边缘还引入了一个叫BR的边缘定义模块,其实就是一个普通的参差模块吗,可能这个模块放在底高层的特征图融合后,能够刚好配合反向传播学到一些对边缘细化有用的信息,也就是大家都在做的对decoder模块的各种各样的小改进,有效果就好。个人觉得不是太重要的东西。

九、deeplabv3

9.1 结构

网络结构如下:
在这里插入图片描述

9.2 特点

  • 加入了像素级别的特征图以及原始的图片信息在ASPP模块中,实际上没改什么东西,也就是把特征融合地更多了,这有点显而易见,必然结合的特征越多,对于效果的提升越来越大。

空洞卷积级联的尝试:

在这里插入图片描述

  • 尝试了级联空洞卷积模块,实际应用中发现是不work得,从res的四个模块加到了7个模块后没有发现较大的性能提升。当然这样一味地增大感受野没有ASPP那样对不同层次,和不同大小的有效感受野从理论上和实践上有效果。
  • 去掉了CRF模块,证明网络已经基本上与其他的end to end网络达到了同样性能,没有CRF这样的黑科技的加成下。

本来个人认为,语义分割就是用神经网络来实习端到端的分割结果,来找出每个像素的分类结果,尽可能保留主要语音信息,边缘稍微有些混乱,也是正常现象,通过各种各样传统视觉算法中的trick当然可以细化这个边缘结果,让效果更好,不过既然大家主要都是研究神经网络,那就只用神经网络这块的性能提升来比较客观、公正一些。

十、deeplabv3+

10.1 结构

左1 depplabv3 中间 主流的编码-解码结构 右边 deeplabv3+的改进后的编码结构

在这里插入图片描述

10.2 特点

  • 主干网络采取了Xception,并融入了他的空洞卷积操作
  • 采用了Decoder模块,那为什么没有像其他网络一样经过了很多个低级特征到高级特征的融合呢?在4倍到原始分辨率的时候,我猜这是因为可能再低级的信息缺乏价值?明明我觉得中间的解码结构是很好的,没有看到作者介绍。或者对于deeplab这样的结构来说两次解码已经可以达到很好的效果,再多的信息可能没有什么提升吧。

猜你喜欢

转载自blog.csdn.net/wzk4869/article/details/129702031
今日推荐