社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  机器学习算法

使用深度学习做语义分割:简介和代码

AI研习社 • 7 年前 • 509 次点击  

本文为 AI 研习社编译的技术博客,原标题 :

Semantic Segmentation with Deep Learning: A guide and code

翻译 | 小猪咪    校对 | Lamaric    整理 | 孔令双

原文链接:

https://towardsdatascience.com/semantic-segmentation-with-deep-learning-a-guide-and-code-e52fc8958823

 

  什么是语义分割?

大多数深度学习和计算机视觉大家庭中的人都知道什么是图像分类:我们想让我们的模型告诉我们,图片中存在的单个物体或场景是什么。分类是一种非常模糊和高层次的任务。

很多人同样对目标检测很熟悉:我们尝试定位和分类图像中的多个物体,手段就是在它们周围画出范围框,并对框内的东西进行分类。检测是一种中层次的任务,我们可以得到一些很有用的细节信息,但由于我们只是画出检测框而没有得到物体的准确形状,所以还是略显粗糙。

语义分割是这三者中信息量最大的,我们对图片中的每一个像素都进行分类,就像你在上方的动态图中看到的那样!最近几年,这些完全是基于深度学习完成的。

在这篇简介中,你将会学到语义分割模型的基本结构和功能,以及最新最棒的高水平成果。

如果你想要自己试一试这些模型,你可以登陆我的语义分割程序组,对于很多这篇指南中出现的模型,那里有我用 TensorFlow 实现的训练和测试!

GeorgeSeif/Semantic-Segmentation-Suite
Semantic Segmentation Suite in TensorFlow. Implement, train, and test new Semantic Segmentation models easily! …github.com 


  基本结构

我将要向你展示的语义分割模型的基本结构在所有的顶尖工作中都存在。这使得实现不同的模型变得异常简单,因为他们几乎全部都有着相同的骨架、构造方法和构造流程。

U-Net 模型可以对这个结构给出很好的阐释。模型左侧表示了任何训练出来可为图片分类任务提取特征的网络。包括了VGGNet, ResNets, DenseNets, MobileNets,和 NASNets!这里你几乎可以用任何你想用的结构。在选择你的用以特征提取的分类网络时,你心中的主要参考指标是网络的均衡。使用一个很深的 ResNet152 可以为你提供很高的准确度,速度却不及 MobileNet。这些在图像分类任务中出现的折衷因素在语义分割中同样存在。你需要记住一个重要的事实:这些骨架将是你设计/选择你的语义分割网络时的主要驱动力,我再强调也不为过。



用于语义分割的 U-Net

特征被提取出来后将在不同的大小被处理,原因有二。首先,你的模型很可能遇到很多不同大小的物体;在不同的尺寸中处理特征图将赋予网络处理不同大小物体的能力。

第二点,当进行语义分割时有一点需要权衡折衷之处。如果你想得到好的分类准确度,你必须处理深层网络中那些高层级的特征信息,因为它们更有辨识度并包含更多对语义分割有用的信息。但另一方面,如果你只采用深层特征,你的定位将会变得很糟,因为此时的分辨率太低了!

最近的高水准工作都利用了上述特征提取结构并和多尺度处理技术,因此很多都很容易实现以及端到端地训练。你的选择将基于你对准确度和速度/内存的需求,其实这些工作也全部都在寻找新的方法,希望在保留效率的基础上改善这种折衷。

接下来在对前沿工作的介绍中,我将主要关注最新的方法,因为在了解了上述基本结构后,这些方法可能对于大多数读者来说是最有帮助的。我们将会大致以时间顺序阐述,这也大致反映了前沿工作这些年来逐步发展改进的情况。


  前沿概览

全分辨率残差网络(FRRN)

FRRN  模型是多尺度处理技术中一个很典型的案例。它借助两条分立的流来完成:残差流和池化流。

我们希望在处理语义特征时获得更高的分类准确度,所以 FRRN  在池化流中对特征图进行处理和下采样。同时,在残差流中以全分辨率处理特征图。因此池化流负责处理高层的语义信息(为了更高的分类准确度),残差流处理低层像素信息(为了更高的定位准确度)!

既然我们希望端到端地训练网络,我们就不希望两条流间完全没有联系。所以在每次最大池化后,FRRN 会对来自双流的特征图进行一些融合操作来结合他们的信息。

  

