Semantic Segmentation with Deep Learning(深度学习的语义分割)

Semantic Segmentation with Deep Learning–A guide and code

What is semantic segmentation?

Semantic Segmentation with Deep Learning(深度学习的语义分割)
Semantic Segmentation

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

许多人也熟悉对象检测,我们尝试通过在图像中绘制边界框然后对框中的内容进行分类来定位和分类图像中的多个对象。检测是中级的,我们有一些非常有用和详细的信息,但它仍然有点粗糙,因为我们只是绘制边界框并且没有真正准确地了解对象形状。

语义分割是这三个中最具信息性的,我们希望对图像中的每个像素进行分类,就像你在上面的gif中看到的那样!在过去的几年里,这完全是通过深入学习完成的。

在本指南中,您将了解语义分段模型的基本结构和工作方式以及所有最新和最先进的方法。

如果您想自己试用模型,可以查看我的语义分段套件,完成TensorFlow培训并测试本指南中许多模型的代码!

Basic structure

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

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

选择分类网络进行特征提取时,最重要的是要记住权衡。使用非常深的ResNet152将获得极高的准确性,但不会像MobileNet那样快。将这些网络应用于分类时出现的权衡也会在使用它们进行分割时出现。需要记住的重要一点是,在设计/选择分段网络时,这些主干将是主要的驱动因素,我不能强调这一点。
Semantic Segmentation with Deep Learning(深度学习的语义分割)
U-Net model for segmentation
一旦提取了这些特征,它们就会以不同的比例进一步处理。原因是双重的。首先,您的模型很可能会遇到许多不同大小的物体;处理不同规模的特征将使网络具有处理这些不同大小的能力。

其次,在进行分割时需要权衡。如果您想要良好的分类准确性,那么您肯定希望从网络后期处理这些高级功能,因为它们更具有辨别力并包含更多有用的语义信息。另一方面,如果您只处理这些深层功能,由于分辨率低,您将无法获得良好的本地化!

最近的最先进方法都遵循上述特征提取结构,然后进行多尺度处理。因此,许多很容易实施和端到端的培训。您选择使用哪一个将取决于您对精度与速度/内存的需求,因为所有人都在尝试提出解决此权衡的新方法,同时保持效率。

在下面的最新技术演练中,我将重点介绍最新的方法,因为在理解了上述基本结构之后,这些方法对大多数读者最有用。我们将按照粗略的时间顺序进行演练,这也大致相当于最先进的技术的进步。

State-of-the-art walkthrough

全分辨率剩余网络(FRRN)
FRRN模型是多尺度处理技术的一个非常明显的例子。 它使用2个独立的流完成此操作:残留流和池流。

我们希望处理这些语义特征以获得更高的分类准确性,因此FRRN逐步处理和下采样池流中的特征映射。 同时,它以残余流中的全分辨率处理特征图。 因此汇集流处理高级语义信息(用于高分类精度),残差流处理低级像素信息(用于高定位精度)!

现在,由于我们正在培训端到端网络,因此我们不希望这两个流完全断开连接。 因此,在每次最大池化之后,FRRN对来自2个流的特征映射进行一些联合处理以组合它们的信息。
Semantic Segmentation with Deep Learning(深度学习的语义分割)
FRRN model structure

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

FRRN在直接执行多尺度处理方面做得很好。但是,在每个规模上进行大量处理都是计算密集型的。此外,FRRN以全分辨率进行一些处理,非常慢的东西!

PSPNet提出了一种巧妙的方法,通过使用多种池化来解决这个问题。它从标准特征提取网络(ResNet,DenseNet等)开始,并采用第三次下采样的功能进行进一步处理。

为了获得多尺度信息,PSPNet采用4种不同的最大池操作,具有4种不同的窗口大小和步幅。这有效地捕获了4种不同尺度的特征信息,而无需对每个尺度进行大量的个性化处理!我们只是在每个上面进行轻量级卷积,然后进行上采样,以便每个要素图具有相同的分辨率,并将它们全部连接起来。

瞧!我们结合了多尺度特征图,而不对其进行多次卷积!

所有这些都是在较低分辨率的高速特征图上完成的。最后,我们使用双线性插值将输出分割图放大到所需的大小。这种仅在完成所有处理之后进行放大的技术存在于许多最先进的工作中。
Semantic Segmentation with Deep Learning(深度学习的语义分割)
PSPNet model structure

The One Hundred Layers Tiramisu (FCDenseNet)

如果深度学习带来了一个令人敬畏的趋势,那就是令人敬畏的研究论文名称! Hundred Layers Tiramisu FCDenseNet(听起来很美味!)使用了与我们之前看到的U-Net架构类似的结构。 主要贡献是巧妙地使用类似于DenseNet分类模型的密集连接。

这真正强调了计算机视觉的强劲趋势,其中特征提取前端是在任何其他任务上表现良好的主要支柱。 因此,寻找准确度增益的第一个位置通常是您的特征提取前端。
Semantic Segmentation with Deep Learning(深度学习的语义分割)
FCDenseNet model structure

重新思考Atrous Convolution(DeepLabV3)
DeepLabV3是另一种进行多尺度处理的聪明方式,这次不增加参数。

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

这就是DeepLabV3的主要贡献所在,聪明地使用了Atrous卷积。常规卷积只能处理非常本地的信息,因为权重总是彼此相邻。例如,在标准3x3卷积中,一个权重与任何其他权重之间的距离仅为单个步长/像素。

