当前位置: 代码迷 >> 综合 >> 深度篇——实例分割(一) ?mask rcnn 论文 翻译 和 总结
  详细解决方案

深度篇——实例分割(一) ?mask rcnn 论文 翻译 和 总结

热度:12   发布时间:2023-12-15 08:10:44.0

返回主目录

返回 实例分割 目录

下一章: 深度篇——实例分割(二) 细说 mask rcnn 实例分割代码 训练自己数据

 

目录内容

深度篇——实例分割(一)  mask rcnn 论文 翻译 和 总结

深度篇——实例分割(二) 细说 mask rcnn 实例分割代码 训练自己数据

深度篇——实例分割(三)  细说 mask rcnn 实例分割代码 训练自己数据 之 相关网络,数据处理,工具等

 

论文地址:《Mask R-CNN》

代码地址:Mask R-CNN code

 

本小节,mask rcnn 论文 翻译 和 总结, 下一小节 细说 mask rcnn 实例分割代码 训练自己数据

 

一. mask rcnn 论文

 

在翻译 mask r-cnn 之前,想先对 2016 年 COCO 数据集实例分割挑战赛的冠军默哀 3 秒钟。因为,ta 在这里,通篇都被何凯明 用来比较,超越着。就好像一个人刚刚拿到某项冠军奖牌,下来之后,就老被人说,我比你厉害,我超越你,我用实验数据证明,我确实超越你,而且不服还不行。这冠军,当得可真不容易呀。当然,下面开始言归正传,开始干活。

 

摘要

我们提出了一个概念简单、灵活、通用的对象实例分割框架。我们的方案可以高效地检测出图像中的目标,并对每个样例生成一个高质量的 分割 mask 。我们把这个方案称为 Mask R-CNN,它是由 Faster R-CNN 通过添加一条用来预测目标 mask 边界识别的并行分支拓展而来的。Mask R-CNN 很容易训练的,它相对于 Faster R-CNN(每秒 5 张图像) 只是增加了一点很小的开销。此外,Mask R-CNN 对于生成其他任务也是很容易的,它允许我们在相同的框架下估计人类的姿势。我们展示了 Mask R-CNN 在 COCO 数据集上获得的顶级结果,它非常适合于这些竞赛:包括实例分割、bounding boxes 目标检测 和 人的关键点检测。Mask R-CNN 在每个任务上都优于现有的所有单模参赛作品,甚至包括 2016 COCO 数据挑战赛的冠军。我们希望这个的简单而高效的方法可以作为一个坚实的基线,并在未来有助于简化实例级识别的研究。

 

1. 介绍

视觉社区在短时间内迅速对目标检测和语义分割结果做了改进。在很大程度上,这些改进得益于强大的基线系统的推动,比如 Fast/Faster R-CNN 和 FCN 等目标检测和语义分割框架。顾名思义,这些方法非常灵活和健壮,并且推理时间和训练都很快。在这里,我们的目标是研发一种对于实力分割比较有力的框架。

实例分割是一个挑战,因为它要求正确的检测出一张图像中所有的目标,同时并对每个实例进行精确的分割。因此,实例分割结合了目标检测(古典计算机视觉任务) 和 语义分割 两部分元素;目标检测旨在对每个目标进行分类和用 bounding box 框起来(简称分类打框),而语义分割旨在在不区分目标实例的情况下,将每个像素分类为一组固定的类别(如人类、狗类 等)。考虑到这点,有些人可能会认为这需要一个复杂的方法才能获得一个较好结果。然而令人惊讶的是,我们展示的是一个简单、灵活和快速 的方法,它超越了以往实例分割最好的成绩。

我们把这个方法称为 Mask R-CNN,它是由 Faster R-CNN 新增一条在 ROI 上用来预测分割 masks 的分类和 bounding box 边界识别的 并行分支 拓展而来的。如下图所示:

这个 mask分支是对每个 ROI 应用一个小的 FCN 网络,以像素的方式来预测一个分割 mask。通过 Faster R-CNN 提供的框架(Faster R-CNN 促进了广泛、灵活的框架设计),Mask R-CNN 是非常容易实现和训练的。此外,这个 mask 分支仅增加了一点很小的计算开销,并启用一个快速的系统和快速的实验。

在原则上,Mask R-CNN 是 Faster R-CNN 直观上的一个拓展,然而正确构建这个 mask 分支对于获取好的成绩是至关重要的。最重要的是,Faster R-CNN 没有对网络的输入和输出之间设计有关于像素级的对齐。最明显的就是 ROIPool,它对实例进行核心操作,实际上只是对特征进行粗略的空间量化提取。为了修正这些偏差,我们提出一个简单的无量化层,称之为 ROIAlign,它完整地保留了精确的空间位置。对于 ROIAlign,我在前面 深度篇—— CNN 卷积神经网络(三) 关于 ROI pooling 和 ROI Align 与 插值 有详细的讲解。尽管这看起来只是一点很小的变化,然而 ROIAlign 却有着巨大的影响:它对 mask 的精度提升在 10% - 50% 之间,在更严格的区域量化可以获得更大的收益。其次,还有非常重要的一点是它对 mask 和 类别预测进行了解耦:我们对每个类独立地预测它的二分类 mask(区分前景和背景),这样每个 mask 就没有类之间的竞争(这里指 c 分类),对于类别分类则是依靠网络的 ROI 分类分支预测分类。相对的,FCNs 通常对每个像素进行多层次分类操作,包括分割和分类,通过实验,我们发现其实例分割效果非常差。

