Mask RCNN笔记

Mask RCNN

 

 

一、核心要点

(1)RoIAlign

mask rcnn的关键 一是RoIAlign,是将RoIPooling的插值方式,从最近邻插值(INTER_NEAREST)方式变为双线性插值。

这里复习一下关于RoI,RoIPooling的知识

RoI是Region of Interests 特征图上感兴趣的区域(“框”)

RoIPooling的过程是将一个个大小不同的box框,都映射成固定大小(w*h)的矩形框

具体操作是:先把RoI中的坐标映射到feature map上,得到feature map上的坐标后,使用Pooling得到输出,在Pooling过程中需要计算Pooling后的结果对应到feature map上所占的范围,然后在那个范围中进行取max或average操作。使用RoIPooling会在RoI和extracted features之间对应位置产生偏移(introduce misalignments)。

所以使用RoIAlign 来解决这个问题。

论文中还和RoIWarp(J. Dai, K. He, and J. Sun. Instance-aware semantic segmentation via multi-task network cascades. In CVPR, 2016. 2, 3,4, 5, 6 )进行了比较,实验结果表明RoIAlign的效果要好于 RoIWarp。

(2)实例分割同检测并行进行

 

尝试了两种不同的faster rcnn的结构,ResNet C4和FPN结构。

从图中可以看到,ResNet C4共享RoI层,而FPN是两个任务分开做RoI。

mask Loss 只定义在了正例的RoIs上。

 

在该文章中RPN和 mask分支,训练时,不共享特征;对于前边的特征提取,RPN和mask共享基础网络结构。

 

(3)使用FCN对RoI进行实例分割

  使用FCN对RoI生成的每一个mask进行pixel2pixel的预测。mask编码了输入目标的空间分布。

 

(4)类间无竞争的Lmask

对于每个RoI,其loss定义为L=Lcls +Lbox + Lmask

Lcls为分类损失,Lbox为bounding box回归,Lmask为实例分割损失

 生成k个m*m的mask,Lmask只定义在 k-th mask上对于一个具体为k类的gt,其他mask对loss没有贡献,这样类间就没有竞争。

对每一个像素使用sigmod,然后取RoI上所有像素的交叉熵的平均值,作为Lmask,

反向传播的时候,Loss只对gt那一类进行计算和反向传播,有效的避免了类别竞争,也使得分割和分类解耦(之前的FCN,是针对每一个像素进行softmax输出,然后计算交叉熵)

 

实验

实验一

Instance Segmentation

  •  说明 Mask RCNN效果好, ResNeXt-FPN网络的表达能力最好

 

实验二 剥离实验分析

表二(a) Backbone Architecture实验说明,ResNeXt-101-FPN的效果要最好

表二(b)说明计算loss时,使用sigmod要好于FCN的softmax

表二(c、d)说明RoIAlign的效果要好于RoIPool和RoIWarp

表二(e)说用使用FCN进行分割的效果要好于MLP(多层感知机)

 

 

 

实验三 目标检测

实验四 关键点检测

 

 

实验五 cityscapes 上的效果

 

posted @ 2018-04-26 20:53  unicoe  阅读(2949)  评论(0编辑  收藏  举报