语义分割入门——最近几年state of the art简介

以下内容翻译自George Seif的“Semantic Segmentation with Deep Learning: A guide and code”


什么是语义分割?

在深度学习和计算视觉社区的大部分人,对图像分类是这样理解的:想要模型告诉我们在图片中的某个物体或者场景是什么。分类是粗糙和高维度(coarse and high-level)的问题

物体检测也为人所熟知,通过在物体周围画出bounding boxes来确定图片中多个物体的位置和类别。检测属于中等维度(mid-level)的问题,虽然我们得到了相当有用且详细的信息,但是由于只画出了bounding boxes而不知道物体明确的形状,仍旧是有点简略。

语义分割是三者中信息量最大的,目标是实现将每个像素点归到某个类别下,如动图中所示。在过去的几年里,深度学习已经完全能做这个事情了。

在这篇指导中,你会了解到语义分割模型的基本结构以及他人的工作(都是最近这段时间最好的方法)。

如果你想要亲自实现这些模型,可以选择语义分割套装(Semantic Segmentation Suite)。在这个套装中,有很多模型的训练和测试代码,代码由TensorFlow实现。

基本结构

接下来展示的语义分割模型基本结构,出现在目前所有的最好方法中。这使得实现不同的方法变得非常简单,因为几乎所有的方法有着相同的骨架(主干),配置和流程。

U-Net模型是一个很好的例子来说明这种结构。模型的左边代表了可以使用任意用于图像分类的特征提取网络,比如VGG网络、Res网络、Dense网络、MobileNets和NASNets。这里可以使用任何想用的网络。

U-Net

在选择分类网络提取特征的时候,主要考虑的是“折中”。使用非常深的网络,比如ResNet152,会得到更高的精度,但是不会像MobileNet那么快。这种“折中”思想不仅在分类问题的需要考虑,在分割问题中也同样需要考虑。最重要的事情,在设计和选择分割网络时,这个主干将会是最大的驱动因素。

一旦这些特征被提取,接下来就会在不同尺度下进一步被处理。理由有如下两个方面。

首先,模型非常可能会遇到不同尺寸的物体;在不同尺度下处理特征,能够使得网络能够兼容各种不同尺寸的物体。

第二,在实行分割的时候,存在“折中”。如果想要更好的分类精度,那么从网络后期来处理这些high level特征,因为这其中包含更具有辨别能力和更加有用的分割信息。另一方面,如果只处理那些深度特征,由于分辨率较低,那么就难以得到很好地局部效果

近段时间最先进的方法都遵循以上这种特征提取之后进行多尺度处理的方式。如此一来,很多方法都能够得以端到端的训练。剩下所需要考虑的问题,精度VS速度或者内存,因为目前所有人都在提出新方法解决这种“折中”问题,并且同时保持效率。

在接下来最好方法的演进上,着重介绍最新的方法。我们按照大致以时间顺序展开,这也对应最好方法的发展进程。


最好方法的演进过程

Full-Resolution Residual Networks (FRRN)

FRRN模型是一个用多尺度处理技术非常清晰的例子。通过两个独立的流过程实现:残差流和池化流。

FRRN

我们想要处理这些语义特征来得到更高的分类精度,因此,在池化流中FRRN逐步处理并且下采样特征图。同时,在残差流中,模型以完整分辨率来处理特征图。因此,池化流处理high-level语义信息(为了更高的分类精度),残差流处理low-level像素信息(为了更好的局部精度)。

因为我们要训练一个端到端的网络,因此,不能让这个两个流变得完全没有连接。在每个最大池化(max pooling)之后,FRRN作了一系列对2个流的特征图的连接操作,使得他们的信息得以整合。

Pyramid Scene Parsing Network (PSPNet)

FRRN最大的贡献在于,直接实现了多尺度处理。但是,在每一个尺度上进行处理是想到的计算密集的。然而,FRRN会在全尺寸分辨率上进行处理,非常地慢。

PSPNet提出了一种聪明的方法,通过使用池化的多个尺度(multiple scales of pooling)来绕过这个问题。首先,通过一个标准特征提取网络(ResNet, DenseNet等),然后使用第三次下采样的特征进一步处理。

为了得到多尺度信息,PSPNet利用4个不同的最大池化操作,具有4种不同的窗口大小和步幅。从4种不同的尺度有效获得了特征信息,而不需要单独处理每一个特征图。在对每一个特征图做了轻量级的卷积之后进行上采样,这样每个特征图都在相同的分辨率上,对此进行集中整合。

由此,实现了结合多尺度特征图,而没有做多次卷积。

为了快速,所有的这些是在低分辨率特征上实现的。最后,我们对输出的分割图进行双线性上采样,来达到想要的尺度。这种在所有处理完成之后进行上采样的技术,出现在很多先进的方法中。

The One Hundred Layers Tiramisu (FCDenseNet)