无需什么花俏的东西(指网络结构),Mask R-CNN 就轻松超越了那些在 COCO 数据集上 实例分割任务现有的最好成绩(意思就是,Mask R-CNN 目前(2017年)在实例分割方面是 number one),包括 2016 年COCO 数据大赛冠军所精心设计的参赛作品。作为其中一个副产品,在 COCO 数据集闪 Mask R-CNN 同样擅长做目标检测任务。通过评估多个基于实例化的实验对照,这使我们能够演示它的健壮性并分析其核心因素的影响。

我们的模型在一块 GPU 上 每秒钟可以跑 5 张图像,在一台 8 块 GPU 的机器上训练 COCO 数据集,大概需要 1-2 天的时间。我们相信,快速的训练和测试速度以及框架的灵活性与精准性,都有利于将来对实例分割的研究。

最后,我们通过对 COCO 关键数据上 人体姿态估计任务,展示了该框架的通用性。通过对每个关键点 one-hot 二分类 mask 的查看,对 Mask R-CNN 做很小的修改就可以用来检测实例特定的姿态。Mask R-CNN 超越了 2016 年 COCO 大赛的冠军作品,而且每秒可以处理 5 张图像。因此,Mask R-CNN 被视作一个实例级识别的灵活框架广泛的应用,并且它可以很轻松地扩展到更复杂的任务应用中。

我们已经开源了相关的代码, 已发布未来的研究。

 

2. 相关工作

R-CNN:基于区域的 CNN (R-CNN) bounding boxes 目标检测的方法针对一定数量的候选目标区域的每个 ROI 上进行独立卷积的评估。R-CNN 允许被拓展到使用 ROIPool 来对 ROI feature maps 处理,从而获得更快的速度和更好的精度。Faster R-CNN 的通过学习 区域建议网络 (RPN) 的注意力机制,对这流程进行了改进。Faster R-CNN 对后续的许多改进都是一个 灵活和健壮的,它是目前几个基准框架中最先进的。

 

实例分割:在 R-CNN 的有效推动下,许多实例分割的方法都基于分段建议。早期的方法基本采用自地向上的分段。DeepMask 和以下工作通过 Faster R-CNN 分类并学会提出分割候选框。在这些方法中,如果使用分割之前就进行识别的,那就容易导致速度精度都下降。此时, Dai et al 提出了一个多阶段复杂的级联来对 bounding boxes proposal 进行预测分割提议,然后再进行分类。不同的是,我们的方法是基于 mask 边界 和 类标签 进行预测,这样就会让这方法相对简单和灵活点。

最近, Li et al 将分割提议系统和目标检测系统进行结合,实现“全卷积实例分割”(FCIS)。一种通俗的想法是,对全卷积生成一组位置敏感的输出通道(即最后生成 1 x 1 大小的输出通道) 进行预测。这些通道数同时包含 目标的类别,bounding boxes 位置,和 masks 信息,这样可以让系统快捷些。但是,FCIS 对实例相交 部分显示出系统性的错误,并创建出假边,这就显得它受到实例分割的基本困难的挑战。

另一类实例分割的解决方案是由语义分割的成功所驱动的。这些方法从对每个像素分类结果开始,试图对相同类别的像素分割为不同的实例。与这些方法的优先分割策略不同的是,Mask R-CNN 是基于实例优先策略。我们期望在将来的研究 当中,这两个策略可以深度结合在一起。

 

3. Mask R-CNN

Mask R-CNN 的概念非常简单:相对于 Faster R-CNN 它对每个候选目标有两个输出,一个是类别标签,一个是 bounding boxes 损失。在这基础之上,我们对输出新增第三条目标 mask 分支。Mask R-CNN 是那样自然而直观的思想。但是,这新增的 mask 输出与类别和bounding boxes 的输出是截然不同的,它要求从目标较好的空间层提取而来。下面,我们介绍一下 Mask R-CNN 的关键元素,它包括  像素与像素之间的对齐,这也是 Fast/Faster R-CNN 主要缺失的模块。

 

Faster R-CNN: 我们先短暂的回顾一下 Faster R-CNN 检测器。Faster R-CNN 它包含两个级。第一级被称为 RPN 区域提名网络,用来对目标候选 bounding boxes 进行提议的。第二级在本质上就是一个 Fast R-CNN,它对每个候选 bounding box 使用 ROIPool 提取 feature maps,然后再进行分类和 bounding boxes 回归操作。这些 features 在两个级别共用,使得它的推理时间更快。我们为读者提供 Faster R-CNN 和其他最新的和较全面的框架。

 

Mask R-CNN: Mask R-CNN 同样采用两级过程,并且第一级同为 RPN 区域提名网络。第二级则是对类别和 box 边界损失的预测,Mask R-CNN 还对每个 ROI 输出一个二分类的 mask。与之相反的是,最新的系统则是依赖于 mask 预测值来进行分类。我们的方案来源于 Faster R-CNN 思想,它使用 bounding boxes 分类和对边界进行回归(它被证明在很大程度上简化了原始 R-CNN 的多级管道)。如在 深度篇——目标检测史(二) 细说 R-CNN 目标检测 中讲到,原始的 R-CNN 是先 crop 和 wrap 再进行卷积的,这些卷积就相当于一条条管道。

通常,在训练期间,对于每个样本的 ROI我们会定义一个多级任务损失 如 L = L_{cls} + L_{box} + L_{mask}。其中分类损失为 L_{cls},bounding boxes 损失为 L_{box},它们与 Faster R-CNN 的损失定义是相同的。而 mask 分支则对每个 ROI 有 Km^{2} 维度的输出,它表示对 K 个 m \times m 像素进行 mask 二分类,其中每个 mask 对应 K 个分类。就这样,我们对每个像素使用 Sigmoid 函数,并定义 \large L_{mask} 为平均二分类的交叉熵损失函数。因为与 ROI 相关联的 \large K 类的 ground truth,所以仅在第 \large k 个 mask 定义 \large L_{mask} (而其他的 mask 输出并不会导致这种损失)。

