深度学习的语义分割:指南与代码

点击上方关注,All in AI中国

作者:George Seif

深度学习的语义分割:指南与代码

什么是语义分割?

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

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

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

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

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

基本结构

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

U-Net模型很好地说明了这种结构。模型的左侧表示训练用于图像分类的任何特征提取网络。这包括像VGGNet、ReNETs、DeNeNETS、MobileNets和NasNETs这样的网络!你可以在那里使用任何你想要的东西。

选择分类网络进行特征提取时,最重要的是要记住权衡。使用非常深的ResNet152将获得极高的准确性,但不会像MobileNet那样快。将这些网络应用于分类时出现的权衡也会在使用它们进行分割时出现。需要记住的重要一点是,在设计/选择分段网络时,这些主干网将成为主要驱动因素。

深度学习的语义分割:指南与代码

用于分割的U-Net模型

一旦提取了这些特征,它们就会以不同的规模进一步处理。其原因是双重的。首先,你的模型很可能会遇到许多不同尺度的对象;以不同规模处理这些特征将给网络提供处理这些不同尺度的能力。

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

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

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

全分辨率残差网络(FRRN)

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

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

现在,由于我们正在训练一个端到端的网络,因此我们不希望这两个流完全断开连接。因此,在每次最大池化之后,全分辨率残差网络(FRRN)对来自两个流的特征映射进行一些联合处理,以组合它们的信息。

深度学习的语义分割:指南与代码

全分辨率残差网络(FRRN)模型结构

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

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

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

为了获得多尺度信息,金字塔场景解析网络(PSPNet)应用4种不同的最大池操作,具有4种不同的窗口大小和步幅。这有效地捕获了4个不同尺度的特征信息,而无需对每个尺度进行繁重的单独处理!我们只需对每个进行轻量级卷积,然后进行上采样,以便每个特征图具有相同的分辨率,并将它们全部连接起来。

瞧!我们组合了多尺度特征图,而没有对它们进行多次卷积!

所有这些都是在较低分辨率的高速特征图上完成的。最后,我们使用双线性插值将输出分割图放大到所需的大小。这种仅在完成所有处理之后进行放大的技术存在于许多最先进的工作中。

深度学习的语义分割:指南与代码

PSPNet模型结构

百层提拉米苏(FCDenseNet)

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

这确实强调了计算机视觉的强势趋势,其中特征提取前端是执行任何其他任务的主要支柱。因此,寻找精确性增益的第一个地方往往是你的特征提取前端。

深度学习的语义分割:指南与代码

FCDenseNet模型结构

重新思考无规卷积(DeepLabV3)

DeepLabV3是另一种进行多尺度处理的聪明方式,这次不增加参数。

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

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

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

当我们使用低膨胀率时,我们将处理非常本地/低规模的信息。当我们使用高膨胀率时,我们处理更多的全局大规模信息。因此,DeepLabV3模型将无规的卷积与不同的膨胀率混合以捕获多尺度信息。

在PSPNet所解释的所有处理之后最后进行放大的技术也在这里完成。

深度学习的语义分割:指南与代码

DeepLabV3模型结构

多路径细化网络(RefineNet)

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

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

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

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

在PSPNet和DeepLabV3的解释之后,在所有处理之后最后进行放大的技术也在这里完成。

深度学习的语义分割:指南与代码

RefineNet模型结构

全局卷积网络(GCN)

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

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

为此,全局卷积网络(GCN)巧妙地建议使用大型一维内核而不是方形内核。对于3×3,7×7等方形卷积,我们不能在没有大量速度和内存消耗的情况下使它们太大。另一方面,一维内核的扩展效率更高,我们可以使它们相当大,而不会过度减慢网络速度。在这篇论文甚至一直都达到15!

你必须要做的重要事情是平衡水平和垂直卷积。此外,本文确实使用了具有低过滤器的小的3×3卷积,以有效地细化一维转换可能遗漏的任何内容。

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

深度学习的语义分割:指南与代码

GCN模型结构

DeepLabV3 +

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

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

深度学习的语义分割:指南与代码

DeepLabV3 +模型结构

CVPR和ECCV 2018

我们在上一节中介绍的网络代表了你进行语义分段时需要了解的大部分技术!今年在计算机视觉会议上发布的大部分内容都是微小的更新和准确性的一些小更改,对于开始工作来说并不是非常关键。为了更彻底的了解,我在这里为所有感兴趣的人提供他们的贡献的快速回顾!

图像级联网络(ICNet) - 使用深度监控并以不同的尺度运行输入图像,每个尺度都通过自己的子网进行扩展并逐步组合结果

https://arxiv.org/pdf/1704.08545.pdf

判别特征网络(DFN) - 使用深度监督并尝试分别处理片段的平滑和边缘部分

openaccess.thecvf.com/content_cvpr_2018/papers/Yu_Learning_a_Discriminative_CVPR_2018_paper.pdf

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

openaccess.thecvf.com/content_cvpr_2018/papers/Yang_DenseASPP_for_Semantic_CVPR_2018_paper.pdf

场景编码 - 通过添加通道注意模块来利用全局场景来提高准确性,该模块基于新设计的损失函数触发对某些特征映射的注意。损失基于网络分支,该网络分支预测图像中存在哪些类(即更高级别的全局场景)。

openaccess.thecvf.com/content_cvpr_2018/papers/Zhang_Context_Encoding_for_CVPR_2018_paper.pdf

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

openaccess.thecvf.com/content_cvpr_2018/papers/Bilinski_Dense_Decoder_Shortcut_CVPR_2018_paper.pdf

双边分割网络(BiSeNet) - 具有2个分支:一个用于获取语义信息,而另一个对输入图像进行很少/较小的处理以保持低层像素信息。

https://arxiv.org/pdf/1808.00897v1.pdf

ExFuse - 使用深度监督并在处理之前明确组合特征提取前端的多尺度特征,以确保在各个级别一起处理多尺度信息。

openaccess.thecvf.com/content_ECCV_2018/papers/Zhenli_Zhang_ExFuse_Enhancing_Feature_ECCV_2018_paper.pdf

深度学习的语义分割:指南与代码

ICNet模型结构

TL;DR或如何进行语义分割

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

深度学习的语义分割:指南与代码

相关推荐