写在前面
Mask RCNN是凯明大神的又一力作。通过在Faster R-CNN的基础上添加一个分支网络,实现目标检测的同时输出高质量的实例分割Mask。该算法在COCO的实例分割、目标检测、人体关键点检测三个任务中都取得了非常好的结果,在不加任何Trick的情况下能够超过各种数据增强加持下COCO 2016分割挑战的冠军FCIS。以下是论文简记。
网络结构
下图是Mask RCNN的一个网络结构示意图,其中黑色部分为原来的Faster R-CNN,红色部分为在Faster R-CNN网络上的修改,具体包括:(1)将ROI Pooling层替换成了ROIAlign;(2)添加了并列的FCN层(Mask层)。
下图是两种RCNN方法与Mask结合的示意图,其中灰色部分是原来的RCNN结合ResNet或FPN的网络,下面黑色部分为新添加的并联Mask层,这个图本身与上面的图也没有什么区别,旨在说明作者所提出的Mask RCNN方法的泛化适应能力-可以和多种RCNN框架结合,且表现都不错。
技术要点
一、增强了基础网络
将ResNeXt-101+FPN用作特征提取网络,达到State-of-the-art 的效果。
二、加入了ROIAlign层
ROIPool是一种针对每一个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)。示意图如下。
三、改进了分割Loss
由原来的基于单像素Softmax的多项式交叉熵变为了基于单像素Sigmod二值交叉熵。该框架对每个类别独立地预测一个二值掩模,没有引入类间竞争,每个二值掩模的类别依靠网络ROI分类分支给出的分类预测结果。这与FCNs不同,FCNs是对每个像素进行多类别分类,它同时进行分类和分割,基于实验结果表明这样对于对象实例分割会得到一个较差的性能。
下面介绍一下更多的细节,在训练阶段,作者对于每个采样的ROI定义一个多任务损失函数$L=L_{cls}+L_{box}+L_{mask}$,前两项不过多介绍。掩模分支对于每个ROI会有一个$Km^2$维度的输出,它编码了$K$个分辨率为$m\times m$的二值掩模,分别对应着$K$个类别。因此作者利用了A Per-pixel Sigmoid,并且定义为平均二值交叉熵损失(The Average Binary Cross-entropy Loss)。对于一个属于第$K$个类别的ROI,仅仅考虑第$K$个Mask(其他的掩模输入不会贡献到损失函数中)。这样的定义会允许对每个类别都会生成掩模,并且不会存在类间竞争。
四、掩模表示
一个掩模编码了一个输入对象的空间布局。作者使用了一个FCN来对每个ROI预测一个的掩模,这保留了空间结构信息。
参考文献
[1] Mask RCNN.
[2] Mask R-CNN个人理解
[3] Mask-RCNN技术解析