Py学习  »  机器学习算法

综述:基于深度学习的语义分割-以及源代码

MrCharles • 5 年前 • 684 次点击  

综述:基于深度学习的语义分割

xingbod@gmail.com

在这里插入图片描述

语义分割示例

什么是语义分割?

深度学习和计算机视觉社区中的大多数人都知道什么是图像分类:我们希望我们的模型告诉我们图像中存在单个对象或场景。分类是非常粗糙和high-level的。

许多人熟悉目标检测,在其中我们试图通过在图像周围绘制边界框然后对框内的内容进行分类来对图像中的多个对象进行定位和分类。目标检测是mid-level,mid-level有一些非常有用且详细的信息,但是由于我们只是绘制边界框而并没有真正了解对象形状,因此它仍然有些粗糙。

语义分割是这三种中最富含信息的,我们希望在其中分类图像中的每个像素,就像您在上面的gif中看到的一样! 在过去的几年中,这完全是通过深度学习来完成的。

在本指南中,您将学习语义分割模型的基本结构和工作原理,以及所有最新和最先进的方法。

如果您想自己尝试模型,可以 下载语义分割源码 ,其中包含本指南中许多模型的TensorFlow测试代码!

基本结构

我将向您展示的语义分割模型的基本结构存在于所有最新方法中!这使得实现不同的模型非常容易,因为几乎所有模型都具有相同的底层主干,设置和流程。

U-Net模型很好地说明了这种结构。模型的左侧代表为图像分类训练的任何特征提取网络。其中包括VGGNet,ResNets,DenseNets,MobileNets和NASNets等网络!您可以使用任何您想要的模型。

选择分类网络以进行特征提取时要注意权衡。使用非常深的ResNet152可以使您获得很高的准确性,但是却不如MobileNet快。在将这些网络应用于分类时,也要注意权衡他们的优缺点。要记住的,这些骨干网将是设计/选择细分网络时的主要驱动力。

在这里插入图片描述

U-Net细分模型

一旦提取了这些特征,便会以不同的尺度(scales)进行进一步处理。其原因有两个。首先,您的模型很可能会遇到许多不同大小的对象;以不同的比例处理要素将使网络有能力处理这些不同的尺寸。

其次,分割是一个权衡过程。如果您想要良好的分类准确性,那么您肯定会希望从网络的后期开始处理high level特征,因为它们更具区分性并且包含更多有用的语义信息。另一方面,如果仅处理这些high level特征,由于分辨率低,您将无法获得良好的定位(localisation)!

最新的技术都遵循上述结构,先特征提取,然后进行多尺度处理。因此,许多工具非常易于实施和端到端训练。您选择使用哪种方法取决于您对准确性与速度/内存的需求。

在下面的最新技术介绍中,我将重点介绍最新的方法,因为在理解了上述基本结构之后,这些方法对大多数读者而言将是最有用的。我们将按照大致的时间顺序进行遍历,这也大致对应于最新技术的发展。

State-of-the-art 大观

全分辨率残差网络,Full-Resolution Residual Networks (FRRN)

FRRN模型是多尺度处理技术的一个非常主要的例子。它使用2个单独的流完成操作:the residual stream 以及the pooling stream.

我们希望处理这些语义特征以实现更高的分类准确性,因此FRRN会逐步处理和缩减pooling stream中的特征图。同时,它以全分辨率处理residual stream中的特征图。因此,池化流将处理高级语义信息(以实现较高的分类精度),而residual stream将处理低级像素信息(以实现较高的定位精度)!

现在,由于我们正在训练端到端网络,因此我们不希望这两个流完全断开。因此,在每次最大池化之后,FRRN会对2个流中的特征图进行一些联合处理,以合并其信息。

在这里插入图片描述

FRRN模型结构

金字塔场景解析网络(Pyramid Scene Parsing Network PSPNet)

FRRN在直接执行多尺度处理方面做得很好。但是在各个规模上进行繁重的处理都需要大量的计算。而且,FRRN会以全分辨率进行某些处理,这很慢!

PSPNet提出了一种巧妙的方式,也就是多尺度池化,来解决这个问题。它以标准的特征提取网络(ResNet,DenseNet等)开始,并采用第三次降采样的特征进行进一步处理。

为了获得多尺度信息,PSPNet应用了4种不同的max pooling以及4种不同的窗口大小和步幅。这样可以有效地捕获4种不同比例的特征信息,而无需对每个特征进行繁重的处理!我们只需要对每个像素进行轻量级的卷积,然后对其进行升采样upsample,以使每个特征图具有相同的分辨率,然后将它们全部连接在一起。

