一文了解语义分割网络!

本文我将讨论如何使用卷积神经网络来完成语义分割任务。语义分割是一个计算机视觉任务,在这项任务中我们根据显示的内容来标记图像的特定区域。

更具体的说,语义分割的目的是用所表示的内容的类别来为图像中每个图像打标签。因为我们是对图像中每个像素打标签,这类任务通常被称为密集预测

**需要注意的一点是,我们并不会分离同一个类别的不同实例,我们仅仅关注每个像素的类别。**换句话说,如果在图像中有两个相同类别的对象,分割图不会将它们区分为单独的对象。不同于语义分割,实例分割可以做到区分同一类别的不同对象。

分割模型可以应用到很多任务场景中,包括:

  • 自动驾驶

    我们需要给汽车装备必要的感知能力,使得汽车能够理解外部的环境,已达到在公路上正常行驶的效果。如图所示,展示了一种实时的自主驾驶道路分割场景。

    image-20210302233845572

  • 医疗图像诊断

    机器可以增加放射科医生的诊断能力,极大降低诊断测试所需要的时间。如图所示,展示了胸部x光片将心脏(红色)、肺(绿色)和锁骨(蓝色)分割开来。

任务描述

简单地说,我们的目的是输入一个RGB图像( h e i g t h ∗ w i d t h ∗ 3 heigth * width * 3 heigthwidth3)或者一个灰度图像( h e i g h t ∗ w i d t h ∗ 1 height * width * 1 heightwidth1),并输出一个分割图( h e i g h t ∗ w i d t h ∗ 1 height * width * 1 heightwidth1),图中每个像素包含一个用数字表示的类标签。

注意: 为了视觉清晰度,我已标记了一个低分辨率的预测图。实际上,分割标签的分辨率与输入图像的分辨率是匹配的。

与处理标准分类值类似,我们将通过对类标签采用独热编码的方式来创建输出目标。在这个输出目标上,实质上为每个可能的类别创建了一个输出通道。

通过获取每个通道方向上像素向量的argmax,可以将预测结果( h e i g t h ∗ w i d t h ∗ n u m _ c l a s s e s heigth * width * num\_classes heigthwidthnum_classes)折叠成一个分割图( h e i g t h ∗ w i d t h ∗ 1 heigth * width * 1 heigthwidth1)。

我们可以通过将结果覆盖到输入图像上,很容易地检测它。

当我们覆盖目标的单个通道时,我们称之为掩膜(mask)。它照亮图像中存在特定类别的区域。

构造一个网络结构

对于我们针对语义分割任务所要构造的网络结构,一个天真的想法是简单地堆叠一些卷积层(通过padding保持输入输出尺寸大小不变),然后输出一个最终的语义分割图。这种方法通过特征映射的连续变换,直接学习从输入图像到相应分割的映射。但是,在整个网络结构上保持完整的分辨率的计算代价非常高。 如下图所示,详情在公号后台回复【cs231n分割附件】查看。

回想一下,在深度卷积网络中,较浅的网络层倾向于学习低级概念,较深的网络层学习到更高级的特征映射。为了保持可表达性,我们通常随着网络的深入而增加特征映射(通道)的数量

这对于图像分类任务来说并不一定是一个问题,因为对于这个任务,我们只关心图像包含什么(而不是它位于何处)。因此,我们可以通过合并或跨步卷积(即压缩空间分辨率)周期性地降低特征图的采样来减轻计算负担。然而,**对于图像分割任务,**我们希望我们的模型能够产生一个全分辨率的语义预测。

那么对于图像分割任务,一个主流的方法是遵循编码器-解码器结构。在这种结构下,我们对输入图像的空间分辨率进行降采样,开发出低分辨率的特征映射,其能够高效地区分出物体的类别。然后上采样特征表示,形成一个全分辨率的分割图。

上采样的方法

我们可以采用几种方法来对一个特征图的分辨率进行上采样。我们知道,在 下采样阶段,我们采用池化操作(pooling)来对一个局部区域的数据进行处理,得到一个数值,通常处理的方法有最大值池化,以及均值池化。自然地,我们可以采用反池化(unpooling) 操作来将单个数值分配到更高的分辨率来实现上采样。

然而,对于上采样操作最主流的方法是转置卷积,它允许我们得到一个可学习的上采样方法。

一个典型的卷积运算将滤波器视图中当前值的点积并为相应的输出位置产生一个值,而转置卷积运算实际上是相反的。对于转置卷积,我们从低分辨率的特征映射中取一个值,并将滤波器中的所有权值乘以这个值,将这些加权值投影到输出特征映射中。

对于在输出特征映射中产生重叠的过滤器大小(如下面的例子所示,带有跨度2的3x3过滤器) ,重叠值被简单地添加到一起。不幸的是,这往往会在输出中产生棋盘式构件,因此最好确保过滤器大小不会产生重叠。

全卷积网络

在2014年11月由 Long et al. 提出了使用全卷积网络训练的端到端、像素到像素的的语义分割方法。论文作者提出将已有的、研究充分的图像分类模型(如AlexNet, VGG)进行改进,并应用到语义分割网络的编码器模块中,附加一个带转置卷积层的解码器模块,实现对粗糙特征映射进行上采样,得到全分辨率的分割图。

全卷积网络,如下图所示,根据像素级的交叉熵损失进行训练。

然而,由于编码器模块将输入的分辨率降低了32倍,解码器模块难以产生细粒度分割(如下所示)。

论文的作者在这一点上做出了精彩的评论:

语义分割面临着语义和位置之间的内在张力:全局信息解决**“是什么”,而局部信息解决“在哪里”**。…将细层和粗层结合起来,可以让模型做出符合整体结构的局部预测。

未完待续…

写在最后的话

欢迎关注公众号【CV面试宝典】,定期原创技术分享。

原文链接

https://www.jeremyjordan.me/semantic-segmentation

参考文献

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

Fully Convolutional Networks for Semantic Segmentation

https://github.com/vdumoulin/conv_arithmetic

猜你喜欢

转载自blog.csdn.net/u010414589/article/details/114298665