另一篇关于语义分割算法研究进展的综述文章可查看https://blog.csdn.net/weixin_42535423/article/details/122058288
深度学习在将图像作为数据处理时非常成功,目前处于在多个用例上比人类更有效的阶段。人类对用计算机视觉解决的最重要问题是图像分类、对象检测和分割,按难度递增。
在传统的图像分类任务中,我们只对获取图像中存在的所有对象的标签感兴趣。在对象检测中,我们更进一步,并尝试在边界框的帮助下了解图像中存在的所有对象以及对象存在的位置。图像分割通过尝试准确找出图像中对象的确切边界将其提升到一个新的水平。
在本文中,我们将介绍图像分割的概念,讨论相关用例、实现结果所涉及的不同神经网络架构、要探索的指标和数据集。
我们知道图像只不过是像素的集合。图像分割是对图像中属于某个类别的每个像素进行分类的过程,因此可以将其视为每个像素的分类问题。有两种类型的分割技术
语义分割是对属于特定标签的每个像素进行分类的过程。它在同一对象的不同实例之间没有区别。例如,如果图像中有 2 只猫,则语义分割为两只猫的所有像素赋予相同的标签
实例分割与语义分割的不同之处在于它为图像中特定对象的每个实例提供唯一标签。如上图所示,所有 3 只狗都被分配了不同的颜色,即不同的标签。通过语义分割,所有这些都将被分配相同的颜色。
手写识别:- Junjo 等人在他们2019 年的研究论文中展示了如何使用语义分割从手写文档中提取单词和线条以识别手写字符
在许多用例中,将前景与背景分开是绝对必要的。例如,在谷歌的人像模式中,我们可以看到背景模糊,而前景保持不变,以产生很酷的效果
谷歌最近为内容创作者发布了一个 YouTube 故事功能,可以在创作故事时展示不同的背景
衣服的虚拟试穿是一个有趣的功能,可以在商店中使用专门的硬件创建 3d 模型。但是通过深度学习和图像分割,仅使用 2d 图像就可以获得相同的结果
在电子商务的图像检索算法中也使用了分割衣服的想法。例如,Pinterest/Amazon 允许您上传任何图片并通过基于分割布料部分的图像搜索来获取相关相似外观的产品
自动驾驶汽车需要对周围环境有一个完整的了解,达到像素完美的水平。因此图像分割用于识别车道和其他必要信息
在深度学习出现之前,经典的机器学习技术如 SVM、随机森林、K-means 聚类被用来解决图像分割问题。但是与大多数与图像相关的问题陈述一样,深度学习比现有技术更全面地工作,并且现在在处理语义分割时已成为一种规范。让我们回顾一下用于解决问题的技术
CNN 的一般架构由几个卷积层和池化层组成,最后是几个完全连接的层。2014年发表的Fully Convolutional Network论文认为,最终的全连接层可以认为是做了一个覆盖整个区域的1x1卷积。
因此,最终的密集层可以用卷积层代替,达到相同的结果。但现在这样做的好处是输入的大小不再需要固定。当涉及密集层时,输入的大小受到限制,因此当必须提供不同大小的输入时,必须调整其大小。但是通过用卷积替换密集层,这种约束不存在。
此外,**当提供更大尺寸的图像作为输入时,产生的输出将是一个特征图,而不仅仅是像普通输入尺寸的图像那样的类输出。**此外,最终特征图的观察行为表示所需类的热图,即对象的位置在特征图中突出显示。由于特征图的输出是所需对象的热图,因此它是我们分割用例的有效信息。
由于在输出层获得的特征图由于执行了一组卷积而被下采样,因此我们希望使用插值技术对其进行上采样。双线性上采样是有效的,但该论文建议使用带有反卷积的学习上采样,它甚至可以学习非线性上采样。
**网络的下采样部分称为编码器,上采样部分称为解码器。**这是我们将在许多架构中看到的模式,即使用编码器减小尺寸,然后使用解码器上采样。在理想的世界中,我们不希望使用池化来减少样本并始终保持相同的大小,但这会导致大量参数并且在计算上不可行。
尽管获得的输出结果不错,但观察到的输出粗糙且不平滑。**其原因是由于使用卷积层进行了 32 倍的下采样,最终特征层的信息丢失。**现在,网络使用这些少量信息进行 32 倍上采样变得非常困难。这种架构称为 FCN-32
为了解决这个问题,论文提出了另外两种架构 FCN-16、FCN-8。在 FCN-16 中,来自前一个池化层的信息与最终特征图一起使用,因此现在网络的任务是学习 16 倍上采样,这与 FCN-32 相比更好。FCN-8 试图通过包含更多先前池化层的信息来使其变得更好。
U-net 建立在完全卷积网络之上。它是为医疗目的而建造的,目的是在肺部或大脑中发现肿瘤。它还包括将输入图像下采样到特征图的编码器和使用学习到的反卷积层将特征图上采样到输入图像大小的解码器。
**U-Net 架构的主要贡献是跳跃连接。**我们在上面的 FCN 中看到,由于我们将图像下采样作为编码器的一部分,我们丢失了很多在编码器部分无法轻易恢复的信息。FCN 试图通过在最终特征层之前从池化层中获取信息来解决这个问题。
U-Net 提出了一种新方法来解决这个信息丢失问题。它建议将信息从编码器中相应的下采样层发送到解码器中的每个上采样层,如上图所示,从而捕获更精细的信息,同时保持低计算量。由于编码器开头的层将具有更多信息,因此它们将通过提供与输入图像相对应的精细细节来支持解码器的上采样操作,从而大大改善结果。该论文还建议使用我们将在下面讨论的新型损失函数。
来自谷歌的一组研究人员的 Deeplab 提出了多种技术来改进现有结果并以更低的计算成本获得更精细的输出。作为研究的一部分建议的 3 个主要改进是
1) 空洞卷积
2) 空洞空间金字塔池
3) 使用条件随机场提高最终输出
让我们讨论所有这些
FCN 方法的主要问题之一是由于连续池化操作导致的过度缩减。由于一系列池化,输入图像被下采样 32x,再次上采样以获得分割结果。**降采样 32 倍会导致信息丢失,这对于在分割任务中获得精细输出非常关键。**此外,去卷积到上采样 32 倍是一种计算和内存昂贵的操作,因为在形成学习上采样时涉及额外的参数。
该论文提出使用 Atrous 卷积或空洞卷积或扩张卷积,这有助于使用相同数量的参数理解大上下文。
**扩张卷积的工作原理是通过附加零(称为空洞)来填充参数之间的间隙来增加过滤器的大小。**在滤波器参数之间填充的空洞/零的数量称为术语膨胀率。当比率等于 1 时,它只不过是正常的卷积。当 rate 等于 2 时,在每个其他参数之间插入一个零,使过滤器看起来像一个 5x5 卷积。现在它有能力在拥有 3x3 卷积参数的同时获得 5x5 卷积的上下文。同样对于速率 3,感受野变为 7x7。
在 Deeplab 中,最后一个池化层被替换为步幅 1 而不是 2,从而将下采样率保持在仅 8 倍。然后应用一系列多孔卷积来捕获更大的上下文。为了训练,输出标记掩码被下采样 8 倍以比较每个像素。对于推理,双线性上采样用于产生相同大小的输出,以较低的计算/内存成本提供足够好的结果,因为双线性上采样不需要任何参数,而不是反卷积进行上采样。
空间金字塔池化是 SPPNet 中引入的一个概念,用于从特征图中捕获多尺度信息。在引入不同分辨率的 SPP 输入图像之前,将计算出的特征图一起使用以获得多尺度信息,但这需要更多的计算和时间。通过空间金字塔池化,可以使用单个输入图像捕获多尺度信息。
使用 SPP 模块,网络产生 3 个尺寸为 1x1(即 GAP)、2x2 和 4x4 的输出。这些值通过转换为一维向量来连接,从而在多个尺度上捕获信息。使用 SPP 的另一个优点是可以提供任何大小的输入图像。
ASPP 将融合不同尺度信息的概念应用于 Atrous 卷积。输入与不同的膨胀率进行卷积,并将这些输出融合在一起。
可以看出,输入与膨胀率为 6、12、18 和 24 的 3x3 滤波器卷积,输出连接在一起,因为它们的大小相同。1x1 卷积输出也被添加到融合输出中。为了同时提供全局信息,在上采样后,还将 GAP 输出添加到上面。3x3 可变扩张输出、1x1 和 GAP 输出的融合输出通过 1x1 卷积得到所需的通道数。
由于需要分割的图像可以是输入中的任何尺寸,ASPP 的多尺度信息有助于改善结果。
**池化是一种有助于减少神经网络中参数数量的操作,但它也带来了不变性。**不变性是神经网络的质量不受输入中轻微平移的影响。由于通过池化获得的这一特性,神经网络获得的分割输出是粗糙的,并且边界没有具体定义。
为了解决这个问题,本文建议使用图形模型 CRF。**条件随机场操作一个后处理步骤,并尝试改进产生的结果以定义整形器边界。**它的工作原理是不仅根据其标签而且还根据其他像素标签对像素进行分类。从上图可以看出,神经网络产生的粗边界经过CRF后变得更加细化。
Deeplab-v3 在 Resnet 块的每一层内引入了批量归一化和建议的膨胀率乘以 (1,2,4)。此外,本文还提出了向 ASPP 模块添加图像级特征,这在上面关于 ASPP 的讨论中讨论过
**Deeplab-v3+ 建议使用解码器而不是简单的双线性上采样 16x。**解码器从 U-Net 等架构使用的解码器中获取提示,这些架构从编码器层获取信息以改进结果。编码器输出使用双线性上采样进行 4 倍上采样,并与来自编码器的特征连接,在执行 3x3 卷积后再次上采样 4 倍。这种方法比直接 16 倍上采样产生更好的结果。还提议使用修改后的 Xception 架构代替 Resnet 作为编码器的一部分,并且现在在 Atrous 卷积之上使用深度可分离卷积以减少计算数量。
语义分割涉及同时执行两个任务
i) 分类
ii) 定位
**分类网络被创建为对平移和旋转保持不变,因此不重视位置信息,而定位涉及获取位置的准确细节。**因此,这两个任务本质上是矛盾的。大多数分割算法更重视定位,即上图中的第二个,因此忽略了全局上下文。在这项工作中,作者提出了一种在不丢失定位信息的同时也重视分类任务的方法
作者建议通过**使用大内核作为网络的一部分来实现这一点,从而实现密集连接,从而获得更多信息。**这是在 GCN 块的帮助下实现的,如上图所示。GCN 块可以被认为是 akxk 卷积滤波器,其中 k 可以是大于 3 的数字。为了减少参数的数量,akxk 滤波器进一步分为 1 xk 和 kx 1、kx1 和 1xk 块,然后将它们相加。因此,通过增加 k 值,可以捕获更大的上下文。
此外,作者提出了一个边界细化块,它类似于在 Resnet 中看到的残差块,由一个shortcut connection 和一个残差连接组成,它们相加得到结果。据观察,具有边界细化块会改善分割边界处的结果。
结果表明,GCN 块提高了靠近对象中心的像素的分类精度,表明由于捕获远程上下文而导致的改进,而边界细化块有助于提高靠近边界的像素的精度。
Deeplab 系列使用 ASPP 让多个感受野使用不同的多孔卷积率捕获信息。尽管ASPP 在改进结果分割方面非常有用,但由于架构导致了一些固有的问题。**ASPP 中的不同并行层之间没有共享信息,因此影响了每一层内核的泛化能力。**此外,由于每一层迎合不同的训练样本集(较小的物体对较小的穿孔率,较大的物体对较大的穿孔率),每个平行层的数据量会较少,从而影响整体的泛化性。此外,网络中的参数数量随参数数量线性增加,因此可能导致过拟合。
为了处理所有这些问题,作者提出了一种称为 Kernel-Sharing Atrous Convolution (KSAC) 的新型网络结构。从上图中可以看出,**ASPP 不是每个并行层都有不同的内核,而是共享单个内核,**从而提高了网络的泛化能力。当使用 6,12 和 18 的扩张率时,通过使用 KSAC 代替 ASPP,可以节省 62% 的参数。
使用 KSAC 结构的另一个优点是参数的数量与使用的膨胀率的数量无关。因此,我们可以在不增加模型大小的情况下添加尽可能多的速率。ASPP 以 6、12、18 的比率给出最佳结果,但准确度随 6、12、18、24 下降,表明可能过度拟合。但 KSAC 准确度仍然显着提高,表明增强的泛化能力。
这种内核共享技术也可以看作是特征空间的增强,因为在多个速率上应用了相同的内核。类似于输入增强如何提供更好的结果,在网络中执行的特征增强应该有助于提高网络的表示能力。
对于自动驾驶汽车、机器人等用例,需要对观察到的视频进行实时分割。到目前为止讨论的架构几乎都是为准确性而不是速度而设计的。因此,如果将它们以每帧为基础应用于视频,则结果将以非常低的速度出现。
此外,通常在视频中,连续帧的场景中有很多重叠,可用于提高结果和速度,如果在每帧基础上进行分析,则不会出现这种情况。使用这些提示让我们讨论专为视频设计的架构
时空 FCN 建议使用 FCN 和 LSTM 来进行视频分割。我们已经知道如何使用 FCN 提取特征来分割图像。LSTM 是一种神经网络,可以随时间捕获序列信息。STFCN 结合 FCN 和 LSTM 的强大功能来捕获空间信息和时间信息
从上图可以看出,STFCN由FCN、时空模块和反卷积组成。FCN 生成的特征图被发送到时空模块,该模块也有来自前一帧模块的输入。除了空间信息之外,基于这两个输入的模块还捕获时间信息,并将其发送出去,使用类似于 FCN 中的解卷积方法将其上采样到图像的原始大小
由于 FCN 和 LSTM 作为 STFCN 的一部分一起工作,因此网络是端到端可训练的,并且优于单帧分割方法。有类似的方法,其中 LSTM 被 GRU 取代,但捕获空间和时间信息的概念是相同的
本文提出使用跨相邻帧的光流作为额外输入来改善分割结果
建议的方法可以作为插件连接到任何标准架构中。发挥作用的关键要素是 NetWarp 模块。为了计算分割图,计算当前帧和前一帧之间的光流,即 Ft 并通过 FlowCNN 以获得 Λ(Ft) 。这个过程称为流转换。该值通过一个 warp 模块,该模块也将通过网络计算出的中间层的特征图作为输入。这给出了一个扭曲的特征图,然后与当前层的中间特征图相结合,整个网络被端到端地训练。该架构在 CamVid 和 Cityscapes 视频基准数据集上取得了 SOTA 结果。
本文提出通过利用视频中的语义信息与像素级信息相比变化缓慢的事实来提高神经网络对视频分割任务的执行速度。因此,与开始层相比,最终层中的信息变化速度要慢得多。该论文建议不同的时间
上图代表了中层pool4和深层fc7的变化率对比。在左侧,我们看到由于跨帧有很多变化,两个层都显示了变化,但 pool4 的变化更高。在右侧,我们看到各帧之间没有太大变化。因此,pool4 显示出边际变化,而 fc7 显示几乎为零变化。
该研究利用了这个概念,并建议在帧之间没有太大变化的情况下,不需要再次计算特征/输出,并且可以使用前一帧的缓存值。由于变化率因层而异,因此可以为不同的层组设置不同的时钟。当时钟滴答时计算新的输出,否则使用缓存的结果。时钟滴答的速率可以是静态固定的,也可以是动态学习的
本文通过自适应地选择帧来计算分割图或使用缓存结果而不是使用固定计时器或启发式方法,在上述讨论的基础上进行了改进。
论文提出将网络分为两部分,低层特征和高层特征。与高级特征相比,计算网络中低级特征的成本要低得多。研究建议使用低级网络特征作为分割图变化的指标。在他们的观察中,他们发现低级特征变化和分割图变化之间有很强的相关性。因此,要了解是否需要计算是否需要计算更高的特征,可以找到跨 2 帧的较低特征差异,并在它超过特定阈值时进行比较。整个过程由一个小型神经网络自动化,其任务是获取两帧的较低特征并预测是否应计算较高特征。
来自传感器(如激光雷达)的数据以称为点云的格式存储。点云只不过是一组无序的 3d 数据点(或任何维度)的集合。它是 3d 场景的稀疏表示,CNN 不能直接应用于这种情况。此外,任何设计用于处理点云的架构都应该考虑到它是一个无序的集合,因此可以有很多可能的排列。所以网络应该是置换不变的。点云中定义的点也可以通过它们之间的距离来描述。因此,较近的点通常携带对分割任务有用的有用信息
PointNet 是点云研究史上使用深度学习解决分类和分割任务的重要论文。我们来研究一下Pointnet的架构
n 个点的网络输入是一个 nx 3 矩阵。nx 3 矩阵使用共享的多感知器层(全连接网络)映射到 nx 64,然后映射到 nx 64,然后映射到 nx 128 和 nx 1024。应用最大池化以获得 1024 向量,该向量被转换为 k通过大小为 512、256 和 k 的 MLP 输出。最后 k 类输出的产生类似于任何分类网络。
分类只处理全局特征,但分割也需要局部特征。因此,来自 nx 64 中间层的局部特征与全局特征连接以获得 anx 1088 矩阵,该矩阵通过 512 和 256 的 mlp 发送到 nx 256,然后通过 128 和 m 的 MLP 为每个点提供 m 个输出类在点云中。
此外,该网络还涉及作为网络一部分的输入变换和特征变换,其任务是不改变输入的形状,而是为仿射变换(即平移、旋转等)添加不变性。
A-CNN 提出使用环形卷积来捕获空间信息。我们从 CNN 中知道,卷积操作可以捕获局部信息,这对于理解图像至关重要。A-CNN 设计了一种称为环形卷积的新卷积,该卷积应用于点云中的邻域点。
该架构将 nx 3 个点作为输入,并为它们找到法线,用于对点进行排序。使用 FPS 算法获取点的子样本,得到 ni x 3 个点。在这些环形卷积上应用增加到 128 个维度。对使用 KNN 算法确定的邻域点执行环形卷积。
执行上述另一组操作,将维度增加到 256。然后应用 mlp 将维度更改为 1024,并应用池化以获得类似于点云的 1024 全局向量。这整个部分被认为是编码器。对于分类,编码器全局输出通过 mlp 传递以获得 c 类输出。对于分割任务,全局和局部特征都被认为与 PointCNN 相似,然后通过 MLP 获得每个点的 m 类输出。
让我们讨论通常用于理解和评估模型结果的指标。
像素精度是最基本的指标,可用于验证结果。准确率是通过正确分类像素与总像素的比值获得的
准确度 = (TP+TN)/(TP+TN+FP+FN)
使用这种技术的主要缺点是,如果一个类压倒另一个类,结果可能看起来不错。例如,背景类覆盖了输入图像的 90%,我们可以通过将每个像素分类为背景来获得 90% 的准确度
IOU 被定义为真实情况和预测分割输出的交集与其联合的比率。如果我们对多个类进行计算,则计算每个类的 IOU 并取其均值。与像素精度相比,这是一个更好的度量,就像每个像素都作为 2 类输入中的背景给出,IOU 值为 (90/100+0/100)/2,即 45% IOU,与 90 相比,它提供了更好的表示% 准确性。
这是我们讨论过的平均 IOU 的扩展,用于对抗类不平衡。如果一个类别在数据集中的大部分图像中占主导地位,例如背景,则与其他类别相比,它需要权衡。因此,不是取所有类结果的平均值,而是基于数据集中类区域的频率取加权平均值。
分类中常用的度量 F1 分数也可用于分割任务以及处理类不平衡。
不同类别的所选阈值 IOU 平均值的 Precision - Recall 曲线下的面积用于验证结果。
损失函数用于引导神经网络进行优化。让我们讨论一些用于语义分割任务的流行损失函数。
图像中每个像素的交叉熵分类损失的简单平均可用作整体函数。但这再次受到 FCN 建议使用类权重纠正的类不平衡的影响
与内部像素相比,UNet 试图通过为作为边界一部分的边界附近的像素提供更多的权重来改善这一点,因为这使网络更专注于识别边界而不是提供粗略的输出。
焦点损失旨在通过提供更多的权重年龄使网络专注于困难的例子,并处理在单级目标检测器中观察到的极端类不平衡。同样可以应用于语义分割任务
骰子功能不过是F1分数。这个损失函数直接尝试优化 F1 分数。同样,直接 IOU 分数也可用于运行优化
它是 Dice loss 的一种变体,它为 FN 和 FP 提供了不同的权重年龄
它是一种用于测量真实边界和预测边界之间相似性的技术。它是通过找出从一个边界中的任何点到另一个边界中最近点的最大距离来计算的。直接减少边界损失函数是最近的趋势,并且已被证明可以提供更好的结果,尤其是在医学图像分割等用例中,识别准确的边界起着关键作用。
与基于区域的损失(如 IOU 或 Dice Loss)相比,使用边界损失的优势在于它不受类别不平衡的影响,因为不考虑优化整个区域,只考虑边界。
这里考虑的两个术语是针对两个边界的,即真实情况和输出预测。
用python编写的图像注释工具。
支持多边形注释。
开源且免费。
在 Windows、Mac、Ubuntu 或通过 Anaconda、Docker
链接上运行:- https://github.com/wkentaro/labelme
由英特尔
免费开发的视频和图像注释工具,可在线
运行,可在 Windows、Mac 和 Ubuntu 上运行
链接:- https://github.com/opencv/cvat
免费开源图片标注工具
简单的html页面<200kb,可以离线运行
支持多边形标注和点。
链接:- https://github.com/ox-vgg/via
Mac 付费注释工具
可以使用核心 ML 模型对图像进行预注释
支持多边形、三次贝塞尔曲线、线和点
链接:- https://github.com/ryouchinsa/Rectlabel-support
付费标注工具
支持钢笔工具,更快更准确的标注
链接:- https://labelbox.com/product/image-segmentation
作为本节的一部分,让我们讨论公众可用的各种流行和多样化的数据集,人们可以使用它们开始训练。
该数据集是 Pascal VOC 2010 数据集的扩展,超越了原始数据集,为整个场景提供了注释,拥有 400 多类真实世界数据。
链接:- https://cs.stanford.edu/~roozbeh/pascal-context/
COCO stuff 数据集包含原始 COCO 数据集的 164k 图像,带有像素级注释,是一个常见的基准数据集。它涵盖 172 个类:80 个事物类、91 个事物类和 1 个“未标记”类
链接:- http://cocodataset.org/
该数据集由道路、车道、车辆和道路上物体的分割地面实况组成。该数据集包含在不同环境和天气条件下收集的 30 个类别和 50 个城市。还有一个包含精细注释图像的视频数据集,可用于视频分割。KITTI和CamVid是类似的数据集,可用于训练自动驾驶汽车。
链接:- https://www.cityscapes-dataset.com/
该数据集是作为从肝脏 CT 扫描中识别肿瘤病变的挑战的一部分而创建的。该数据集包含 130 个训练数据的 CT 扫描和 70 个测试数据的 CT 扫描。
链接:- https://competitions.codalab.org/competitions/17094
Cloth Co-Parsing 是一个数据集,它是作为研究论文 Clothing Co-Parsing by Joint Image Segmentation and Labeling 的一部分创建的。该数据集包含 1000 多张带有像素级注释的图像,总共有 59 个标签。
来源:- https://github.com/bearpaw/clothing-co-parsing
基于谷歌图像为皮肤分割任务创建的数据集,包含 32 张人脸照片和 46 张家庭照片
链接:- http://cs-chan.com/downloads_skin_dataset.html
从公共领域图像创建的航空分割地图数据集。覆盖面积810平方公里,分建筑和非建筑2级。
链接:- https://project.inria.fr/aerialimagelabeling/
该数据集包含 3 座建筑物中 6 个大型室内部分的点云,超过 70000 张图像。
链接:- http://buildingparser.stanford.edu/dataset.html
我们已经讨论了不同算法的分类法,这些算法可用于解决语义分割的用例,无论是图像、视频还是点云,以及它们的贡献和局限性。我们还研究了评估结果的方法和开始使用的数据集。这应该对作为一般主题的语义分割提供全面的理解。
要获取语义分割的更多资源列表,请从https://github.com/mrgloom/awesome-semantic-segmentation开始。