我们定义的 \large L_{mask} 允许网络对每种类别在没有经过分类计算就生成 mask。我们依靠特有的分类分支来预测类别标签,并用来选择输出的 mask。这就对 mask 和分类预测进行了解耦。这就是与应用 FCNs 来语义分割 通常做法不同的地方,FCNs 通常是对每个像素进行使用 \large softmax 函数和计算它们多项式交叉熵损失函数。在 FCNs 的情况下,mask 会经过了类别竞争。而在我们这边,仅是对每个像素使用 \large sigmoid 函数和二分类损失。通过实验表明,我们的这个方案是实例分割获得好结果的关键所在。

 

Mask 的表现: 一个输入目标的空间层 mask 编码。mask 与类别标签和 box 损失不同,类别标签和 box 损失通过全连接层会不可避免的对输出向量造成了压缩,而 mask 则是利用全卷积提供的像素与像素之间的对应关系,可以很轻松自然地就提取到 mask 的空间结构。

具体地说,我们使用一个 FCN 对每个 ROI  预测一个 m \times m 的 mask。这使得 mask 分支中的每一层得以维持显式的 \large m \times m 目标空间分布,而不会将其折叠成缺乏空间维度的向量。不像以前的方法那样借助于全连接层的 mask 预测值,通过实验证明我们的全卷积表现使用更少的参数,并且获得更好的精度。

这种像素与像素对齐的行为要求我们最终显式保存下来的 ROI 特征(此时的 feature maps 已经很小了) 在空间上对应的每个像素都要很好的对齐。这样做的目的是为了接下来发展的 ROIAlign 层,它在 mask 预测上扮演着关键的角色。

 

ROIAlign: ROIPool 的标准操作就是对每个 ROI 提取一个很小的 feature maps。ROIPool 首先将一个浮点数的 ROI 量化为整数的  feature maps,然后再将这个量化为正数的 ROI 对应到自己的空间单元格中,之后进行 ROIPool 的时候,再对每个分割区域进行量化,因为不一定刚好在边界处。通过计算原图目标的 x、y 与 feature maps 之间的缩放程度来进行量化(比方说,缩放尺度为 8、16、32 这些步幅),量化的时候对小数点后的数进行四舍五入处理,这些量化都是在划分单元格的时候进行的。这些量化在 ROI 和 特征提取之间的引入是不一样的。虽然这些量化对分类可能不会造成影响,因为分类对这些微小的移动是很鲁棒性的;但是它对预测像素精度的 mask 是有很大的负面影响的。关于 ROIPool 和 ROIAlign,详细情形请参考 深度篇—— CNN 卷积神经网络(三) 关于 ROI pooling 和 ROI Align 与 插值

      ①. region proposal 的 xywh 通常是小数,但是为了方便操作会把它 整数化。

      ②. 将整数化后的边界区域分割成  \large k \times k 个单元,对每一个单元的边界进行整数化。

基于这点考虑,我们提出了 ROIAlign 层来严厉移除关于 ROIPool 量化的问题,以达到对输入图像提取的特征得以准确对齐。我们的方案只是做了一个简单的改动:对 ROI 边界和单元格不做任何的量化操作。我们使用双线性插值来计算每个 ROI 单元格中的四个规定采样位置的输入特征的精确值,并将其结果使用 max 或 average 来聚合。具体详情可以参考下图。

我们注意到,只要不进修量化,结果对精确的采样位置或采样的点数并不敏感。

ROIAlign 的引入,给 mask 带来了巨大的改进。同时,我们也拿 ROIAlign 与 ROIWarp 提出操作做了比较。与 ROIAlign 不同,ROIWarp 忽略了对齐的问题,而是对 ROI 实现量化操作,就好像 ROIPool 一样。因此,虽然 ROIWarp 也采用了双线性重采样的方法,但实验表明,其性能与RoIPool相当,这就表明 对齐 在 mask 中扮演着关键的角色。其实,这很好理解的,就是,实例分割对边缘检测比较敏感,而对齐操作,可以大大提升边缘准确度;而不对齐,就相当于粗糙的边缘问题。

 

网络架构: 为了展示我们方案的通用性,我们使用多个框架实现 Mask R-CNN。为了清晰可见,我们用 对整张图像输入后使用一个卷积背骨结构来提取特征 和 分别对每个 ROI 的网络头部 bounding boxes 识别(包括 分类和回归) 以及 mask 预测 来做区分。

我们使用 network-depth-features 的命名来表示背骨结构。并使用 50 - 101 层 ResNet 与 ResNeXt 网络来进行评估。使用 ResNet 网络来实现的原始 Faster R-CNN 是从第 4 阶段的最后一层卷积层(我们称之为 C4)中提取特征。例如,这里的背骨网络为 ResNet-50,则使用 ResNet-50-C4 来表示。大家通常都是这样来做的。

我们现在同样去探索更多高效的背骨方案。在 Mask R-CNN 的 mask 分支中,我们使用一个 特征金字塔网络(FPN),这个 FPN 是从 单尺度输入,利用具有横向连接的自顶向下的结构来构建特征金字塔网络。在 Faster R-CNN 与 FPN 背骨 是根据它们的尺度,从不同层级的特征金字塔提取 ROI 特征。但除此之外,该方法的其余部分与香草的 ResNet 类似。Mast R-CNN 使用 ResNet-FPN 背骨来提取特征,可以在精度和效率两方面获得较好的提升。

关于网络的头部,我们严格遵循前面工作中提到的架构,并在其中添加一个全卷积的 mask 预测分支。具体来说,我们是从 ResNet 和 FPN 论文中获得思路来对 Faster R-CNN 的 box 头部 进行了拓展。具体如下所示。

