Mask RCNN主要用来做实例分割,那首先什么是实例分割呢?实例分割相当于目标检测和语义分割的结合体,语义分割只能将不同类别的物体分割出来,但加入一张image中有若干个person,那么语义分割区分不出每一个人。而实例分割可以在每个instance的检测框的基础上,分割出每一个实例。
Mask RCNN的基础是Faster RCNN。首先简单的回顾一下Faster RCNN,作为一个two-stage的检测方法,首先经过backbone和RPN网络,提取出若干region proposal;然后再喂入Fast RCNN中进行最终的ROI分类和回归。具体的细节可以参照:一文读懂Faster RCNN
Mask RCNN首先对Faster RCNN论文中的backbone进行改进,采取了一个Resnet+FPN的结构,可以提取多尺度的特征,并在不同尺度的feature map上选出ROI,对大目标和小目标的精度都更加有利。其backbone结构如下:
通过这种top-down的金字塔结构,我们就可以得到P2-P5这四张不同scale的特征图,当然还有P5下采样后的P6。在M2-M5之后又经历了一个 3 ∗ 3 3*3 3∗3的卷积,其目的是消除混叠效应。其中在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=