Press "Enter" to skip to content

Object Detection-Mask RCNN

本站内容均来自兴趣收集,如不慎侵害的您的相关权益,请留言告知,我们将尽快删除.谢谢.

论文链接: https://arxiv.org/pdf/1703.06870.pdf

图片来源【1】

图片来源【2】

Mask RCNN是实现物体实例分割(Object Instance Segmentation)的通用框架。它在Faster RCNN的基础上增加了一个预测物体Mask的分支,所以Mask RCNN不仅可以预测输入图像物体的Class、Bounding Box,而且还可以生成每个物体的Mask。

图片来源:https://arxiv.org/pdf/1703.06870.pdf

Mask RCNN与Faster RCNN一样采用了two-stage的网络结构。首先,它首先从图像生成Region Proposals;然后,它预测物体的分类,调整Bounding Box的位置,基于Proposals生成像素级的、二值的Object Mask。

 

为了更好地讲解Mask RCNN,我会先回顾一下几个部分:

 

 

    1. Faster RCNN

 

    1. ResNet-FPN

 

    1. ResNet-FPN + Fast RCNN

 

    1. ResNet-FPN + Fast RCNN + Mask

 

 

Faster RCNN

 

Faster RCNN的细节非常对,如果对Faster RCNN算法不熟悉,可以看看<一文读懂Faster RCNN>(https://zhuanlan.zhihu.com/p/31426458),这是我看过的解释得最清晰的文章。

图片来源【5】

ResNet-FPN

 

多尺度检测在目标检测中变得越来越重要,对小目标的检测尤其如此,Feature Pyramid Network(FPN)就是一种精心设计的多尺度检测方法。如下图所示,FPN结构中包括自下而上(Bottom-up pathway),自上而下(top-down pathway)和横向连接(lateral connections)三个部分。这种结构可以将各个层级的特征进行融合,使其同时具有强语义信息和强空间信息。

Feature Pyramid Networks for Object Detection,图片来源:https://arxiv.org/pdf/1612.03144.pdf

FPN实际上是一种通用架构,可以结合各种BackBone使用,比如VGG,ResNet等。

 

Mask RCNN中使用了ResNet-FPN网络结构,如下图:

图片来源【4】

自下而上(Bottom-up pathway)

 

自下到上过程就是特征提取(Feature Extraction)过程,它将ResNet作为backbone,根据Feature Map的大小分为5个stage。stage2,stage3,stage4和stage5各自最后一层输出conv2,conv3,conv4和conv5分别定义为[$C_2$,$C_3$,$C_4$,$C_5$],他们相对于原始图片的stride是{4,8,16,32}。需要注意的是,考虑到内存原因,stage1的conv1并没有使用。

 

自上而下(top-down pathway)

 

自上而下是从最高层开始进行上采样,这里的上采样直接使用的是最近邻上采样。不仅简单,而且可以减少训练参数。

 

横向连接(lateral connections)

 

横向连接则是将自下而上的上采样结果和自底向上生成的相同大小的Feature Map进行融合。

 

具体就是对[$C_2$,$C_3$,$C_4$,$C_5$]中的每一层经过一个1×1的卷积操作(1×1卷积用于降低通道数),无激活函数,输出通道全部设置为相同的256通道,然后和上采样的feature map进行加和操作。在融合之后还会再采用3*3的卷积核对已经融合的特征进行处理,目的是消除上采样的混叠效应(aliasing effect)。

 

实际上,上图少绘制了一个分支:M5经过步长为2的max pooling下采样得到 P6,作者指出使用P6是想得到更大的anchor尺度512×512。但P6是只用在 RPN中用来得到region proposal的,并不会作为后续Fast RCNN的输入。

 

总结一下,ResNet-FPN作为RPN输入的feature map是[$P_2$,$P_3$,$P_4$,$P_5$, $P_6$],而作为后续Fast RCNN的输入则是[$P_2$,$P_3$,$P_4$,$P_5$] 。

 

ResNet-FPN+Fast RCNN

图片来源【1】

相对于原始Faster RCNN只有一个Feature Map,FPN生成了生成了多个Feature Map金字塔 [$P_2$,$P_3$,$P_4$,$P_5$, $P_6$],这些Feature Map经过RPN之后会生成很多Region Proposal。

 

问题来了,我们要选择哪个Feature Map来切出ROI区域呢?实际上,我们会选择最合适的尺度的Feature Map来切ROI。具体来说,我们通过一个公式来决定宽w和高h的ROI到底要从哪个Feature Map来切:

 

$$k = k_0 + log_2(\sqrt{(wh)/224})$$

 

这里224表示用于预训练的ImageNet图片的大小。 $k_0$表示面积为w x h = 224 x 224的ROI所应该在的层级。作者将$k_0$设置为4,也就是说 224 x 224的ROI应该从$P_4$中切出来。假设ROI的scale小于224(比如说是112 * 112),$k = k_0 – 1 = 4 – 1 = 3$ ,就意味着要从更高分辨率的$P_3$中产生。另外,k值会做取整处理,防止结果不是整数。

 

这种做法很合理,大尺度的ROI要从低分辨率的feature map上切,有利于检测大目标,小尺度的ROI要从高分辨率的Feature Map上切,有利于检测小目标。

 

ResNet-FPN+Fast RCNN+Mask

图片来源【1】

图片来源:https://medium.com/@mrvturan96/mask-r-cnn-ile-glioma-segmentasyonu-5da71ebaeb18

Mask RCNN网络分为两个部分:

 

1.骨干网络ResNet-FPN,用于特征提取。ResNet可以是ResNet-50、ResNet-101、ResNeXt-50、ResNeXt-101;

 

2。头部网络,包括边界框识别(分类和回归) + mask预测。头部结构见下图:

图片来源:https://arxiv.org/pdf/1703.06870.pdf

损失函数

 

在训练过程中,我们针对每个ROI定义了多任务Loss函数(Multi-Task Loss):

 

$$

 

L = L_{cls} + L_{box} + L_{mask}

 

$$

 

$L_{cls}$和$L_{box}$与Faster RCNN相同。Mask分支针对每个ROI输出维度为k x m x m,对于ROI的每个点都会输出K个二值Mask(每个类别使用sigmoid输出)。

 

需要注意的是,计算loss的时候,并不是每个类别的sigmoid输出都计算二值交叉熵损失,而是该像素属于哪个类,哪个类的sigmoid输出才要计算损失。在测试的时候,我们是通过分类分支预测的类别来选择相应的mask预测,这样mask预测和分类预测就彻底解耦了。

 

这与FCN方法是不同,FCN是对每个像素进行多类别softmax分类,然后计算交叉熵损失,很明显,这种做法是会造成类间竞争的,而每个类别使用sigmoid输出并计算二值损失,可以避免类间竞争。

 

实验表明,这个方法对与提升实例分割(Instance Segmentation)的效果至关重要。

 

本文主要参考文章:<令人拍案称奇的Mask RCNN>(https://zhuanlan.zhihu.com/p/37998710)

 

参考材料

 

1.https://alittlepain833.medium.com/simple-understanding-of-mask-rcnn-134b5b330e95

 

2.https://github.com/matterport/Mask_RCNN

 

3.https://zhuanlan.zhihu.com/p/37998710

 

4.https://jonathan-hui.medium.com/what-do-we-learn-from-single-shot-object-detectors-ssd-yolo-fpn-focal-loss-3888677c5f4d

 

5.https://zhuanlan.zhihu.com/p/31426458

 

除非注明,否则均为[半杯茶的小酒杯]原创文章,转载必须以链接形式标明本文链接

Be First to Comment

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注