Mask R-CNN(精简注释版)

参考博客:

https://blog.csdn.net/WZZ18191171661/article/details/79453780

http://blog.leanote.com/post/[email protected]/b5f4f526490b

论文:https://arxiv.org/abs/1703.06870

翻译:https://blog.csdn.net/q199502092010/article/details/86095823

Mask RCNN

摘要

我们提出了一个概念上简单、灵活以及通用的目标实例分割框架。我们的方法有效地检测图像中的目标,同时为每一个实例生成高质量的分割掩模。这种叫Mask R-CNN的方法通过添加一个与现有边框识别分支并行的、用于预测目标掩模的分支来扩展Faster R-CNN。Mask R-CNN训练简单,相对于Faster R-CNN只增加了很小的开销,运行速度在5fps。此外,Mask R-CNN很容易推广到其他任务,例如,允许我们在同一个框架中估计人的姿势。我们在COCO系列挑战赛的全部三个比赛项目中都取得了最佳成绩,包括实例分割、边框目标检测以及人体关键点检测。在没有使用额外技巧的情况下,Mask R-CNN在每个任务上优于所有现有的单一模型实体,包括COCO 2016挑战的获胜者。我们希望我们简单而有效的方法能够成为一个基础的方法,并有助于未来实例级识别的研究。我们将稍后提供代码。

 

在原理上,Mask R-CNN是Faster R-CNN的直接扩展,正确构建掩模分支对于取得好结果是至关重要的。更重要的是,Faster R-CNN不是为网络输入和输出之间的像素对齐而设计的。这一点在RoIPool[13, 9]中最为明显,它实际上是用于处理实例的核心操作,对特征提取执行粗的空间量化。为了修正错位,我们提出了一个简单的,量化无关的层叫做RoIAlign,可以保留精确的空间位置。尽管看似一个很小的变化,RoIAlign起了很大的作用:它能将掩模准确率提高到10%至50%,在更严格的位置度量下显示出更大的收益。再者,我们发现解耦掩模和类预测是至关重要的:在没有类间竞争的情况下,我们为每个类独立的预测二进制掩模。并且依赖于网络的RoI分类分支来预测类别。相比之下,FCN通常执行每像素多类分类,分割和分类同时进行,基于我们的实验,发现它对实例分割效果不佳。

 

Mask R-CNN概念简单:Faster R-CNN为每个候选目标输出一个类标签和一个边框偏移量。为此,我们添加了一个输出目标掩模的第三条分支。因此,Mask R-CNN是一个自然且直观的例子。但是,附加的掩模输出与类输出和边框输出不同,需要提取对象更精细的空间布局。接下来,我们将会介绍Mask R-CNN的关键特点,包括像素到像素的对齐,这是Fast/Faster R-CNN所不具备的关键点。

 

通常,在训练中,我们将每个采样后的RoI上的多任务损失函数定义为:

L = Lcls + Lbox + Lmask ,其中,分类损失Lcls和边框损失Lbox与[9]中定义相同。掩模分支对于每个RoI的输出维度为Km2 ,表示K个分辨率为m × m的二进制掩模。每个类别有一个分辨率为m × m的二进制掩模,K表示类别数量。为此,我们为每个像素应用sigmoid,并定义Lmask为平均二进制交叉熵损失。对于真实类别为k的RoI,仅在第k个掩模上计算Lmask(其他掩模输出不计入损失)。

 

我们对Lmask的定义允许网络在不跨类别竞争的情况下,为每个类独立的预测掩模;我们依靠专用分类分支预测用于选择输出掩模的类标签。这个将解耦掩模和类预测。这与通常将FCNs[23]应用于像素级softmax和多项式交叉熵损失的语义分割做法不同。在这种情况下,掩模将跨类别竞争。在我们的方法中,使用了像素级的sigmod和二进制损失,掩模将不会跨类别竞争。我们通过实验发现,这种方法是改善实例分割结果的关键。

 

这种像素到像素的行为需要RoI特征,它们本身就是小特征图,为了更好的对齐,以准确的保留显式的像素空间对应关系,我们开发出在掩模预测中发挥关键作用的RoIAlign层,将在接下来讲到。

 