对于有紊乱的卷积,我们将直接增加卷积权重之间的间距,而不会实际增加操作中的权重数量。所以我们仍然使用总共9个参数的3x3,我们只是将我们乘以的权重间隔得更远!每个重量之间的距离称为膨胀率。下面的模型图很好地说明了这个想法。

当我们使用低扩张率时,我们将处理非常本地/低规模的信息。当我们使用高扩张率时,我们处理更多的全球/大规模信息。因此,DeepLabV3模型将不同的扩张率与不同的扩张率混合在一起,以捕获多尺度信息。

在PSPNet所解释的所有处理之后的最终扩展技术也在这里完成。

Semantic Segmentation with Deep Learning(深度学习的语义分割)
DeepLabV3 model structure

Multi-Path Refinement Networks (RefineNet)

我们之前看到FRRN如何很好地直接组合来自多个分辨率的信息并将它们组合在一起。缺点是在如此高分辨率下的处理是计算密集型的,我们仍然必须处理并将这些特征与低分辨率组合在一起!

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

然后,RefineNet以自下而上的方式处理这些多分辨率特征图,以组合多尺度信息。首先,每个要素图都是独立处理的。然后,当我们升级时,我们将低分辨率特征映射与更高分辨率的特征映射组合在一起,对它们进行进一步处理。因此,多尺度特征图既独立又一起处理。整个过程在下图中从左向右移动。

在PSPNet和DeepLabV3的解释之后,在所有处理之后最后进行放大的技术也在这里完成。
Semantic Segmentation with Deep Learning(深度学习的语义分割)
RefineNet model structure

Large Kernel Matters (GCN)

之前,我们看到DeepLabV3模型如何使用具有不同扩张率的迂回卷积来捕获多尺度信息。这个棘手的部分是我们一次只能处理一个刻度,然后必须在以后组合它们。例如,速率为16的迂回卷积不能很好地处理本地信息,并且必须稍后与来自具有小得多的速率的卷积的信息组合以便在语义分割中表现良好。

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

为此,全球卷积网络(GCN)巧妙地建议使用大型一维内核而不是方形内核。对于3x3,7x7等方形卷积,我们不能在没有大量速度和内存消耗的情况下使它们太大。另一方面,一维内核的扩展效率更高,我们可以使它们相当大而不会过度减慢网络速度。这篇论文甚至一直到15的大小!
你必须要做的重要事情是平衡水平和垂直卷积。此外,本文确实使用了小的3x3卷积和低滤波器数,以便有效地细化一维转换可能遗漏的任何内容。

GCN通过处理来自特征提取前端的每个比例,遵循与先前作品相同的样式。由于一维卷积的效率,GCN在所有比例上执行处理直到全分辨率,而不是在之后保持小和升级。这允许在我们按比例放大时不断细化分割,而不是由于保持较低分辨率而可能发生的瓶颈缩颈。

Semantic Segmentation with Deep Learning(深度学习的语义分割)
GCN model structure

DeepLabV3+

顾名思义,DeepLabV3 +模型是DeepLabV3的快速扩展,借鉴了之前的一些概念性思路。 正如我们之前看到的那样,如果我们只是等待在网络末端使用双线性插值进行升级,则存在潜在的瓶颈。 事实上,最初的DeepLabV3模型最终由x16升级了!

为了解决这个问题,DeepLabV3 +建议在DeepLabV3之上添加一个中间解码器模块。 在通过DeepLabV3处理之后,然后通过x4对功能进行上采样。 然后,在通过x4再次升级之前,它们将与特征提取前端的原始特征一起进一步处理。 这减轻了来自网络末端的负载,并提供了从特征提取前端到网络近端的快捷路径。

Semantic Segmentation with Deep Learning(深度学习的语义分割)
DeepLabV3+ model structure

CVPR and ECCV 2018
我们在上一节中介绍的网络代表了您进行语义分段时需要了解的大部分技术!今年在计算机视觉会议上发布的大部分内容都是微小的更新和准确性的小疙瘩,对于开展并非极其重要。为了彻底,我在这里为所有感兴趣的人提供他们的贡献的快速回顾!

图像级联网络(ICNet) - 使用深度监督并以不同的比例运行输入图像,每个比例通过他们自己的子网络并逐步组合结果

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

DenseASPP - 将密集连接与萎缩卷曲相结合

上下文编码 - 利用全局上下文通过添加频道关注模块来提高准确性,该模块根据新设计的损失触发某些特征地图的注意力功能。该损失基于网络分支,该网络分支预测图像中存在哪些类(即更高级别的全局上下文)。

密集解码器快捷方式连接 - 在解码阶段使用密集连接以获得更高的准确度(以前仅在特征提取/编码期间完成)

双边分段网络(BiSeNet) - 有2个分支:一个用于获取语义信息,另一个在输入图像上进行非常小/次的处理至于保留低级像素信息

ExFuse - 使用深度监督并在处理前明确组合特征提取前端的多尺度特征,以确保多尺度信息在各个层面一起处理。Semantic Segmentation with Deep Learning(深度学习的语义分割)
ICNet model structure

TL;DR or how to do semantic segmentation

  • 注意分类净权衡。 您的分类网络是您处理功能的主要驱动因素,您的大部分收益/损失将来自此处
  • 以多种尺度处理并将信息组合在一起
  • 多尺度池,atrous convs,大型一维转换都有利于语义分割
  • 您无需以高分辨率进行大量处理。 大部分都是在低速下进行速度,然后是高档,并在必要时进行最后的光处理
  • 深度监督可以提高你的准确性(虽然设置培训比较棘手)