FCDenseNet使用了和U-Net相似的结构。其主要贡献在于聪明地使用了稠密连接(dense connections),就像是DenseNet分类模型。

在计算机视觉中,这真正强调了强劲趋势,特征提取前端是在其他任务上表现良好的主要支撑。因此,为了得到更好的增益,第一位的就是特征提取前端。

Rethinking Atrous Convolution (DeepLabV3)

DeepLabV3用了另一种聪明的方法来实现多尺度处理,这次没有增加参数。

这是非常轻量级的模型。我们再次从特征提取前端开始,使用了4次下采样的特征用于进一步处理。分辨率变得很低(只有输入的十六分之一),因此这将是一件棒呆的事情,如果我们只需要处理这里。tricky的部分是,在如此低分辨率的情况下,很难得到好的局部化效果,因为其可怜的像素精度。

到这里,DeepLabV3的主要贡献登场了,巧妙地使用了Atrous卷积。常规卷积只能处理非常局部的信息,因为权重总是彼此相邻。比如,一个标准 3x3卷积,一个权值到任意另一个的距离只有一个像素点。

通过atrous卷积,我们很直接地增加了卷积权值的间距,而没有实际增加权值的数量。仍旧是 3x3,总共9个参数,只是将需要相乘的权重隔得更远。每个权值间的距离被称作扩张率(dilation rate)。下图阐释了这种想法。

当文明使用了一个低的扩张率,我们将处理非常局部的信息。反之,我们处理的是全局的或者说是高尺度的信息。因此,DeepLabV3模型混合了atrous卷积和扩张率,来获得多尺度信息。

在所有处理的最后使用上采样技术,就和在PSPNet中是一样的。

Multi-Path Refinement Networks (RefineNet)

在这之前,我们了解了FRRN如何直接结合多分辨率信息实现了良好的效果。缺点:在高分辨率下计算量很大,并且我们仍旧不得不处理和结合那些低分辨率特征。

RefineNet模型克服了这一缺点。当将图片输入到特征提取网络,将会自然地得到每次下次样后的多尺度特征图。

然后RefineNet以自底向上的方式,处理这些多分辨率特征图,来结合多尺度信息。首先,每个特征图被独立地处理。然后,上采样 将低分辨率特征图结合对应的高分辨率图,在这两者之上都将做进一步处理。接下来,多尺度特征图被独立处理和共同处理。整个过程从左到右如图所示。

最后,在上采样技术之后的所有操作,和在PSPNet和DeepLabV3中是相同的。

Large Kernel Matters (GCN)

之前,DeepLabV3模型使用了带有不同dilation率的atrous卷积来获得多尺度信息。tricky的部分,我们只能够一次处理一个单一尺度,然后不得不在此之后结合他们。一个带有16倍率的atrous卷积不会在局部信息中有很好的效果,必须在结合从带有更小倍率的卷积中得到信息,才能在分割中实现更好的效果。

因此,在之前的方式中,多尺度处理分别进行,然后一起结合它们作为结果。如果能够一次获得多尺度信息,那一定将是相当有用的。

为了做到这点,全局卷积网络(GCN)巧妙地提出了使用巨大的一维内核而不是用方阵内核。例如3x3和7x7等方阵卷积,不能用的特别大而不会造成巨大的速度和内存开销。在其他的尺寸上,一维卷积内核更加高效,即使让尺寸变大,网络不会减慢太多。在文中,尺寸一路到达了15。

需要确认的重要事项,平衡好水平方向和竖直方向的卷积。另外,文章正是使用了小的3x3的卷积核和少的滤波器数量,来达到有效细化一维卷积可能遗漏的任意内容。

GCN遵循着和之前的工作相同的风格,通过处理从特征提取前端 每个尺寸。由于一维卷积的高效性,GCN处理所有的尺寸,从最小的直到全尺寸分辨率,而不是保持小尺寸,在之后对其上采样。这使得当我们上采样时,分割的常数细化,而不是由于在低分辨上而可能导致的瓶颈。(GCN follows the same style as previous works by processing each scale
from the feature extraction frontend. Because of the efficiency of the one-dimensional convolutions, GCN performs processing on all scales all the way up to the full resolution, rather than staying small and upscaling afterwards. This allows for constant refinement of the)

DeepLabV3+

DeepLabV3+是DeepLabV3的快速版本,借鉴了一些之前提到的算法的先进理念。正如之前所提到的,如果我们仅仅等到网络最后进行双线性插值上采样,会有潜在的性能瓶颈。而且,原先的DeepLabV3在模型最后用了16倍上采样!

为了解决这个问题,DeepLabV3+提出在DeepLabV3前增加一个中间的解码器机制。通过DeepLabV3处理之后,特征被上采样了4倍。在被再次上采样4倍之前,从特征提取前端,通过原先的特征,特征被进一步处理。这使得模型最后的负担变轻,并且提供了从特征提取前端到接近模型末端的捷径