瞧!我们已经组合了多尺度特征图,而没有对其施加很多卷积!

所有这些都是在较低分辨率的功能图上实现的,以实现高速。最后,我们使用双线性插值将输出分割图(segmentation map)放大到所需大小。

在这里插入图片描述

PSPNet模型结构

百层提拉米苏The One Hundred Layers Tiramisu (FCDenseNet)

如果深度学习带来了一种令人敬畏的趋势,那就是令人敬畏的研究论文名称!One Hundred Layers Tiramisu FCDenseNet(听起来好吃!)采用了类似U-Net的结构。主要贡献是类似于DenseNet分类模型的dense connections的巧妙使用。

这确实强调了计算机视觉的强大趋势,其中特征提取是其表现出色的主要支柱。因此,寻找准确性增益的首要通常是特征提取。
在这里插入图片描述

FCDenseNet模型结构

Rethinking Atrous Convolution(DeepLabV3)

DeepLabV3用另一种聪明的方式做多尺度处理,并且不增加参数量。

该模型非常轻巧。我们再次从特征提取前端开始,对第四次下采样的特征进行进一步处理。这个分辨率非常低(比输入小16倍,那就太好了),因此,如果我们可以在这里进行处理!棘手的部分是,在如此低的分辨率下,由于像素精度差,很难获得良好的定位。

这就是DeepLabV3的主要贡献所在,巧妙地使用了Atrous卷积(空洞卷积)。常规卷积只能处理非常局部的信息,因为权重始终彼此紧靠。例如,在标准的3x3卷积中,一个权重与任何其他权重之间的距离仅为单个步长/像素。

空洞卷积(Dilated/Atrous Convolution),广泛应用于语义分割与目标检测等任务中,语义分割中经典的deeplab系列与DUC对空洞卷积进行了深入的思考。目标检测中SSD与RFBNet,同样使用了空洞卷积。

以下是标准卷积3x3:以3*3为例

在这里插入图片描述
以下是Atrous卷积:在3*3卷积核中间填充0,有两种实现方式,第一,卷积核填充0,第二,输入等间隔采样。
在这里插入图片描述
空洞卷积有什么作用呢?2)扩大感受野:在deep net中为了增加感受野且降低计算量,总要进行降采样(pooling或s2/conv),这样虽然可以增加感受野,但空间分辨率降低了。为了能不丢失分辨率,且仍然扩大感受野,可以使用空洞卷积。这在检测,分割任务中十分有用。一方面感受野大了可以检测分割大目标,另一方面分辨率高了可以精确定位目标。2) 捕获多尺度上下文信息:空洞卷积有一个参数可以设置dilation rate,具体含义就是在卷积核中填充dilation rate-1个0,因此,当设置不同dilation rate时,感受野就会不一样,也即获取了多尺度信息。多尺度信息在视觉任务中相当重要啊。

通过Atrous卷积,我们将直接增加卷积权重之间的间隔,而无需实际增加操作中权重的数量。因此,我们仍然使用具有9个总参数的3x3卷积,只是将乘以的权重进一步分开!每个权重之间的距离称为dilation rate。下面的模型图很好地说明了这个想法。
在这里插入图片描述

DeepLabV3模型结构

当我们使用低dilation rate时,我们将处理非常局部/低尺度的信息。当我们使用高dilation rate时,我们会处理更多的全局/大规模信息。因此,DeepLabV3模型将atrous卷积与不同的dilation rate混合在一起,以捕获多尺度信息。

在这里,针对PSPNet所解释的所有处理之后的upscaling技术也在流程最后被执行。

多路径优化网络(Multi-Path Refinement Networks, RefineNet)

我们之前看到了FRRN如何出色地完成了直接组合多种分辨率的信息并将它们组合在一起。缺点是以如此高的分辨率进行的处理需要大量的计算,而且我们必须将那些特征与低分辨率的特征组合起来!

在RefineNet模型中,我们并不需要这样做。当我们通过特征提取网络输入图像时,我们会在每次下采样后获得多尺度特征图。

然后,RefineNet以自下而上的方式处理这些多分辨率特征图,以合并多尺度信息。首先,每个特征图都是独立处理的。然后,当我们进行放大时,我们将低分辨率特征图与高分辨率特征图结合在一起,对它们两者进行进一步处理。因此,独立地或一起地处理多尺度特征图。整个过程在下图中从左到右移动。