FRRN 的模型结构

金字塔场景解析网络(PSPNet)

FRRN 在直接施加多尺度处理方面做出了很好的工作。但是在每一种尺寸上做复杂处理的计算复杂度很高。以及 FRRN 的一些过程是在全像素下施加的,本身就是一种很慢的工作。

PSPNet  提出了一种巧妙的办法来规避这个问题,就是利用多尺度池化。它会从一个标准的特征提取网络(如 ResNet,DenseNet 等)开始,从第三个下采样后提取出特征进行进一步计算。

为了得到多尺度信息,PSPNet 应用了四种不同的最大池化操作,通过四种不同的窗口和步长尺寸。这高效地从四种不同的尺度中获得了特征信息而无需为它们每个都进行单独运算。我们只需要在每个后面做一次轻量级的卷积,上采样,这样每个特征图都有同样的分辨率了,之后将它们拼合起来就可以了。

瞧!我们没有做任何卷积就把多尺度的特征图结合起来了。

所有这些都是在低像素的特征图上提高速度的手段。最后,我们利用双线性差值法把输出的语义分割图放大到想要的大小。这种在所有的步骤之后施加的放大手法存在于很多先进工作中。


  PSPNet 的模型结构

一百层的提拉米苏(FCDenseNet)

如果有一种深度学习带来的极好的趋势,那就是优秀的论文名字一百层提拉米苏 FCDenseNet (听起来就很美味)使用了一张和我们之前看到的 U-Net 相似的结构。它主要的贡献是对密集连接的巧妙运用,和 DenseNet 分类模型有异曲同工之妙。

这真是强调了计算机视觉领域越来越强的导向:前端的特征提取是任何其他任务想要效果好的核心骨架。因此,如果想要提高准确率,首先要考虑的就是前端的特征提取。

  

FCDenseNet 模型结构

带孔卷积核的再思考(DeepLabV3)

DeepLabV3  是另一种无需加设系数的多尺度处理方法。 

这个模型十分轻量级。我们再次从一个特征提取前端开始,从第四次下采样后的特征入手处理。现在的分辨率已经很低(比输入图片小了16倍)所以我们就从这里入手就很好!不太好的一点是,在这样一种低分辨率的情况下,由于像素的低准确度,很难得到很好的定位。

这就是体现 DeepLabV3 的突出贡献之处了,对多孔卷积的巧妙运用。普通的卷积只能处理局部信息,因为权值总是一个挨着一个。例如,在一个标准的3*3卷积中,两个权重值之间的距离只有一个步长/像素。

有了多孔卷积,我们可以直接增加卷积权重值之间的空间,而实际上在操作中不增加权重值的总数。所以我们仍然只有3*3也就是9个为参数总量,我们只是把它们分布得更开了。我们把每个权重值间的距离称作扩张率。下面的模型图解很好的阐释了这个思想。

当我们使用一种低扩张率时,我们会得到非常局部/低尺度的信息。当我们采用高扩张率时,我们会处理到更多全局/高尺度的信息。因此 DeepLabV3 模型融合了不同扩张率的多孔卷积来获取多尺度信息。

和 PSPNet 中解释过的解释过的处理手法类似,在最后也会有一步尺度提升的过程。


DeepLabV3 模型结构

多路径细化网络(RefineNet)

之前我们看到了 FRRN 结构是如何在结合多尺度分辨率信息时发挥巨大作用的。它的缺点是在处理高分辨率时计算量巨大,我们还需要把那些特征和低分辨率的特征结合!

因此 RefineNet 模型提出我们不需要这样做。当我们把图片送入特征提取网络后,在每一次下采样后我们自然而然地会得到多尺度的特征图。

细化网络之后采用自底而上的方式对这些多分辨率特征图进行处理以结合多尺度信息。首先,每张特征图会被独立处理。然后当我们升尺度的时候我们会把高/低分辨率的结合起来,对它们同时进行一些处理。因此,我们的多尺度特征图既是独立也是共同处理的。整个流程从左至右呈现在下面的图解中。

和 PSPNet 中解释过的解释过的处理手法类似,在最后也会有一步尺度提升的过程。  



RefineNet 模型的结构

大卷积核的情况(GCN)