ResNet-C4 背骨的头部包含 ResNet 的第五阶段,它的计算会比较密集。而对于 FPN 背骨,它也包含了 ResNet 的第五阶段,并且允许其头部使用更少的 filters 来达到更高效。

我们注意到,在我们的这条 mask 分支中,它是一个比较简单的结构。虽然那些更复杂的设计可能有助于提升网络的性能,但并不是这里的重点。

 

实现的细节

在 Mask R-CNN 中对超参的设置,遵循 Fast/Faster R-CNN 网络中的设置。尽管这些超参在原文中最开始是为了决定目标检测而设置的,但是我们发现,我们的 实例分割 系统的鲁棒性是非常给力的。所以,按照 Fast/Faster R-CNN 的设置也是非常 OK 的。

 

训练:就好像在 Faster R-CNN 中一样,如果 ROI 与 ground truth 的 IOU 不小于 0.5,则认为这个 ROI 为正例,否则为负例。而 mask 的损失 L_{mask} 仅由 ROI 中的正例来决定。mask 的目标是 ROI 和其对应的 ground truth mask 的 交集

我们采用以图像为中心的训练方式。将图像按其比例 (短边)  resize 成为 800 像素 大小的尺度。每个 GPU  的每个 mini-batch size 为 2 张图像,并且每张图像有 N 个 ROIs 采样,其中正负样本的比例为 1: 3。对于 C4 背骨 来说,N 为  64;而对于 FPN 网络来说,则 N 为 512。我们使用 8 块 GPU 来训练(因此,对应效率的 mini-batch size 为 8),迭代 160k 次,起始学习率为 0.02,当训练到 120k 个 epoch 时,学习率下降为 0.002。我们使用 0.9 的 momentum 优化器,其衰变量权重为 0.0001。对于 ResNeXt,每个 GPU 我们训练 1 张 图像,使用同样的迭代次数,而初始学习率为 0.01。

在 RPN 网络中,它在一个位置有 5 个不同尺度的 anchors 点 ,每个 anchor 点又有 3 个不同纵横比的 anchor box (如 1:1, 1:2 和 2:1 等) (Faster R-CNN 一个位置有 9 个 anchors,每个 anchor 由有 3 个不同纵横比的 anchor box)。为了方便比对,对 RPN 网络进行单独训练,除非指定,否则不参与 Mask R-CNN 网络的 共享特征。而对于论文中的每一项,RPN 网络 和 Mask R-CNN 具有相同的 背骨,所以,它们是可以共享特征的。

 

推理时间:在测试时,对 C4 背骨网络 提议数量为 300,而对 FPN 网络的 提议 数量为 1000。我们在这些提议上运行 box 预测分支,然后使用非极大值抑制。然后,mask 分支使用得分最高的 100 个检测 boxes 来进行检测。尽管这与训练中使用并行计算不同,但是它对效率和精度都有所提升(由于使用了更少,更精准的 ROIs)。对于每个 ROI,mask 分支可以预测 K 个 masks,但是我们只使用第 k 个 mask。这里的 k 为分类分支预测的类别。然后对 \large m \times m 浮点型的 mask 输出 resize 为 ROI 的尺度,并以 0.5 为阈值进行二值化处理。

注意,由于我们这里仅对前 100 个检测 boxes 的 masks 进行计算,Mask R-CNN 比与它对应的 Faster R-CNN 只是增加了一点点开销而已。

 

4. 实验: 实例分割

我们对 Mask R-CNN 和其他模型在 COCO 数据上进行一个全面的比较,发现,当前还是 Mask R-CNN 效果最好。我们对 COCO 的标准指标进行报告,其中包括 \large AP (超过 IOU 阈值的平均值),\large AP_{50}\large AP_{75},和 \large AP_{S}AP_{M}AP_{L} (不同尺度的 \large AP)。除非特别标注,否则都是使用 mask IOU 进行 \large AP 评估。在之前的工作中,我们使用 80k 张图像进行训练,使用 35k 张图像进行验证,再用剩下的 5k 张验证图像与其他模型做比较得到报告结果。同时,也对测试结果进行来比较报告。

 

主要结果

我们使用 Mask R-CNN 与当前最好的实例分割模型作比较,具体如下图所示:

通过上面的比较证明得到:我们的模型的所有实例化都比以前最好的模型(包括它们对应的变体) 都要好。这里分别包括在 2015 年和 2016 年 COCO 数据集上的分割挑战赛上的冠军模型 MNC 和 FCIS。无需添加太多花俏的东西,以 ResNet-101-FPN 为背骨的 Mask R-CNN 就优于 FCIS++ 模型了,在 FCIS++ 中常常包含多尺度训练/测试,水平翻转测试和在线对边缘僵硬的样本进行采集(OHEM)。虽然这些超出了这项工作的范围,但是我们期待通过许多这样的修改可以让模型更好,更适用。

Mask R-CNN 的可视化输出如下所示:

即便是在比较不好的条件下,Mask R-CNN 都可以获得较好的成绩。Mask R-CNN 的基线模型 与 FCIS++ 模型的比较如下:

通过上面的 FCIS++ 实例分割上的重叠位置的展示,它会把整体中的某一个部分另外区分出去,表明了它在实例分割中存在基本性的困难挑战。而在 Mask R-CNN 的展示中,则没有这一烦恼。

 

比对试验

我们通过一系列的比对来分析 Mask R-CNN。比对的结果如下所示:

下面详细讨论

模型架构:各种背骨的 Mask R-CNN 如上图中的 (a) 所示。Mask R-CNN 对于更深的网络 (50 和 101 层) 和 包括 FPN 与 ResNeXt 这些内在的先进设计 可以获得较好的结果。此处申诉一下,并不是所有的框架都可以从更深的网络或更高级的网络设计中获益的,不同的网络还是各自存在各自的局限性的。

