分类问题是为整个图像分配一个标签,而语义分割则是将从属于同一类的对象看成一个整体,为图像中的每一个像素点分配一个标签。本文对一些经典语义分割方法和基于深度学习的语义分割方法进行了讨论,此外还讨论了常见的选择和应用损失函数的方法。
选自Medium,作者:Bharath Raj,机器之心编译,参与:Geek AI、张倩。
经典方法
在深度学习时代到来之前,大量的图像处理技术被用来将图像分割成一些感兴趣的区域(ROI)。下面列出了一些常用的方法。
这是最简单的语义分割形式,它包括将一个区硬编码的规则或某个区域必须满足的特定的标签属性赋予这个区域。可以根据像素的属性(如灰度值)来构建这样的规则。「分裂-合并」演算法就是一种用到了灰度分割技术的方法。该演算法递归地将图像划分成若干子区域,直到可以为划分出的子区域分配一个标签,然后通过合并将相邻的带有相同标签的子区域融合起来。
条件随机场
可以通过考虑像素之间的先验关系来避免这些问题,如果目标是连续的,那么相邻的邻像素往往具有相同的标签。使用条件随机场(CRF)对这样的关系进行建模。
所有像素的一元成本和成对成本之和被称为 CRF 的能量(或成本/损失)。通过最小化能量,可以得到一个好的分割输出结果。
深度学习方法
深度学习极大地简化了进行语义分割的工作流程,并且得到了非常好的分割结果。在本节中,我们将讨论用于训练这些深度学习方法的流行的模型架构和损失函数。
尽管这个基础的架构很有效,但是它也有一些缺点。其中一个缺点就是由于转置卷积(或称反卷积)操作的输出不均匀重叠而导致棋盘状伪影的存在。
另一个缺点是,由于编码过程中损失了一部分信息,导致边界的解析度很低。
U-Net 是对简单的 FCN 模型架构的一种升级方案。它具有从卷积块的输出到相应的同一级的转置卷积块的输入之间的跳跃连接。
这种跳跃连接让梯度可以更好地流动,并提供了来自多个尺度的图像大小的信息。来自更大尺度(较上层)的信息可以帮助模型更好地分类。来自更小尺度(较底层)的信息可以帮助模型更好地进行分割。
这种方法的缺点是,由于几个机器学习框架中的连接操作的性质,它的内存效率不是很高(需要大型 GPU 才能运行)。
Atrous 卷积(膨胀卷积)是一种可以在不增加大量参数的情况下,结合多尺度的特征的高效的方法。通过调节膨胀率(dilated rate),同一个卷积核的权值可以在空间中拓展地更远。这使其能够学习更多的全局上下文。
DeepLabv3 网路的论文使用了不同膨胀率的Atrous 卷积捕获来自多个尺度的信息,从而避免了显著的图像尺寸损失。他们通过级联的方式(如上图所示)和以并行的 Atrous 空间金字塔池化的方式(如下图所示)对 Atrous 卷积进行了实验。
CNN-CRF 的混合方法
某些方法将 CRF 包含在了神经网路中,正如「CRF-as-RNN」(https://www.robots.ox.ac.uk/~szheng/papers/CRFasRNN.pdf)一文中所描述的,其中密集 CRF被建模为一个循环神经网路。这种端到端的训练如上图所示。
通过交叉熵实现的像素级 softmax用于语义分割的标签尺寸与原始图像相同。标签可以用one-hot编码的形式表示,如下图所示。
由于标签以方便的one-hot编码的形式存在,它可以直接被用作计算交叉熵的参考标准(目标)。然而,在应用交叉熵之前,必须对预测的输出在像素级上应用 softmax,因为每个像素可能属于我们的任何一种目标类。
让我们用一个直观的例子来探究一下为什么这很重要。假设我们有一个 10000 像素的图像,像素只有两个类:背景类(one-hot编码形式下表示为 0)和目标类(one-hot编码形式下表示为 1)。假设图像的 97% 是背景,3% 是目标。现在,假设我们的模型以 80% 的置信度确定某像素是背景,但只有 30% 的置信度确定某像素是目标类。
Dice 损失是另一种流行的损失函数,用于类极度不平衡的语义分割问题。Dice 损失在《V-Net: Fully Convolutional Neural Networks for Volumetric Medical Image Segmentation 》一文中被提出,它被用于计算预测出的类和真实类之间的重叠。Dice 系数(D)如下所示:
我们的目标是最大化预测类和真实参考标准之间的重叠部分(即最大化 Dice 系数)。因此,我们通常将(1-D)最小化来实现相同的目标(由于大多数机器学习程序库只提供最小化损失函数的操作)。
虽然 Dice 损失对类不平衡的样本很有效,但计算其导数的公式(如上所示)在分母中有平方项。当这些值很小时,我们就可以得到很大的梯度,导致训练不稳定。
应用场景
语义分割技术被用于了各种各样的真实生活场景下的应用。下面是语义分割的一些重要的用例。
自动驾驶汽车的限制之一是:语义分割模型必须是实时运行的。解决上述问题的一个方法是将 GPU 与车辆进行本地集成。为了提高上述解决方案的性能,可以使用更轻量级(参数更少)的神经网路,或实现适用于边缘计算的技术。
我们还可以将一些不那么关键的操作自动化处理,比如根据语义分割后的 3D 扫描影像估计器官的体积。
时尚产业
语义分割在时尚产业中被用来从图像中提取出服装对象,为零售商店提供类似的建议。更先进的演算法可以在图像中「重新设计」特定的衣服。
卫星(或航拍)图像处理
结语
深度学习技术极大地提升并简化了语义分割演算法,为语义分割在现实生活中更广泛的应用铺平了道路。由于研究社区不断努力地提高这些演算法的准确性和实时性能,本文中列举出的概念可能并不详尽。话虽如此,本文介绍了这些演算法的一些流行的变体和他们在现实生活中的一些应用。
原文链接:https://medium.com/beyondminds/a-simple-guide-to-semantic-segmentation-effcf83e7e54?sk=3d1a5a32a19d611fbd81028cfd4f23fd
推荐阅读: