论文阅读——Mask RCNN

Mask RCNN主要用来做实例分割,那首先什么是实例分割呢?实例分割相当于目标检测和语义分割的结合体,语义分割只能将不同类别的物体分割出来,但加入一张image中有若干个person,那么语义分割区分不出每一个人。而实例分割可以在每个instance的检测框的基础上,分割出每一个实例。

Mask RCNN的基础是Faster RCNN。首先简单的回顾一下Faster RCNN,作为一个two-stage的检测方法,首先经过backbone和RPN网络,提取出若干region proposal;然后再喂入Fast RCNN中进行最终的ROI分类和回归。具体的细节可以参照:一文读懂Faster RCNN
论文阅读——Mask RCNN_第1张图片
Mask RCNN首先对Faster RCNN论文中的backbone进行改进,采取了一个Resnet+FPN的结构,可以提取多尺度的特征,并在不同尺度的feature map上选出ROI,对大目标和小目标的精度都更加有利。其backbone结构如下:
论文阅读——Mask RCNN_第2张图片
通过这种top-down的金字塔结构,我们就可以得到P2-P5这四张不同scale的特征图,当然还有P5下采样后的P6。在M2-M5之后又经历了一个 3 ∗ 3 3*3 33的卷积,其目的是消除混叠效应。其中在RPN的输入中,包括P2-P6这五张特征图,而在最后的Fast RCNN中只包含P2-P5这四张特征图。

那么P2-P6就可以通过RPN网络选取出若干ROI。随后这些ROI需要在P2-P5这四张特征图上进行切割,那么每一个ROI应该在哪一个特征图上切割呢?大家可能会觉得,ROI从哪个特征图上选出来的,就从对应的特征图上进行切割不应该最合适吗?这里我的理解是,假如P5预测出某个ROI(ROI包括xywh),如果这个wh非常的小,此时在低分辨率的P5上进行切割就很不合适,因此需要通过下面的公式,判断某个ROI应该在哪个feature map上面进行切割。

k = ⌊ k 0 + l o g 2 ( w h / 224 ) ⌋ k=\lfloor k_{0}+log_{2}(\sqrt{wh}/224)\rfloor k=k0+log2(wh /224)

k 0 k_{0} k0在这里取4.

Mask RCNN最主要的结构是在Faster RCNN的基础上增加了一个mask分支的extension,该mask分支与上图中ROIPooling后面的bbox回归和cls分类是平行的,主要用来对于每一个ROI,预测像素级的binary mask。根据下图可以看到cls和box分支使用的全连接,而mask分支采用的全卷积,更适合像素级的对应。mask分支的输出维度是 k m 2 km^{2} km2 k k k表示通道数,即数据集的类别数,对于coco来说 k = 80 k=80 k=80 m m m在这里等于28。可以实现mask和class预测的解耦,cls预测物体的类别,mask上每一个通道对应某一个类别。有关ROI mask的label,我的理解是用ROI在GT的mask上进行切割,并resize到28x28;而非用GT box切割。
论文阅读——Mask RCNN_第3张图片

因此Mask RCNN不仅需要对RPN找出的ROI进行分类和回归,还需要预测其mask。因此整个损失函数为 L = L c l s + L b o x + L m a s k L=L_{cls}+L_{box}+L_{mask} L=Lcls+Lbox+Lmask。前两个loss与Faster RCNN一样,mask的loss文中采用的BCE loss。这个mask分支采用了全卷积的思想,而非全连接;此外,作者将ROIPooling改成了ROIAlign,利于提高像素级分割的精度。ROIAlign的示意图如下:
论文阅读——Mask RCNN_第4张图片ROIPooling操作有两次取整,会对损失精度:(1)ROI切割特征图时,由于ROI坐标是浮点数,但是切割feature map时要转化成整数;(2)如果ROI是一个 5 ∗ 5 5*5 55的区域,那么如果将其Pooling到 2 ∗ 2 2*2 22的尺寸,在两个维度上会出现2和3(大小不等的分割),而不是均匀的2.5,这是第二部分的精度损失。鉴于此,ROIAlign采用双线性插值,即不需要对齐到整数格点。如图中的ROI要切成2x2区域,不需要事先的取整操作,而是首先均匀的将ROI分成2x2四个方格,在每个bin中取四个点,每个点根据feature map上临近的4个点的值做双线性插值求解。对于每个bin中的四个点做maxpooling,即可得到每个bin中切割后的feature。

当然Mask RCNN不仅仅用来做实例分割,还可以去掉mask分支用来做检测,甚至可以稍作改动用来做人体姿态检测等等。

参考:https://zhuanlan.zhihu.com/p/37998710

你可能感兴趣的:(深度学习,计算机视觉,实例分割)