1. Introduction
在faster rcnn后面加一个预测物体mask的分支平行于bbox regression的分支。可以在此基础上加其他任务比如姿态估计
本来有物体检测object detection和物体分割senabtic segmentation,现在结合起来是instance segmantation,既每个个体都能mask分开(原来是一个类一个颜色).结合的faster rcnn 和FCN的想法。只加了一点点计算量效果确好很多。其实就是在faster rcnn原有的两个分支(回归和分类)基础上加一个mask 分支。如何构建这个mask分支是关键
但是faster rcnn不是像素对像素的,是有各种抽取pooling数字化的.为了恢复这种输入点到输出点的对齐,
- 我们建一个不需要增加计算量的层ROIAlign.。完美的保存了准备的位置信息。这一个小小的动作带来了很大的获益,提高准确率10%-50%,
- 另外我们发现把mask任务和分类任务分开非常重要。每个类我们都有一个二类mask。既先通过分类人物获得类别判断,然后给图上的每个类一个mask,不同类间没有竞争.作为对比,FCN本来都是算mask时每个点做多分类的。我们检验出这样并不好
2. Related Work
分割工作:最早的分割方法是自下而上的,提出后选取与然后用faster rcnn分类,这样子的情况下分割比回归又快又好(但是分割是一个类一个颜色)。也有方法是先利用回归框作为分割的预选框然后分类,但是这样要分好几个stage好烦。我们的方法是分类和mask任务平行进行,简单易行很多。最近又出来一个方法FCIS,输出一个featuremap然后再拿去同时做回归,分类和mask,但是他会出现边缘不准确以及交叠时出问题;FCN是结束之后再把一个类的mask分成一个个物体,与这些先分割的不同,我们是先找物体。
3. Mask R-CNN
mask rcnn理解起来很容易,加一个二元mask分支
这里的Lmask是总共有m*m×k维的,这里m*m是ROI的大小,K是类别数。这里的每个点算sigmoid loss,Lmask是average binary cross-entropy loss平均二元交叉熵损失
大概长这样吧。最后算loss的时候因为每个ROI最后会有一个类别,Lmask里面只算这个类别的Lmask。既只有对应的类别才贡献loss.平行进行,拿到类别后去选出要拿来用的Lmask.(FCN 是直接上来就每个mask像素点做softmax多分类)。我们发现这个非常重要。
把ROI拿出来还原回原来的样子就做mask,而不是像分类回归一样提取经过一系列FC。我们这样需要更少参数且更精确。
还原这个过程,我们用的ROIAlign.
一般得到ROI后我们会做ROI-Pooling,这种压缩的过程对分类没什么影响,但是对mask预测的影响非常大。我们的这个层就是把输出的每个点与原始图像的点做一一对应
作者:张天亮
链接:https://www.zhihu.com/question/57403701/answer/153206666
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
关键点1:解决特征图与原始图像上的RoI不对准问题
问题描述:RoIPool[3]是一种针对每一个RoI的提取一个小尺度特征图(e.g. 7x7)的标准操作,它用以解决将不同尺度的RoI提取成相同尺度的特征大小的问题。RoIPool首先将浮点数值的RoI量化成离散颗粒的特征图,然后将量化的RoI分成几个空间的小块(spatial bins),最后对每个小块进行max pooling操作生成最后的结果。该操作类似于下图,但只取了一个尺度。
通过计算[x/16]在连续坐标x上进行量化,其中16是特征图的步长,[ . ]表示四舍五入。这些量化引入了RoI与提取到的特征的不对准问题。由于分类问题对平移问题比较鲁棒,所以影响比较小。但是这在预测像素级精度的掩模时会产生一个非常的大的负面影响。
解决方案:作者提出RoIAlign层来解决这个问题,并且将提取到的特征与输入对齐。方法很简单,避免对RoI的边界或者块(bins)做任何量化,例如直接使用x/16代替[x/16]。作者使用双线性插值(bilinear interpolation)在每个RoI块中4个采样位置上计算输入特征的精确值,并将结果聚合(使用max或者average)。
关键点2:将掩模预测和分类预测拆解
该框架对每个类别独立地预测一个二值掩模,没有引入类间竞争,每个二值掩模的类别依靠网络RoI分类分支给出的分类预测结果。这与FCNs不同,FCNs是对每个像素进行多类别分类,它同时进行分类和分割,基于实验结果表明这样对于对象实例分割会得到一个较差的性能。
下面介绍一下更多的细节,在训练阶段,作者对于每个采样的RoI定义一个多任务损失函数,前两项不过多介绍。掩模分支对于每个RoI会有一个维度的输出,它编码了K个分辨率为的二值掩模,分别对应着K个类别。因此作者利用了a per-pixel sigmoid,并且定义为平均二值交叉熵损失(the average binary cross-entropy loss)。对于一个属于第k个类别的RoI,仅仅考虑第k个mask(其他的掩模输入不会贡献到损失函数中)。这样的定义会允许对每个类别都会生成掩模,并且不会存在类间竞争。
关键点3:掩模表示
一个掩模编码了一个输入对象的空间布局。作者使用了一个FCN来对每个RoI预测一个的掩模,这保留了空间结构信息。
对于以上几个关键点,作者在表格2中给出了详细的性能比较。
针对关键点1:
针对关键点2:
针对关键点3:
4 结果展示与性能对比
mask分支只用于分数最高的100个detection bboxes,提高了精度和速度