图像语义分割的工作原理和CNN架构变迁

图像分割是根据图像内容对指定区域进行标记的计算机视觉任务,简言之就是「这张图片里有什么,其在图片中的位置是什么?」本文聚焦于语义分割任务,即在分割图中将同一类别的不同实例视为同一对象。作者将沿着该领域的研究脉络,说明如何用卷积神经网络处理语义图像分割的任务。

更具体地讲,语义图像分割的目标在于标记图片中每一个像素,并将每一个像素与其表示的类别对应起来。因为会预测图像中的每一个像素,所以一般将这样的任务称为密集预测。

语义分割的例子,目标是预测图像中每一个像素的类别标签。(图源:http://host.robots.ox.ac.uk/pascal/VOC/voc2012/#devkit)

当我们有越来越多要用机器执行的任务时,为这些机器配备必需的感知器是很重要的。

自动驾驶中实时语义分割道路场景。(图源:https://m.youtube.com/watch?v=ATlcEDSPWXY)

还有一点要注意的是我们不会分割同一类别的实例,只需要关注每一个像素的类别。换句话讲,如果在输入图像中有两个目标属于同一类,分割映射不会将其分为单独的两个目标。

相对地,实例分割模型是另一种不同的模型,该模型可以区分同一类的不同目标。

任务表征

简单地说,我们的目标是要用 RGB 图(高 x 宽 x3)或灰度图(高 x 宽 x1)为输入,并输出一个分割图,在分割图中每个像素都包括一个用整数表示的类别标签(高 x 宽 x1)。

注意:为了视觉上的理解简单起见,我标记的是分辨率比较低的预测图。事实上,分割标签的分辨率是和原始输入图的分辨率相对应的。

与我们处理标准分类值的方法相似,我们通过独热编码类别标签的方法创建目标——本质上讲是要为每一个可能的类创建一个输出通道。



然后我们可以利用每一个像素位深向量的 argmax 函数将预测值分解为分割映射(如上图所示)。

也可以通过将目标重叠在输入图像上来对目标进行观察。

建立网络架构

针对这项任务简单地构建神经网络架构的方法是简单地堆叠大量卷积层(用 same 填充保留维度)后输出最终的分割映射。通过特征图的接连转换,直接从输入图像学到了相对应的分割映射;然而,在整个网络中要保留完整分辨率的计算成本是很高的。

图源:http://cs231n.stanford.edu/slides/2017/cs231n_2017_lecture11.pdf

回顾深度卷积网络,前期的卷积层更倾向于学习低级概念,而后期的卷积层则会产生更高级(且专一)的特征图。为了保持表达性,一般而言,当我们到达更深层的网络时,需要增加特征图(通道)的数量。

对图像分类任务而言,这不一定会造成什么问题,因为对这个任务而言,我们只需要关注图像里面有什么(而不是目标类别对象的位置)。因此,我们可以通过池化或逐步卷积(即压缩空间分辨率)定期对特征图进行下采样以缓和计算压力。

常用的图像分割模型的方法遵循编码器/解码器结构,在这个结构中,我们对输入的空间分辨率下采样,产生分辨率更低的特征图,通过学习这些特征图可以更高效地分辨类别,还可以将这些特征表征上采样至完整分辨率的分割图。

图源:http://cs231n.stanford.edu/slides/2017/cs231n_2017_lecture11.pdf

上采样方法

我们可以用很多不一样的方法对特征图的分辨率上采样。池化操作通过汇总局部区域的单个值(平均池化或最大池化)下采样分辨率,「上池化」操作通过将单个值分配给更高的分辨率对分辨率进行上采样。

图源:http://cs231n.stanford.edu/slides/2017/cs231n_2017_lecture11.pdf

迄今为止,转置卷积(transpose convolutions)是最常用的方法,因为转置卷积允许我们开发学习过的上采样。

图源:http://cs231n.stanford.edu/slides/2017/cs231n_2017_lecture11.pdf

与转置卷积相反,经典的卷积运算会将卷积核权重与当前值进行点积,并为相应输出位置产生单个值。转置卷积会先从低分辨率的特征映射中得到单个值,再用该值与卷积核中所有权重相乘,然后将这些加权值映射到输出特征图中。

通过转置运算进行上采样的 1D 的例子(图源:http://cs231n.stanford.edu/slides/2017/cs231n_2017_lecture11.pdf)

对在输出特征映射图中产生重叠(如下图所示是步长为 2 的 3x3 卷积核)的卷积核尺寸而言,重叠值是简单的叠加。不幸的是,这会在输出中产生棋盘效应(棋盘状伪影),所以最好保证卷积核不会产生重叠。

输入是蓝色格子,输出是绿色格子。(图源:https://github.com/vdumoulin/conv_arithmetic)

全卷积网络

Long 等人在 2014 年末介绍了使用「全卷积」网络对图像分割的任务进行端到端、像素到像素的训练方法 (https://arxiv.org/abs/1411.4038)。这篇论文的作者提出将现有的、经过充分研究的图像分类网络(如 AlexNet)作为网络的编码模块,用转置卷积层作为解码模块,将粗略的特征图上采样至全分辨率的分割图。

图源:https://arxiv.org/abs/1411.4038

如下图所示,完整的网络是根据像素层面的交叉熵损失训练的。

图源:https://arxiv.org/abs/1411.4038

但因为编码模块将输入的分辨率降低了 32 倍,所以解码模块难以产生精细的分割图(如下图所示)。

文章作者是这样说明这一问题的:

语义分割面临的主要是语义和位置之间的紧张关系:全局信息解决语义问题,而局部信息解决位置问题……将精细层和粗略层结合,使模型做出不违背全局结构的局部预测。

添加跳过连接

作者通过缓慢地对编码表征进行上采样以解决这个问题,在前期层中加入「跳过连接」,并汇总这两个特征图。

图源:https://arxiv.org/abs/1411.4038(有修改)

这些来自网络较前期层的跳过连接(在下采样操作之前)应该提供必要的细节,以准确重建分割图边界的形状。事实上,我们的确可以用添加的这些跳过连接恢复更精细的细节。

Ronneberger 等人通过扩展网络解码模块的容量改进「全卷积」结构 (https://arxiv.org/abs/1505.04597)。更具体地讲,他们提出了「由捕获内容的收缩路径和(对称的)精确定位的扩张路径组成」的 U-Net 架构。这个更简单的架构已经很常用了,而且适用于大量分割问题。

注意:由于使用了 valid 填充,原始架构会导致分辨率下降。但也有人选择使用 same 填充,这些填充值是从边界处图像映射中获取的。

Long 等人(FCN 论文)认为数据的扩增不会导致模型性能的明显提升,Ronneberger 等人(U-Net 论文)相信对模型学习而言数据扩增是关键概念。看来,数据扩增的有用程度也许与问题领域有关。

高级的 U-Net 变体

标准的 U-Net 模型由架构中每个「块」的一系列卷积运算组成。一般的卷积网络架构存在大量更高级的「块」,这些「块」可以替换堆栈卷积层。

Drozdzal 等人替换了基本的堆叠卷积块以支持残差块(https://arxiv.org/abs/1608.04117)。这种残差块在标准 U-Net 结构中存在的长程跳过连接(在编码模块和解码模块相对应的特征图之间)中引入了短程跳过连接。他们认为短程跳过连接在训练时可以更快地收敛,而且可以训练更深层的网络。

Jegou 等人对此进行了扩展,在遵循 U-Net 结构的情况下,提出使用密集块(https://arxiv.org/abs/1611.09326)。他们认为「DenseNets 的特征使它们非常适合语义分割,因为它们可以自然地产生跳过连接和多级监督。」这些密集块很有用,因为它们在前面的层传递低级特征,直接与更高层的更高级特征并行,从而实现高效的特征重用。

图源:https://arxiv.org/abs/1611.09326(有修改)

该架构的一个非常重要的方面是上采样路径在密集块的输入和输出之间没有跳过连接。作者还指出,因为「上采样路径增加了特征图空间分辨率,特征数量的线性增长对内存要求过高。」因此,只有密集块的输出在解码器模块中传递。

FC-DenseNet103 模型在 CamVid 数据集上得到了最好的结果(2017 年 10 月)

扩张卷积(空洞卷积)

对特征映射进行下采样的一个好处是在给定常量卷积核尺寸的情况下扩展了感受野(对于输入)。由于大尺寸卷积核的参数效率较低(3.1 节所讨论),所以这种方法比增加卷积核尺寸更加合理。然而,这种扩展的代价是降低了空间分辨率。

扩张卷积提供了另一种在保留完整空间维度的同时还能获得广泛视野的方法。如下图所示,扩张卷积根据指定的扩张率(dilation rate)用值将空间间隔开。

图源:https://github.com/vdumoulin/conv_arithmetic

还有一些架构将最后几个池化层替换为具有连续增大扩张率的扩张卷积,这样可以在防止空间细节的丢失的同时保持相同的感受野。然而,要用扩张卷积完全替换池化层,计算成本还是很高。

损失加权方案

由于密集预测的本质,我们在衡量损失加权时有很大的灵活性。

Long 等人(FCN 论文)提出对于每个输出通道的加权损失都是为了抵消数据集中的类别不平衡。

与此同时,Ronneberger 等人(U-Net 论文)提出了一种针对每个像素的损失加权的方案,这种方案使得在分割对象的边界处有更高的权重。这个损失加权方案帮助他们的 U-Net 模型在生物医学图像中分割出细胞,从而可以在分割图中轻易地识别单个细胞。

请注意分割图是如何在细胞周围产生清晰的边界的。(图源:https://arxiv.org/abs/1505.04597)

原文链接:https://www.jeremyjordan.me/semantic-segmentation/


理论
3
相关数据
神经网络技术
Neural Network

(人工)神经网络是一种起源于 20 世纪 50 年代的监督式机器学习模型,那时候研究者构想了「感知器(perceptron)」的想法。这一领域的研究者通常被称为「联结主义者(Connectionist)」,因为这种模型模拟了人脑的功能。神经网络模型通常是通过反向传播算法应用梯度下降训练的。目前神经网络有两大主要类型,它们都是前馈神经网络:卷积神经网络(CNN)和循环神经网络(RNN),其中 RNN 又包含长短期记忆(LSTM)、门控循环单元(GRU)等等。深度学习是一种主要应用于神经网络帮助其取得更好结果的技术。尽管神经网络主要用于监督学习,但也有一些为无监督学习设计的变体,比如自动编码器和生成对抗网络(GAN)。

Alex网络技术
AlexNet

AlexNet是一个卷积神经网络的名字,最初是与CUDA一起使用GPU支持运行的,AlexNet是2012年ImageNet竞赛冠军获得者Alex Krizhevsky设计的。该网络达错误率大大减小了15.3%,比亚军高出10.8个百分点。AlexNet是由SuperVision组设计的,由Alex Krizhevsky, Geoffrey Hinton和Ilya Sutskever组成。

收敛技术
Convergence

在数学,计算机科学和逻辑学中,收敛指的是不同的变换序列在有限的时间内达到一个结论(变换终止),并且得出的结论是独立于达到它的路径(他们是融合的)。 通俗来说,收敛通常是指在训练期间达到的一种状态,即经过一定次数的迭代之后,训练损失和验证损失在每次迭代中的变化都非常小或根本没有变化。也就是说,如果采用当前数据进行额外的训练将无法改进模型,模型即达到收敛状态。在深度学习中,损失值有时会在最终下降之前的多次迭代中保持不变或几乎保持不变,暂时形成收敛的假象。

计算机视觉技术
Computer Vision

计算机视觉(CV)是指机器感知环境的能力。这一技术类别中的经典任务有图像形成、图像处理、图像提取和图像的三维推理。目标识别和面部识别也是很重要的研究领域。

卷积神经网络技术
Convolutional neural network

卷积神经网路(Convolutional Neural Network, CNN)是一种前馈神经网络,它的人工神经元可以响应一部分覆盖范围内的周围单元,对于大型图像处理有出色表现。卷积神经网路由一个或多个卷积层和顶端的全连通层(对应经典的神经网路)组成,同时也包括关联权重和池化层(pooling layer)。这一结构使得卷积神经网路能够利用输入数据的二维结构。与其他深度学习结构相比,卷积神经网路在图像和语音识别方面能够给出更好的结果。这一模型也可以使用反向传播算法进行训练。相比较其他深度、前馈神经网路,卷积神经网路需要考量的参数更少,使之成为一种颇具吸引力的深度学习结构。 卷积网络是一种专门用于处理具有已知的、网格状拓扑的数据的神经网络。例如时间序列数据,它可以被认为是以一定时间间隔采样的一维网格,又如图像数据,其可以被认为是二维像素网格。

交叉熵技术
Cross-entropy

交叉熵(Cross Entropy)是Loss函数的一种(也称为损失函数或代价函数),用于描述模型预测值与真实值的差距大小

映射技术
Mapping

映射指的是具有某种特殊结构的函数,或泛指类函数思想的范畴论中的态射。 逻辑和图论中也有一些不太常规的用法。其数学定义为:两个非空集合A与B间存在着对应关系f,而且对于A中的每一个元素x,B中总有有唯一的一个元素y与它对应,就这种对应为从A到B的映射,记作f:A→B。其中,y称为元素x在映射f下的象,记作:y=f(x)。x称为y关于映射f的原象*。*集合A中所有元素的象的集合称为映射f的值域,记作f(A)。同样的,在机器学习中,映射就是输入与输出之间的对应关系。

独热编码技术
One hot encoding

独热编码是将分类变量转换为可提供给机器学习算法更好地进行预测的形式的过程。 一种稀疏向量,其中:一个元素设为 1;所有其他元素均设为 0。 one-hot 编码常用于表示拥有有限个可能值的字符串或标识符。例如,假设某个指定的植物学数据集记录了 15000 个不同的物种,其中每个物种都用独一无二的字符串标识符来表示。在特征工程过程中,您可能需要将这些字符串标识符编码为 one-hot 向量,向量的大小为 15000。

池化技术
Pooling

池化(Pooling)是卷积神经网络中的一个重要的概念,它实际上是一种形式的降采样。有多种不同形式的非线性池化函数,而其中“最大池化(Max pooling)”是最为常见的。它是将输入的图像划分为若干个矩形区域,对每个子区域输出最大值。直觉上,这种机制能够有效的原因在于,在发现一个特征之后,它的精确位置远不及它和其他特征的相对位置的关系重要。池化层会不断地减小数据的空间大小,因此参数的数量和计算量也会下降,这在一定程度上也控制了过拟合。通常来说,CNN的卷积层之间都会周期性地插入池化层。

感知器技术
perceptron

感知器是Frank Rosenblatt在1957年就职于Cornell航空实验室时所发明的一种人工神经网络。它可以被视为一种最简单形式的前馈神经网络,是一种二元线性分类器。 Frank Rosenblatt给出了相应的感知机学习算法,常用的有感知机学习、最小二乘法和梯度下降法。

参数技术
parameter

在数学和统计学裡,参数(英语:parameter)是使用通用变量来建立函数和变量之间关系(当这种关系很难用方程来阐述时)的一个数量。

自动驾驶技术
self-driving

从 20 世纪 80 年代首次成功演示以来(Dickmanns & Mysliwetz (1992); Dickmanns & Graefe (1988); Thorpe et al. (1988)),自动驾驶汽车领域已经取得了巨大进展。尽管有了这些进展,但在任意复杂环境中实现完全自动驾驶导航仍被认为还需要数十年的发展。原因有两个:首先,在复杂的动态环境中运行的自动驾驶系统需要人工智能归纳不可预测的情境,从而进行实时推论。第二,信息性决策需要准确的感知,目前大部分已有的计算机视觉系统有一定的错误率,这是自动驾驶导航所无法接受的。

感知技术
perception

知觉或感知是外界刺激作用于感官时,脑对外界的整体的看法和理解,为我们对外界的感官信息进行组织和解释。在认知科学中,也可看作一组程序,包括获取信息、理解信息、筛选信息、组织信息。与感觉不同,知觉反映的是由对象的各样属性及关系构成的整体。

堆叠技术
Stacking

堆叠泛化是一种用于最小化一个或多个泛化器的泛化误差率的方法。它通过推导泛化器相对于所提供的学习集的偏差来发挥其作用。这个推导的过程包括:在第二层中将第一层的原始泛化器对部分学习集的猜测进行泛化,以及尝试对学习集的剩余部分进行猜测,并且输出正确的结果。当与多个泛化器一起使用时,堆叠泛化可以被看作是一个交叉验证的复杂版本,利用比交叉验证更为复杂的策略来组合各个泛化器。当与单个泛化器一起使用时,堆叠泛化是一种用于估计(然后纠正)泛化器的错误的方法,该泛化器已经在特定学习集上进行了训练并被询问了特定问题。

权重技术
Weight

线性模型中特征的系数,或深度网络中的边。训练线性模型的目标是确定每个特征的理想权重。如果权重为 0,则相应的特征对模型来说没有任何贡献。

推荐文章
一文了解什么是语义分割及常用的语义分割方法有哪些
机器之心3
英伟达发布深度学习GPU训练系统DIGITS 5,自带图像分割与在线模型库
曹瑞
百行代码构建神经网络黑白图片自动上色系统
机器之心1
返回顶部