RoIAlign:RoIPool[9]是从每个RoI提取特征图(例如,7×7)的标准操作。RoIPool首先将浮点数表示的RoI量化到与特征图匹配的粒度,然后将量化后的RoI分块,最后汇总每个块覆盖的区域的特征值(通常使用最大池化)。量化是执行的。例如,对在连续坐标系上的x计算[x/16],其中16是特征图步幅,[.]表示四舍五入。同样的,当对RoI分块时(例如7×7)也执行同样的计算。这些量化操作使RoI与提取的特征错位。虽然这可能不会影响分类,因为分类对小幅度的变换有一定的鲁棒性,但它对预测像素级精确的掩模有很大的负面影响。

 

在常见的两级检测框架(比如Fast-RCNN,Faster-RCNN,RFCN)中,ROI Pooling 的作用是根据预选框的位置坐标在特征图中将相应区域池化为固定尺寸的特征图,以便进行后续的分类和包围框回归操作。由于预选框的位置通常是由模型回归得到的,一般来讲是浮点数,而池化后的特征图要求尺寸固定。故ROI Pooling这一操作存在两次量化的过程。

  • 将候选框边界量化为整数点坐标值。
  • 将量化后的边界区域平均分割成 k x k 个单元(bin),对每一个单元的边界进行量化。

事实上,经过上述两次量化,此时的候选框已经和最开始回归出来的位置有一定的偏差,这个偏差会影响检测或者分割的准确度。在论文里,作者把它总结为“不匹配问题(misalignment)。

下面我们用直观的例子具体分析一下上述区域不匹配问题。如下图所示,这是一个Faster-RCNN检测框架。输入一张800*800的图片,图片上有一个665*665的包围框(框着一只狗)。图片经过主干网络提取特征后,特征图缩放步长(stride)为32。因此,图像和包围框的边长都是输入时的1/32。800正好可以被32整除变为25。但665除以32以后得到20.78,带有小数,于是ROI Pooling 直接将它量化成20。接下来需要把框内的特征池化7*7的大小,因此将上述包围框平均分割成7*7个矩形区域。显然,每个矩形区域的边长为2.86,又含有小数。于是ROI Pooling 再次把它量化到2。经过这两次量化,候选区域已经出现了较明显的偏差(如图中绿色部分所示)。更重要的是,该层特征图上0.1个像素的偏差,缩放到原图就是3.2个像素。那么0.8的偏差,在原图上就是接近30个像素点的差别,这一差别不容小觑。

Mask R-CNN(精简注释版)_第1张图片

 

 

为了解决这个问题,我们提出了一个RoIAlign层,消除了对RoIPool的粗糙量化,并将提取的特征与输入精准的对齐。我们提出的改变很简单,我们避免对RoI边界或块进行量化(例如,我们使用x/16代替[x/16])。我们选取每个RoI分块中的四个常规位置,使用双线性插值[17]来计算每个位置的精确值,并将结果汇总(使用最大或平均池化)。(我们抽取四个常规位置,以便我们可以使用最大或平均池化。实际上,在每个分块中心取一个值(没有池化)几乎同样有效。我们也可以为每个块采样超过四个位置,但我们发现这些位置的收益递减。)

 

如下图所示,蓝色的虚线框表示卷积后获得的feature map,黑色实线框表示ROI feature,最后需要输出的大小是2x2,那么我们就利用双线性插值来估计这些蓝点(虚拟坐标点,又称双线性插值的网格点)处所对应的像素值,最后得到相应的输出。这些蓝点是2x2Cell中的随机采样的普通点,作者指出,这些采样点的个数和位置不会对性能产生很大的影响,你也可以用其它的方法获得。然后在每一个橘红色的区域里面进行max pooling或者average pooling操作,获得最终2x2的输出结果。我们的整个过程中没有用到量化操作,没有引入误差,即原图中的像素和feature map中的像素是完全对齐的,没有偏差,这不仅会提高检测的精度,同时也会有利于实例分割。

Mask R-CNN(精简注释版)_第2张图片

 