多项 mask 和 独立 mask 的比较:Mask R-CNN 对于 mask 和类别的 预测 是解耦的:因为已有的 box 分支已经进行了类别标签的预测,我们新增的 mask 分支对于类别分类并不需要对所有的类别进行分类计算(对每个像素只需做一个二分类,计算其损失,来区分 mask 前景和背景)。上图 (b) 为 对每个像素进行二分类计算及其 loss 与 对每个像素进行多分类计算及其多项式损失的比较(通常使用 FCN 来操作)。对每个像素使用多分类计算 mask 的这种方法会将 mask 和 类别 预测任务 耦合起来,会导致 mask 的 \large AP 损失严重。这就表明,一旦实例通过 box 分支 被分类为一个整体,就可以通过预测一个不考虑类别的 二分类 mask 来完成实例分割,并且这样可以使得模型更容易训练。

特定类 mask 与类无关 mask 的比较:我们默认的实例预测为特定类的 mask,对于每个类都有与之对应的 \large m \times m 大小的 mask。有趣的是,在 Mask R-CNN 中其使用的是 类无关的 mask (对一个 \large m \times m 大小的类无关输出进行预测) 也是同样有效的:在对应的 ResN-50-C4 上,类无关的 mask 可以达到 29.7 AP,而 特定类获取到的 mask AP 为 30.3。Mask R-CNN 中使用类无关 mask 这一步,对分类和分割的解耦,做出了巨大的改变。

ROIAlign:我们的方法对 ROIAlign 层的验证如上图 (c) 所示。在这里,我们使用 ResNet-50-C4 为背骨,并且步幅为 16 来进行实验。实验表明,在 ROIPool 中,\large AP_{75} 大部分的提高基本来自于较高的 IOU,而 ROIAlign 比 ROIPool 的 \large AP 提高了 3 个点。在 ROIAlign 中,它对 max_pool 和 average_pool 并不怎么敏感,在论文的其他地方,我们都是使用均值化来进行操作的。

此外,我们在 MNC 中对 ROIWarp(使用双线性插值) 方法进行比较(与 ROIAlign 比较),就像上图 (c) 中讨论的那样,ROIWarp 对于 ROI 仍然是存在量化操作的,使得相对于输入来说,其对齐仍然是有损失的。通过上图 (c) 可以看出, ROIWarp 与 ROIPool 相对,但是还是要比 ROIAlign 差上不少的,这就表明了准确对齐是非常关键的。

我们使用 ResNet-50-C5 背骨 和 步幅为较大的 32 像素 对 ROIAlign 进行验证。 由于 res5 头部并不适用,所以我们使用如下图所示的同样头部:

如 上面 图 (d) 所示,ROIAlign 对 mask 有着巨大的提升能力,对 \large AP 提升了 7.3 个点,对 \large AP_{75} 提升了  10.5 个点(接近 50% 的提升量)。此外,通过上图 (c) 和 (d),我们注意到,在 ROIAlign 中,使用 步幅 为 32 的 C5 的特征(30.9 AP) 会比使用 步幅为 16 的 C4 特征(30.3 AP) 会更准确。在这里,ROIAlign 在很大程度上解决了长期存在的使用大跨度特征进行预测和分割问题。

最后,当 ROIAlign 与 FPN (FPN 具有更好的多级步幅) 共同使用时,实验显示,其可以获得  1.5 mask AP 和 0.5 box AP 的 提升。对于需求更精准对齐的关键点检测,ROIAlign 即是使用 FPN 也能获得较大的提升,如下图所示:

Mask 分支:分割是一个像素与像素之间的任务,我们使用一个 FCN 来开发 mask 的空间布局。如上图 Table 2 中的 (e) 图,在使用 ResNet-50-FPN 为背骨的基础上,对 多层感知机(MLP) 与 FCNs 进行比较。使用 FCNs 的 mask 比 MLPs 的 AP 要好上 2.1 个点。注意到,我们选用这个背骨,是因为 FCN 的头部的卷积层没有预训练,以便可以和 MLP 进行公平的比较。

 

Bounding box 检测结果

我们将 Mask R-CNN 与 那些在 COCO 数据集上最好的 bounding-box 目标检测 来进行比较,如下图所示:

对于这个结果,尽管完整的 Mask R-CNN 模型是经过训练的,但也仅是在分类和 box 输出时使用推理(mask 的输出被忽略)。使用 ResNet-101-FPN 背骨的 Mask R-CNN 比以前所有的模型的效果都要好,包括在 2016 年 COCO 数据集检测挑战赛的冠军所使用的 GRMI 的单模型变体。当 Mask R-CNN 使用 ResNeXt-101-FPN 为背骨时,它能获得更好的结果,与之前系列最好的单模型(使用 Inception-ResNet-v2-TDM) 相比其 box \large AP 仍有 3.0 个点的优势。

为了进一步比较,我们训练一个没有 mask 分支的 Mask R-CNN 变体,用 Faster R-CNN, ROIAlign 来表示。这个模型比那些没有 ROIAlign 的模型要好些。另一方面,它只是在 box \large AP 方面比 Mask R-CNN 低 0.9 个点而已。Mask R-CNN 在 box  检测上的差距,其原因仅在于多任务训练的优势。

最后,我们注意到在 Mask R-CNN 中,其 mask 与 box 的 \large AP 之间存在一些细小的差距,mask 获得 37.1 \large AP (Table 1 图),而 box 获得 39.8 \large AP (Table 3 图)。这就表明,我们的方法在很多程度上弥补了对象检测和更具挑战性的实例分割任务之间的差距。

 

实时

