目标检测(Object detection)—— Mask RCNN

基于tensorflow实现的Mask RCNN源码
对上面源码的解读

1 概述

  • Mask RCNN实际上是个实例分割算法(instance segmentation),这里对它进行介绍的原因是Mask RCNN与faster RCNN算法密不可分,只是在faster RCNN的分类支路、边框回归支路之外,增加了一个实例分割支路。改动虽然简单,但是Mask RCNN实例分割的效果非常出众,令人赞叹。
  • 个人认为Mask RCNN的核心贡献有两点:①证明faster RCNN架构不仅仅局限于目标检测,对其稍加改进,就能应用于其它领域,并且可以取得非常不错的效果;②提出了ROI Align,用于取代ROI pooling,解决ROI pooling存在的近似问题。

2 Mask RCNN

  • 相比faster RCNN,Mask RCNN只是多了个Mask支路,因此这里只对Mask支路进行介绍,有关faster RCNN的内容此处不再赘述。

2.1 Mask支路(实例分割支路)

  • 特征提取网络得到的feature maps经过RPN网络后,得到ROI。对每个ROI,使用ROI Align pooling技术进行池化(下一小节会介绍)。再将池化后的特征进行若干次的卷积或反卷积操作,最后得到 k*m2 维度的输出。k为数据集的类别数,m2为每个mask的分辨率。
  • 训练阶段,Mask支路的损失如何定义呢?训练时,对某个ROI,自然有个类别,该ROI得到k个分辨率为m2的mask,对每个mask的每个像素,都进行一次sigmoid变换,将像素值变换至0-1之间的值,然后选择对应类别的mask与ROI对应ground truth的mask逐像素计算交叉熵损失,取平均值,作为该ROI的mask支路的loss,记为Lmask有两点值得注意:①只有正类ROI才会计算Lmask,网络总的loss值L=Lcls +Lbox +Lmask;②只计算ROI与ground truth相交部分的Lmask
  • Mask支路会为每个正类ROI得到k个二元分割mask,每个mask分别是第k类的实例分割结果,计算Lmask时,只计算该ROI分类支路得到的分类结果对应的mask。这不同于语义分割的典型做法:对得到的mask,逐点使用softmax,然后计算多分类交叉熵损失函数。实验证明,Mask RCNN的这种做法,可以显著提高实例分割效果。

2.2 ROI Align

  • 首先需要回答一个重要的问题:为什么要提出ROI Align?回忆典型faster RCNN结构:RPN网络在原图上得到ROI,然后将ROI映射到feature maps上,再对映射后的ROI区域进行ROI pooling操作,最后对池化后的特征分别完成分类和边框回归。在这一过程中,实际上发生了两次取整操作:①将原图上的ROI映射到feature maps上时,发生了一次取整操作:以VGG16为例,特征提取网络VGG16提取特征时进行了4次步长为2的池化操作,因而对一个ROI,最终在feature maps上映射出的尺寸是输入的十六分之一,如果计算出的值不是整数,则进行取整操作②对feature maps上的ROI区域进行池化时,若ROI区域的尺寸不能被池化数整除,也会进行取整操作。例如,对feature maps上20x20的ROI区域,进行7x7的ROI pooling操作时,每个方格的大小为2.86x2.86,取整为2x2。这两次取整操作的示意图如下:

目标检测(Object detection)—— Mask RCNN_第1张图片

上图有点问题:VGG16经过4次池化操作会将输入图像的尺寸缩小至原来的十六分之一,而不是三十二分之一

  • faster RCNN的分类支路和边框回归支路都会对池化后的特征进行全连接操作,将池化后的特征进一步变换成一个一维向量,因此这两条支路对于整个过程两次取整带来的误差并不十分敏感。但是用于实例分割的Mask支路就不是这样了。实例分割需要得到可以如实反映目标形状的mask,上图中这种进行两次取整操作的方式显然不适用于Mask支路。试想,对原图上665x665的ROI,在feature maps上对应的ROI区域尺寸被取整为41x41,再经过7x7的ROI pooling池化时,每个方格的大小被池化为5x5。由5x5反推,对应的ROI区域为35x35,因而对应的输入ROI的尺寸应该是560x560,与原始ROI比较,相差巨大。
  • ROI Align意在避免这两次取整操作,如何避免呢?分为三步:①设输入图像上的ROI的左上角坐标、长、宽分别为X、Y、W、H,输入图像上的ROI缩小至原来的十六分之一时不取整,保留浮点数形式的坐标和长宽;②再进行7x7的池化操作,这时候计算出的每个方格的长宽也保留浮点数形式;③对每个方格,将其均分为4份,每份都利用双线性插值取得中间位置的值,取四个值中的最大值作为该方格池化后的值。示意图如下:

目标检测(Object detection)—— Mask RCNN_第2张图片
点击这里理解双线性插值

2.3 网络结构

  • 骨干网络结构(backbone):ResNet、ResNeXt、ResNet+FPN
  • Mask分支网络结构(head):如下图所示
    目标检测(Object detection)—— Mask RCNN_第3张图片

2.4 网络实现细节

2.4.1 训练

  • 与ground truth的IOU大于0.5的ROI视为正类样本,其它视为负类样本
  • 只对正类样本计算Lmass,只计算正类样本与ground truth重叠区域的Lmass
  • resize图像,使其较短边为800像素
  • 一个mini-batch中图片的数量为2 images per GPU,每张图有N个ROI,正负样本比例为1:3,对ResNet C4骨干网络,N=64,对ResNet+FPN骨干网络,N=512
  • 作者在实验中采用8GPU进行训练,共训练160k个iteration,前120k个iteration学习率为0.02,后40k个iteration学习率为0.002,weight decay为0.0001,momentum为0.9
  • RPN网络产生5种scales、3种ratios的anchor

2.4.2 推理

  • ResNet C4骨干网络对置信度最大的前300个anchor进行推理,FPN骨干网络对置信度最大的前1000个anchor进行推理,预测出bbox后,再应用NMS算法。Mask分支对预测出的前100个bbox进行处理,预测出分辨率为mxm的浮点数mask后,resize到对应ROI的大小,再以0.5的阈值进行二值化

3 实验

论文里常常将所做的实验称为"ablation experiment",我对这个词的理解是“控制变量的实验”

  • 所有实验均使用COCO数据集
  • 评价标准有:①AP(averaged over IOU thresholds);②AP50,AP75;③APS,APM,APL(AP at different scales)

3.1 Mask RCNN在COCO数据集上的表现

目标检测(Object detection)—— Mask RCNN_第4张图片

3.2 Ablation experiment

  • 不同骨干网络对性能的影响,得到的结论:更深的网络带来更好的性能;FPN技术和ResNeXt也会提升性能

目标检测(Object detection)—— Mask RCNN_第5张图片

  • 将mask的预测和类别预测分离是否真的有效?结论:相比将二者结合起来,分离带来了5.5AP的提升

目标检测(Object detection)—— Mask RCNN_第6张图片

  • ROI Align的有效性,结论:相比ROI pooling,带来3 AP的提高,在IOU75时提升最最大

目标检测(Object detection)—— Mask RCNN_第7张图片
目标检测(Object detection)—— Mask RCNN_第8张图片

  • mask分支采用全卷积结构的有效性,与多层感知机(MLP)对比

目标检测(Object detection)—— Mask RCNN_第9张图片

  • Mask RCNN在目标检测的表现

目标检测(Object detection)—— Mask RCNN_第10张图片

你可能感兴趣的:(实例分割)