Mask R-CNN

Mask R-CNN

arXiv : https://arxiv.org/pdf/1703.06870.pdf
github: https://github.com/matterport/Mask_RCNN
conf & anthor: ICCV17,Kaiming He et. al
intro: ROI Align, FCN

主要内容:
Mask R-CNN通过在Faster R-CNN的基础上,在RPN网络得到RoI之后,增加一个分支FCN网络,实现对BBox中的物体进行实体分割。
Mask R-CNN

基本思路:
Faster R-CNN中通过RPN可以得到一些RoI,这些区域通过RoI pooling之后,再经过全连接网络计算目标的类别和坐标。在Mask R-CNN中,在RoI的基础上,新增一个全卷积分支网络,以实现目标的分割任务。
(1) ROI Align: Fast R-CNN中使用的ROI pooling操作,首先要确定region在最后的feature map上的位置,这一步需要将像素坐标转换到feature map坐标上,比如x/16x/16然后取整;然后需要将feature map上的区域划分为nnn*n(如777*7)的格子,做pooling操作;这两步操作需要进行quantization(量化),会造成坐标精度的损失。因此,Mask R-CNN中提出了RoIAlign操作,避免了由于量化操作带来的坐标精度的损失。具体的做法如下图:在将像素坐标转换到feature map坐标这一步上,不进行取整,得到的是带小数位的feature map上的坐标,然后将该AlignBox划分为n*n的格子,每个格子中均匀采样四个点,每个点的值通过在feature map上进行双线性插值得到。最后在每个格子中通过平均或者最大池化得到输出。 在TensorFlow中,RoIAlign可以通过tf.image.crop_and_resize() 函数简化实现,简化的方面是将格子中心的插值结果最为输出,而不是取四个点再做池化。
Mask R-CNN
Mask R-CNN

(2) 分支网络:Mask R-CNN中在ROIAlign之后增加了一条全卷积的分支网络,用于Mask的预测。文章中对以ResNet和FPN为主干网络分别设计了两种分支结构。以ResNet为例,如下图,经过deconv扩大feature map的尺寸,最后输出的mask的尺寸为14148014*14*80,通道数目为80是为每一个类别预测了一个mask(coco数据集的类别数目为80)。
Mask R-CNN
(3) 损失函数: Mask R-CNN中使用了类别+坐标+mask的多任务损失函数 Lloss=Lcls+Lcoor+LmaskL_{loss}=L_{cls}+L_{coor}+L_{mask},其中类别和坐标损失与Fastre R-CNN中的一致。Mask R-CNN中最后输出的mask的尺寸为mmKm*m*K(如14148014*14*80),通道数K表示目标类别数目。 计算LmaskL_{mask}时只使用RoI的真实类别的那一个通道的损失,其他通道均不贡献损失,具体计算时使用的是空间位置上所有点的sigmiod变换后的二元交叉熵损失的均值。
Lmask=1m2iK(1k)1m2[ylog(sigmoid(x))(1y)log(1sigmoid(x))]L_{mask}=\frac{1}{m^2}\sum_i^K(1^k)\sum_1^{m^2}[-ylog(sigmoid(x))-(1-y)log(1-sigmoid(x))]
其中:

  • 1k1^k 表示当第kk个通道对应目标的真实类别时为1,否则为0 ;
  • yy表示当前位置的mask的label值,为0或1;
  • xx当前位置的输出值,sigmoid(x)sigmoid(x)表示输出x经过sigmoid函数变换后的结果;