推理:我们训练一个 在 RPN 和 Mask R-CNN 阶段共享特征的 ResNet-101-FPN 模型,训练方法按照 Faster R-CNN 的 4 步骤来操作。这个模型在 英伟达 Tesla M40 GPU 上跑,每张图像耗时 195ms(加上 CPU 对输出图像 resize 到原始图像大小的耗时 15ms),通过统计知道,其获得与那些不共享 mask \large AP 一样相同的 mask \large AP 成绩。我们还报道了使用 ResNet-101-C4 变体,由于它的头部 box 比较重量级,所以其耗时为 ~400ms。所以,在实际操作中,我们并不推荐使用 C4 变体模型。

尽管 Mask R-CNN 的不慢,但是我们注意到,我们的设计并没有对速度进行优化,并在效率和精度上获得更好的平衡。对于使用不同尺度的图像和提案数量,这些已经超出了这篇论文之外了。

训练:Mask R-CNN 也是可以快速训练的。使用 ResNet-50-FPN 背骨,对 trainval 135K COCO 数据图像进行训练,使用 8 块 GPU 并行训练(min-batch 为 16,每个批次 耗时 0.72s),耗时 32 个小时完成训练;对于使用 ResNet-101-FPN背骨,则耗时 44 小时完成训练。事实上,如果使用原始模型的话,可以在一天不到的时间内对训练集完成训练。我们期望这样快速的训练将这一领域的一个主要障碍消除掉,以鼓励更多人对这一具有挑战行的主题进行研究。

 

5. 关于人体姿态评估的 Mask R-CNN

我们的框架很容易扩展到人体姿态评估。我们将模型的关键点位置设置为一个 one-hot mask,并采用 Mask R-CNN 来预测 K 个 masks,每个关键点(K 个关键点) 类型一个。这个任务有助于展示 Mask R-CNN 的灵活性。

注意到,我们的系统利用了人体姿态的最小域知识,因为这个实验主要是为了展示 Mask R-CNN 框架的通用性。我们期待该领域的知识(如,模型构建) 可以将我们这个简单的方法进行补充。

实现细节:在对于关键点进行调整时,我们对分割系统做了一点小修改。该实例中 K 个关键点中的每一个关键点 在训练的时候关注目标是对这 \large m \times m 进行 mask 二分类生成 one-hot 操作,其中只有一个像素被标记为前景,其余为背景。在训练时,对于每个可见的 ground truth 关键点,使其 \large m^{2}-way 的多分类输出的交叉熵损失最小化(建议对单个点进行检测)。我们注意到,在实例分割中,这 K 个关键点仍然是单独优化的。

我们采用 ResNet-FPN 变体,并且关键点头部结果类似于:

这个关键点头部由 8 个  \large 3 \times 3 \;\; 512-d 的卷积层组成,后面紧跟着一个 deconv 层 和 2 倍的双线性上采样,生成一个 \large 56 \times 56 像素大小的输出。我们发现,要获得一个分辨率相对较高的输出(对 mask 的比较) 则需要关键点级别的定位精度。

模型在所有包含关键点注释的 COCO trainval135k 图像数据集上进行训练。为了避免过拟合,将训练集设置的小点,从 [640, 800] 像素中随机采样来作为图像的训练尺度,而推理则是在  800 像素的单尺度上进行的。我们训练的时候进行 90k 个 epochs,起始学习率为 0.02,等训练到 60k 个 epochs 和 80 个 epochs 时 再将学习率缩小为原来的 1/10。我们设置 bounding-box NMS 的阈值为 0.5。其他详细的参数设置与上面 实现的细节 相同。

主要结果与对比:我们使用 ResNet-50-FPN 背骨来进行实验,来对 人体关键点 \large AP (\large AP^{kp}) 进行评估;在附录中有更多的背骨网络将用来对此进行研究。下图展示的是我们的实验结果(62.7 \large AP^{kp}) 和 2016 年 COCO 数据集 关键点检测的冠军(采用多级管道处理) 的结果,我们比他好上 0.9 个点。而我们的方法则相当简单和快捷。

更重要的是,我们有一个统一的模型,它可以在 5 fps 的速度下对 boxes、分割 和 关键点 同时进行预测。增加了一条分割分支(对人体的分类) 在 test-dev 上将 \large AP^{kp} 提升到 63.1 (如上图所示)。在小量验证集上 更多的多任务研究比较 如下图所示:

增加这条 mask 分支到 box-only 或 keypoint-only 的变体中去,从而对这些任务不断地改进。然而,新增的关键点分支会对 box/mask 的 \large AP 存在一定的削弱,这就表明关键点检测虽然可以从多任务训练中获益,但是它并不总是有助于其他任务的。不过,这三个任务的联合学习可以使一个统一的系统对所有输出同时进行预测。

我们还研究 ROIAlign  对关键点检测的影响。如下图所示

尽管以 ResNet-50-FPN 为背骨可以有更好的步幅(例如,4 个像素为最好的等级),ROIAlign 仍然比 ROIPool 有着显著的改进,并且将 \large AP^{kp} 提升了 4.4 个点。这是因为关键点检测对位置精度更加敏感。这里再次表明对于像素级位置(包括 mask 和关键点) 对齐是非常有必要的。

考虑到 Mask R-CNN 在提取 目标 bounding boxes、mask 和 关键点 等方面的效率问题,我们期望 其可以成为其他实例级任务的高性能框架。

 

6. 附录A:城市景观实验

我们还对城市景观数据集的实例分割结果做了报告。这些数据集都标注的很好,其中有: 2975 张训练数据,500 张验证数据,1525 张测试数据。 我们并不使用那 20k 张没有实例注释的粗糙训练图像数据集。我们使用的数据中所有的图像都是 \large 2048 \times 1024 像素大小的。该实例分割任务涉及到 8 个类别的目标,在这些好的训练集上所包含全部的实例数量如下所示:

