1.动机

Mask R-CNN是在Faster R-CNN基础上提出的网络,Faster R-CNN中的RoI Pooling的位置计算存在较大误差;对原Faster R-CNN分类和回归选出来的RoI,进行分割,这种方式被称为实例分割。

2.创新

  • 使用RoI Align替换RoI Pooling。
  • 添加了一个额外的分支来预测分割的mask。
  • 使用sigmoid,减少类间竞争,将更多的精力放在优化mask像素上。

3.网络结构

3.1 backbone

Mask R-CNN特征提取网络使用表达能力更强的网络来提取特征,同时加入FPN提取多尺度信息,ResNet 50/101+FPN或ResNeXt 50/101+FPN,backbone如图1所示。




CNN网络图怎么画 cnn示意图_cnn 示意图


图1 Mask R-CNN网络结构

3.2 Feature Pyramid Network for RPN

如图2所示在网络中引入FPN结构,将高层含丰富语义信息的特征图和下层含丰富位置信息的特征图融合,得到 {


};然后将多尺度的特征图分别输入RPN网络中,得到相应的Proposals;根据公式:


,选择相应的特征图提取RoI。


CNN网络图怎么画 cnn示意图_双线性插值_02

图2 RPN with FPN


3.3 Regional Proposal Network

对于输入图像,首先对其进行缩放(使高等于600),然后使用CNN提取图像特征,得到特征图大小为40x60xN。

之后是RPN网络结构,如图3所示,先对特征图进行3x3卷积,之后生成anchor(三种尺寸、每种尺寸三种长宽比),最后使用两个上下通道的卷积进行分类和回归。上通道卷积输出2*k大小,表示k个anchor的前、背景概率;下通道卷积输出4*k大小,表示k个anchor相对于ground truth的偏移量。


CNN网络图怎么画 cnn示意图_cnn 示意图_03

图3 RPN网络

Chen:Faster R-CNN朝花夕拾zhuanlan.zhihu.com


3.4 ROI Align

使用RoI Align代替RoI pooling,解决misalignment问题,本文最大创新点,第4节具体介绍。

3.5 头部结构

{


}五种不同尺度的特征图输入RPN网络生成若干anchor box,经过Proposal层之后保留约2000个RoI,对于不同大小的RoI找到不同尺度的feature map提取相应区域,输入RoI Align中进行操作。


如图4所示为Mask R-CNN的head部分,包括边界框识别(分类和回归)+mask预测。根据mask位置的不同有两种结构,左图将mask分支放在RoI Align之后,右图将mask分支放在Proposals之后。


CNN网络图怎么画 cnn示意图_线性插值_04

图4 Head Structure

3.6 预测分支

Mask R-CNN相比于Faster R-CNN增加了一个Mask预测分支。

  • Classification:fc layer+softmax对object proposal进行分类,每个proposal输出(k+1)长度。
  • Regression:fc layer+bbox regressor输出proposal的偏移量,每个proposal输出(4*k)长度。
  • Mask prediction:FCN网络进行逐像素的mask预测。

4.ROI Align

如图5所示,为RoI Pooling过程,RoI Pooling在两次取整近似时,会导致检测信息和提取出的特征不匹配。

  • 候选框的位置取整。当RoI位置不是整数是,RoI的位置需要取整。
  • 提取特征时取整。划分4个子区域做max pooling,框的长度需要做近似取整。

特征与原始图像是不对准的(mis-alignment),影响检测精度。针对于此,Mask R-CNN提出RoIAlign的方法来取代ROI pooling,RoIAlign可以保留大致的空间位置。


CNN网络图怎么画 cnn示意图_双线性插值_05

图5 RoI Pooling过程

4.1 线性插值

图6所示为一维线性插值,已知



,给定


,求


值。


CNN网络图怎么画 cnn示意图_线性插值_06

图6 线性插值




4.2 双线性插值

双线性插值形式:



双线性插值是线性插值在二维时的推广,在两个方向上共做三次线性插值,定义了一个双曲抛物面与四个已知点拟合。

首先,f(x,y)为二元函数,已知





四个点的值,现希望通过插值得到矩形内任意点的函数值。


CNN网络图怎么画 cnn示意图_Mask_07

图7 双线性插值

在x方向线性插值求得



,然后用该坐标在y方向线性插值求得



已知



,给定


,求




已知



,给定x,求




已知



,给定


,求


。在y方向使用双线性插值。



代入



得到:




4.3 RoI Align

如图8所示为RoI Align示意图。

(1)首先将RoI(实线)映射到feature map(虚线)上,不要进行取整操作。

(2)在区域内均匀取4个点,找到特征图上离每个点最近的四个点;然后再通过双线性插值的方式,得到每个点的输出。

(3)插值完成之后,对每个bin内进行pool(Average Pooling或Max Pooling),最终得到2*2的一个pooling后的feature map。


CNN网络图怎么画 cnn示意图_线性插值_08

图8 RoI Align

5.Mask Prediction Branch

Mask Branch的输入为经过RoI Align之后得到的固定大小RoI,然后输入Mask R-CNN的head中,经过FCN全卷积网络预测物体mask,对于每个RoI,该分支都会输出K个M*M的binary mask,K为物体类别数,M为mask大小。如图4所示,预测的Mask大小为14*14*80。

M*M中的每个像素值为经sigmoid后的输出值,大小在0~1之间。Ground Truth中0表示背景,1表示物体。测试时,mask值大于0.5表示物体,小于0.5表示背景。

6.损失函数

网络最终分为三个分支,并有三个输出,所以loss的计算也分为三部分:



其中,分类和回归的loss是和Faster R-CNN相同的,不同之处在于添加了一个mask loss。

6.1 mask输出

对于每一个RoI,经过Mask branch的输出为K*M*M,K为网络类别数,M为输出的二进制大小。每一个M*M代表一个物体类别mask,其值经sigmoid后输出,大小在0~1之间。

6.2 ground truth

RoI形状各异,如何与mask输出计算损失?

  • 训练时,将真实的掩码缩小为M*M。
  • 测试时,根据预测类别数和bounding box回归得到的回归框大小,将相应类别的mask回归到该大小。

6.3 损失函数

如图9所示,根据Mask R-CNN预测的类别数,选择相应的mask输出通道,并将该RoI的 ground truth resize至M*M,用平均二值交叉熵计算损失。每个mask元素的损失如下:



CNN网络图怎么画 cnn示意图_线性插值_09

图9 mask loss计算

7.训练

Mask head训练中,将RoI与ground truth之间IoU>0.5的,记为Positive;否则为Negative。对于mask loss,只有记为Positive的样本,参与损失函数计算。

mini-batch=2,每张图片采样N个RoIs,positive和negative的比例为1:3。在8GPUs上训练,batchsize=2,160k迭代,learning_rete=0.02,每120k次迭代减少10倍,weight_decay=0.0001,momentum=0.9。

8.推理

Mask head测试中,对于分类和回归分支,使用前300个proposals;对于mask分支,使用score前100个proposals,预测mask。

每个RoIs预测K个masks,但只使用第i个mask,得到


浮点型mask,输出再resize回RoI的尺寸,并以0.5的阈值进行二值化。


9.总结

Mask R-CNN的主要贡献是设计出了RoI Align、添加了一个额外的分支来预测分割的mask以及损失函数的计算,作者放弃了更广泛的softmax,转而使用了sigmoid,避免了同类竞争,更多的精力放在优化mask像素上。