正如我们在4.2节(对照实验)中所示,RoIAlign的改进效果明显。我们还比较了[7]中提出的RoIWarp操作。与RoIAlign不同,RoIWarp忽略了对齐问题,并在[7]的实现中有像RoIPool那样量化RoI。即使RoIWarp也采用了[17]中的双线性重采样,如实验实现所示(更所细节见表2c),它与RoIPool的效果差不多。这表明对齐起到了关键的作用。

 

我们评估了深度为50或101层的ResNet [14]和ResNeXt [34] 网络。使用ResNet [14]的Faster R-CNN从第四级的最终卷积层提取特征,我们称之为C4。例如,使用ResNet-50的主干架构由ResNet-50-C4表示。特征金字塔网络(FPN)。FPN使用具有横向连接(lateral connections )的自顶向下架构,从单一规模的输入构建网络功能金字塔。使用FPN的Faster R-CNN根据其尺度提取不同级别的金字塔的RoI特征,不过其他部分和平常的ResNet类似。使用ResNet-FPN主干架构的Mask R-CNN进行特征提取,可以在精度和速度方面获得极大的提升。有关FPN的更多细节,读者可以参考[21]。

 

对于上层网络,我们基本遵循了以前论文中提出的架构,我们添加了一个全卷积的掩模预测分支。具体来说,我们扩展了ResNet [14]和FPN[21]中提出的Faster R-CNN的上层网络。详情见下图所示:(上层架构:我们扩展了两种现有的Faster R-CNN上层架构[14,21],并分别添加了一个掩模分支。左/右面板分别显示了ResNet C4和FPN主干的上层架构。图中数字表示通道数和分辨率,箭头表示卷积、反卷积和全连接层(可以通过上下文推断,卷积减小维度,反卷积增加维度。)所有的卷积都是3×3的,除了输出层是1×1。反卷积是2×2,其步进为2,我们在隐藏层中使用ReLU[24]。在左图中,“res5”表示ResNet的第五级,简单起见,我们修改了第一个卷积操作,使用7×7,步长为1的RoI代替14×14,步长为2的RoI[14]。右图中的“×4 ”表示堆叠的4个连续的卷积。)ResNet-C4主干的上层网络包括ResNet的第5阶段(即9层的’res5’[14]),这是计算密集型的。但对于FPN,其主干已经包含了res5,因此可以使上层网络包含更少的卷积核而变的更加高效。

Mask R-CNN(精简注释版)_第3张图片

 

训练:和在Fast R-CNN设置一样,如果RoI与真值框的IoU不小于0.5,则为正样本,否则为负样本。掩模损失函数Lmask仅在RoI的正样本上定义。掩模目标是RoI及其相关的真值掩模之间的交集。我们采用以图像为中心的训练[9](image-centric training)。图像被缩放(较短边)到800像素[21]。批量大小为每个GPU2个图像,每个图像有N个RoI采样,正负比例为1:3[9]。C4的主干N为64(如[9,28]),FPN为512(如[21])。我们使用8个GPU训练(如此有效的批量大小为16)160k次迭代,学习率为0.02,在120k次迭代学习时学习率除以10。我们使用0.0001的权重衰减和0.9的动量。

 

RPN锚点跨越5个尺度和3个纵横比[21],为了方便对照,RPN分开训练,不与Mask R-CNN共享特征。除非有特殊说明,本文中的每个实体,其RPN和Mask R-CNN具有相同的主干,因此他们是可以共享的。

 

测试:在测试时,C4主干(如[28])中的建议数量为300,FPN为1000(如[21])。我们在这些建议上执行边框预测分支,然后执行非极大值抑制(non-maximum suppression[9]),再将掩模分支应用于评分最高的100个检测边框。尽管这与训练中使用的并行计算不同,但它可以加速推理并提高精度(由于使用的更少,所以有更准确的RoIs)。掩模分支可以预测每个RoI的K个掩模,但是我们只使用第k个掩模,其中k是分类分支预测的类别。然后将m×m浮点数掩模输出的大小调整为RoI大小,并使用阀值0.5将其二值化。

 

注意,由于我们仅在前100个检测边框中计算掩模,Mask R-CNN将边缘运行时间添加到其对应的Faster R-CNN版本(例如,在典型模型上约20%)。

 

Mask R-CNN(精简注释版)_第4张图片

你可能感兴趣的:(深度学习,目标检测)