通过对 COCO-style 数据集 mask \large AP (大于 IOU 的平均阈值),\large AP_{50} (IOU 为 0.5 时 的 mask \large AP) 实验,来获取这个实例分割性能任务的报告。

实现:我们使用以 ResNet-FPN-50 为背骨的 Mask R-CNN 模型,但是发现由于数据集过小,而导致 对应的 101 层 执行结果很相似。为了避免过拟合,我们从  [800, 1024] 像素大小的图像中随机采样为训练图像的输入尺度,并在 1024 像素的单尺度上进行推理(也就是,我们从 [800, 1024] 像素大小的图像中随机取样,将取样的图像灌进网络,然后,在网络中 resize 为 1024 进行推理计算)。我们设置的 mini-batch size 为,一个 GPU 一张 图像(8 张图像对应 8 个 GPU),并且设置 24k 个 epochs,起始学习率为 0.01,当训练到 18k 个 epochs 时,学习率降低为 0.001。对于以上设置,我们在 8 块 GPU 上训练大概耗时 4 小时完成。

结果:下图为 在 验证集和训练集上,我们的模型和 当前最好的模型的比较结果:

在不使用粗糙训练数据集的情况下,我们的模型在测试集上获得了 26.2 \large AP 的成就,与当前最好的模型(DIN) 相比,我们的模型获得了 30% 的提升,也比 并行运行的 SGN's 25.0 要好。在 DIN 和 SGN 中,通常都是 好数据 和 粗糙数据 混合使用的。相比较于那些使用好数据的最好模型也仅获得 17.4 \large AP,而我们的模型却比它们 提升了 差不多 50%。

关于人和汽车这两个类别,城市景观数据集显示它们实例之间存在大量类别内的重叠现象(大概平均每张图像 6 个人,9 辆车)。我们觉得实例类别内重叠现象是实例分割的核心难点。我们的方法尽管并不使用粗糙数据,但在这两类问题上有这巨大的提升,它超越了其他最好的模式(使得人的精度从 21.8 提升到 30.5,提升了大概  40%左右;而对于汽车类的精度则从 39.4 提升到 46.9,提升了大概  20% 左右)。

城市景观数据集的一个主要的难点在于数据量不足的情况下进行模型训练,特别是卡车、公交车和火车等类别,其每个类别大概只有 200~500 张样本集而已。

为了解决部分该问题,我们使用 COCO 预训练结果来进一步报告。为此,我们对预训练的 COCO Mask R-CNN 模型中相应的 7 个类别进行初始化(附加项被随机初始化)。我们 对这个模型进行 fine-tuning 训练,epochs 为 4k 次,当 epochs 到 3k 次时,并降低学习率,根据 COCO 模型来估算,大概训练 1 小时就 OK 了。

这个 COCO 预训练 Mask R-CNN 模型在测试上获得 32.0 AP,与只提供微调的版本相比,这个模型几乎提高了6个百分点。这就表明了,训练数据的数据量起着重要的作用。这也表明着城市景观方法会受到它们低镜头(可以 理解为不上镜,出现在镜头的次数、数量少) 学习能力的影响(出现的少,就不怎么学习 得到  它 对应的特征)。我们这里通过实验 显示 在该数据集上使用 COCO 预训练模型是一个非常有效的策略。

最后,通过观察结果,我们发现 val \large AP 和 test \large AP 存在一些细微的偏差。我们发现这些细微的偏差主要是由卡车、公交车和火车等类别导致的,其中 微调模型中 val/test \large AP 分别为 28.8/22.8、53.5/32.2 和 33.0/18.6 。这就表明着,基本没有这 3 个类别的训练数据,从而导致了类别领域产生了变化(数据少,没学会该特征,从而在实际的分类中识别不了该类别,而导致该无法对该类进行分类)。COCO 预训练模型对这些分类结果有很大的提升;然而,类别领域的变化导致的 val/test \large AP 分别为:38.0/30.1、57.5/40.9和41.2/30.9。但是,在 人和汽车的类别当中,我们没有看到任何类似这样的偏差(val/test \large AP 只在 一个百分点内浮动)。

城市景观的例子结果如下图所示:

 

7. 附录B: COCO 数据增强结果

Mask R-CNN 作为一个通用的框架,它对 检测与分割研发技术的拓展有着很好的兼容性,这包括对 Fast/Faster R-CNN 和 FCNs 的改进。在这篇附录中,我们将对一些超越我们原始结果的改进技术进行描述。由于 Mask R-CNN 的通用性与灵活性,在 2017 年的 COCO 数据实例分割竞赛中 它 被 3 个冠军队将其作为框架使用 ,并且获得比以前所有最好的结果都还要好的成绩。

 

实例分割和目标检测

下图为 Mask R-CNN 的一些增强结果的报告:

总体上,其改进使得 mask AP 获得了 5.1 个点的 增长(从 36.7 提升到 41.8),box \large AP 获得了 7.7 个点的增长(从 39.6  提升到 47.3)。其每个模型的改进,都使得 mask \large AP 和 box \large AP 同时获得提升,这就展示着 Mask R-CNN 框架的 泛化能力非常好。我们接下来再详细细说改进。这些结果,以及未来的更新,可以去复制我们的代码:Mask R-CNN master ,并且在未来的研究当中可以以此为更高的基线。

基线更新:我们从使用一系列不同的超参对基线进行更新开始。增大训练的 epochs 到 180k 次,并且在 epochs 为 120k 次时将学习率降低为原来的 十分之一,等到了 epochs 为 160k 时 再降低为之前的 十分之一。同时,我们将 NMS 的阈值修改为 0.5 (默认的阈值为 0.3)。这样更新的基线获得 mask \large AP 为 37.0 和 box \large AP 为 40.5 的成绩。