如在PSPNet和DeepLabV3中说明的,在所有处理之后也需进行upscaling。
在这里插入图片描述

RefineNet模型结构

Large Kernel Matters (GCN)

我们看到了DeepLabV3模型如何使用具有不同dilation rate的atrous卷积来捕获多尺度信息。棘手的是,我们一次只能处理一个尺度scale,然后将它们合并。例如,dilation rate为16的atrous卷积不能很好地处理局部信息,必须稍后以较小的速率与卷积中的信息组合才能在语义分割中表现出色。

因此,在先前的方法中,多尺度处理首先单独进行,然后将结果组合在一起。如果我们能够一口气获得多尺度信息,那将更有意义。

为此,全局卷积网络(Global Convolutional Network, GCN)巧妙地使用大的一维内核而不是方形内核。对于3x3、7x7等方形卷积,如果不牺牲大量速度和内存消耗,我们就无法使其过大。另一方面,一维内核的缩放效率更高,我们可以使它们很大,而又不会减慢网络速度。其论文甚至达到15的大小!

您必须确保平衡水平和垂直卷积。此外,其论文确实使用了较小的3x3卷积和较低的filter数量,以有效地细化一维转换可能会遗漏的任何内容。

GCN遵循与以前的模型相同的方法,处理特征提取前端中的每个尺度。由于一维卷积的效率,GCN一直在所有尺度上执行处理,直到达到完整分辨率,而不是在以后保持较小规模和放大比例。当我们按比例放大时,这允许对细分进行不断细化,而不是由于保持较低的分辨率而可能出现的瓶颈。
在这里插入图片描述

GCN模型结构
## DeepLabV3 + DeepLabV3 +,顾名思义,是DeepLabV3的扩展。正如我们之前所看到的,如果我们仅在网络末端等待双线性插值以进行升级,则存在潜在的瓶颈。实际上,原始的DeepLabV3模型在最后upscaled了x16倍!

为了解决这个问题,DeepLabV3 +在DeepLabV3的顶部添加一个中间解码器模块。通过DeepLabV3处理后,然后对特征进行x4上采样。再将它们与来自特征提取前端的原始特征一起进行进一步处理,然后再upscaled x4。这减轻了网络端的负担,并提供了从特征提取前端到网络近端的shortcut。
在这里插入图片描述

DeepLabV3 +模型结构

CVPR和ECCV 2018

上面介绍的网络代表了语义分割的流行技术!今年在计算机视觉会议上发布的许多内容都是微小的更新和准确性上的小变化,这对继续前进并不十分关键。为了全面,我在这里为有兴趣的任何人快速回顾了他们的贡献!

图像级联网络(Image Cascade Network,ICNet) -使用深度监控并以不同尺度处理输入图像,每个尺度通过自己的子网并逐步组合结果

Discriminative Feature Network(DFN) -使用深度监督并尝试分别处理线段的平滑部分和边缘部分

DenseASPP —将dense connections与atrous卷积结合在一起

Context Encoding -通过添加channel attention module来利用全局上下文来提高准确性,该模块会基于新设计的损失函数触发对某些特征图的关注。损失基于网络分支,该网络分支预测图像中存在哪些类(即更高级别的全局上下文)。

Dense Decoder Shortcut Connections —在解码阶段使用dense connections以获得更高的准确性(以前仅在特征提取/编码期间完成)

Bilateral Segmentation Network (BiSeNet) -拥有2个分支:一个分支用于获取语义信息,而另一个分支则对输入图像进行少量处理,以保留低级像素信息

ExFuse -采用deep supervision和明确的特征提取前端结合了多尺度特征前处理,以确保各级处理一起多尺度信息。

如何进行语义分割

  1. 注意classification net的权衡。分类网络是处理功能的主要驱动力,您的大部分收益/损失都将来自这里
  2. 进行多尺度处理并将信息整合在一起
  3. 多尺度合并,atrous卷积,大型一维转换都有利于语义分割
  4. 您无需以高分辨率进行大量处理。以较低的分辨率进行大部分处理以提高速度,然后进行放大,并在必要时最后进行upscale 处理
  5. Deep supervision可能会稍微提高您的准确性(虽然更偏重于设置训练)

Charles @ Salzburg, AT, 16th, Dec,2019.

Merry Christmas


Reference:
[1] Semantic Segmentation with Deep Learning

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/51457