之前我们看到了 DeepLabV3 模型是如何运用不同步长的多孔卷积来捕捉多尺度信息的。但问题是我们一次只能处理一个尺寸,之后还要把它们结合起来。比如说一个扩张率为16的多孔卷积与更小的扩张率相比,在语义分割时就不能很好地处理局部信息。

因此在之前的方法中,实际上多尺度的处理是先独立、后整合的。如果我们同时关注多尺度的信息,将会更有意义。

为了完成这个想法, Global Convolutional Network (GCN) 机智地提出采用大型一维卷积核而不是方形的。如果用如3*3,7*7的卷积核,我们不能把它们做得太大,否则就需要很大的计算速度和内存的小号。一维卷积核就很高效了,我们可以做得很大而不拖慢网络太多。这篇文章甚至做到了15的大小。

一件重要的事情是你一定要做的,就是横纵卷积的平衡。此外,这篇文章还是用了小型的3*3卷积核作为优化,以防一维卷积会遗漏什么信息。

GCN 和前面的工作一样,从前端特征提取网络中处理不同尺度的信息。由于一维卷积的高效率, GCN 连全像素的层数都处理到了,而不是停留在低像素的层上最后再升尺度。这对于提升尺度后的语义分割的结果提供了很好的细化,而避免了由于停留在低分辨率而可能导致的瓶颈问题。


GCN 模型的结构。

DeepLabV3+

DeepLabV3+ 模型就像它名字所说的那样,是 DeepLabV3 的一个快速延伸,借用了它之前工作的一些优势。如我们之前看到的那样,如果我们仅仅在最后利用双线性差值升尺度的话就会遇到潜在的瓶颈。事实上,原来的 DeepLabV3 在最后把尺度放大了16倍!

为了处理这件事, DeepLabV3+ 在 DeepLabV3 上加入了中间的解码模块,通过 DeepLabV3 处理后,首先特征图会被放大4倍。之后它们会和前端特征提取的原特征图一起处理,之后再放大4倍。这减轻了后端网络的负担,并提供了一条从前端特征提取到网络后面部分的捷径。


DeepLabV3+ 模型结构


  CVPR 和 ECCV 2018

我们在以上部分说的网络结构代表了你在语义分割领域需要知道的大部分技巧!今年在计算机会议里发表的工作只有些微新意和准确度上很小的提升,并没有特别关键而值得说明的地方。为了叙述的完整和彻底性,我把他们的工作在这里为可能有兴趣的读者整理出了一个快速的回顾清单。

Image Cascade Network (ICNet) —使用了深度监督,并在不同尺度上处理输入图片,每一个尺度都有自己的子网络,最后逐渐合并结果。 

Discriminative Feature Network (DFN) — 使用了深度监督,并尝试着把分割区域的边缘和内部区域分开处理。

DenseASPP — 结合了多孔卷积的密集连接。

Context Encoding —利用全局环境增加准确度 ,通过加入了一个通道注意力模块,并基于一个新设计的损失函数把触发注意力放在特定的特征图上。损失函数是基于网络中判断哪个类别存在的这一部分分支设计的(比如高层级的全局内容)。

Dense Decoder Shortcut Connections — 在解码阶段使用了密集连接以达到更高的准确度(之前仅在特征提取/编码阶段使用)。

Bilateral Segmentation Network (BiSeNet) — 有两个分支:一个为了得到语义信息而很深,一个为了保存低层级的像素信息而仅对输入进行了很少的操作。

ExFuse — 使用了深度监督,特别是把从前端特征提取中得到的多尺度特征结合起来之后进行处理,这是为了保证多尺度信息可以在同等程度上一起处理。



ICNet 模型结构


  长话短说:如何做语义分割

  • 要明白分类网络的折衷效果。你的分类网络是你特征提取的主要驱动,而最终效果中大多数的得失源自于此。

  • 分尺度处理并把信息融合。

  • 多尺度池化、多孔卷积和大型一维卷积都对语义分割有益。

  • 你无需在高分辨率上做很多的处理步骤,为了速度起见把大多数步骤放在低分辨率上吧,之后再提升尺度,如果有必要的话在最后再进行一些轻量级的处理。

  • 深度监督可以提升一点准确率(虽然建立起训练变得更加棘手了)



今天看啥 - 高品质阅读平台
本文地址:http://www.jintiankansha.me/t/Y2hHfzcZ1h
Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/24836