端到端的训练:之前搜有的结果都采用了分段训练方式,训练 RPN 网络为第一级,Mask R-CNN 为第二级。接下来,我们将 RPN 网络 和 Mask R-CNN 加入到端到端训练中进行验证。为此,我们采用一个只计算 ROIAlign 层中的部分梯度而忽略 ROI 坐标梯度的 “近似” 版本。上图为端到端训练对 mask \large AP 提升了 0.6 个点,对 box \large AP 提升了 1.2 个点的结果展示。

ImageNet-5k 预训练:接下来,我们的实验 对 ImageNet 中 5k 类子集(与标准的1k类子集形成对比) 进行模型预训练。尽管该预训练数据的类别增加了 5 倍,但是仍对 mask \large AP 和 box \large AP 提升了 1 个点。作为参考,对它们的基线采用 250 倍如此多的图像(300M),box \large AP 并获得 2~3 个点的提升结果。

训练时数据增强:在训练中增加尺度可以进一步提升效果。在训练中,我们从 [640, 800] 像素的图像中随机采样一个尺度作为输入图像,并将 epochs 的数量增加到 260k 次(而学习率在 epochs 为 200k 次 和 240k 次时都除以 10)。训练时数据增强对 mask \large AP 提升了 0.6 个点,对 box \large AP 提升了 0.8 个点。

模型结构:通过将 ResNeXt-101 升级到对应 ResNeXt-152 结构,我们在 mask AP 上获得了 0.5 个点的增长,在 box AP 上获得了 0.6 个点的增长。这就表明,在 COCO 数据集上,对于加深模型网络对结果是有所提升的。

而使用最近提出的非本地模型(non-local model),我们可以在 40.3 mask \large AP 和 45.0 box \large AP。这个结果是使用  该方法在 一块 英伟达 Tesla P100 GPU 上运行速度为 3 fps,且没有做测试时数据增强时所获得的测试结果。

测试时数据增强:我们以 100 为级别对  [400, 1200] 像素的图像进行不同尺度采样(如:400,500,600,...,1200 等像素的图像),并结合对图像进行水平翻转操作来验证模型结构。这在单模型结果上获得了 41.8 mask \large AP 和 47.3 box \large AP 成绩。

以上的结构都是我们提交到 2017 年 COCO 竞赛的基准数据(里面也有使用集成学习的,但不在这里讨论)。据报道,在实例分割任务中,前三名的获胜者都是使用基于 Mask R-CNN 框架 的 扩展模型。

 

关键点检测

下图为数据增强的关键点检测结果:

作为更新基线,我们将训练计划拓展到 epochs 为 130k 次,并且在 epochs 为 100k 次时 学习率降为原来的 1/10。这样可以使得  \large AP^{kp} 获得 百分之一的提升。用 ResNet-101 和 ResNeXt-101 替代 ResNet-50,可以使得 \large AP^{kp} 分别提升到 66.1 和 67.3。

通过使用最近一种叫做数据蒸馏的方法,我们就能够利用 COCO 额外提供的 120k 未标注的图像。简而言之,数据蒸馏是一种自我训练的策略,它使用已标注的数据训练得到的模型来预测为标准数据的注释,然后再使用这些预测得到的新标注数据来对模型进行更新。而 Mask R-CNN 为这种自我训练策略提供了一个有效的框架。通过数据蒸馏,Mask R-CNN 的 \large AP^{kp} 获得 1.8 个点的提升,从而达到 69.1。我们发现 Mask R-CNN 模型 可以从这些额外的数据获得提升,即是这些数据 并未标注。

再通过使用与实例分割相同的测试时间增强操作,我们可以将 \large AP^{kp} 进一步提升到 70.4。

 

8. 总结

这篇 Mask R-CNN 不仅是一种模型,更是一种思想,下面将对这篇论文做一下总结:

(1). Mask R-CNN 框架简单,便于训练,易于扩展,资源与推理消耗少(mask 分支不大),结构如下图所示

      前面的 backbone 可以随便更换,而后面使用 mask 分支(分支不大,资源消耗少),就是一个 Mask R-CNN 模型了,所以说,它不仅是一种模型,更是一种思想(只是作者在实验的时候,Faster R-CNN 的精度相对不错,所以用了 Faster R-CNN 为基线)。

(2). Mask R-CNN 提出了 ROIAlign,减少了数值量化操作,并且使用插值运算,不仅使得 box AP 有所提升,而且 mask AP 也更好了。

(3). Mask R-CNN 的 mask 分支使用了与类无关的 sigmoid 函数来二分类预测 分割 mask 模块(利用了目标检测分类结果,所以该 mask 只用区分前景和背景),比传统的使用 softmax 来类分割更快跟准。

(4). 使用了 预训练模型 和超参设置,提高了 AP 成绩(论文中,由于是在 Faster R-CNN 上扩展得到的,所以使用 Faster R-CNN 的预训练模型和其相对应的超参设置)。

(5). Mask R-CNN 非常通用和灵活,所以很容易扩展到人体姿态评估 模型,对模型定义 K 个关键点 mask 的 one-hot,并取得很不错的成绩。

(6). 对于类别偏差的数据,可以使用 COCO 数据的预训练模型  来进行微调,从而获得较好的 AP 成绩。

(7). 网络调优可以通过对超参的条件:如 epochs,学习率等,使用较好的 backbone,数据增强,数据蒸馏(这个方法就是工业界的冲床,可以通过不断的自我学习从而变得更好) 等方法。

 

 

              

 

回主目录

返回 实例分割 目录

下一章: 深度篇——实例分割(二) 细说 mask rcnn 实例分割代码 训练自己数据

  相关解决方案