论文:Mask R-CNN
作者:Kaiming He Georgia Gkioxari Piotr Doll´ar Ross Girshick
链接:https://arxiv.org/abs/1703.06870
代码:https://github.com/facebookresearch/Detectron
R-CNN系列其他文章:
- R-CNN算法解读
- SPPNet算法解读
- Fast R-CNN算法解读
- Faster R-CNN算法解读
目录
- 1、算法概述
- 2、Mask R-CNN细节
- 2.1 Mask Representation
- 2.2 RoI Align
- 3、实验结果
- 4、创新点
1、算法概述
该论文主要实现的是把图片中的目标一个一个的分割出来,也叫实例分割;是在Faster R-CNN的基础上增加了一个预测实例目标掩模的分支。该算法在COCO 2016竞赛的三大任务(实例分割、目标检测、关键点预测)中都获得了单模型最好的成绩。
如上图所示,(d)即为实例分割,实例分割是具有挑战性的,因为它需要正确检测图像中的所有对象,同时还要精确分割每个实例。因此,它结合了对单个对象进行分类和使用边界框对每个对象进行定位。
2、Mask R-CNN细节
如上图所示,Mask R-CNN就是在Faster R-CNN的基础上增加一个mask分支,但是额外的掩码输出与原本的class和box输出不同,需要提取对象的更精细的空间布局,包括需要学习像素级对齐。对于每个RoI,Mask R-CNN在预测类别和box偏置的同时,还会输出二进制掩码。
在训练阶段,也采用多任务损失:L=Lcls+Lbox+Lmask
2.1 Mask Representation
Mask分支以RoI的特征图作为输入完成mask编码学习,它不像类别分类和box偏移以压缩形式的全连接作为输入,因为它需要以卷积的形式学习像素到像素的对应关系。Mask R-CNN的mask分支是一个FCN结构,对于每个RoI特征输入,输出大小为mxm大小的mask,若类别为K,则输出为Kmxm,对于每类(对应一个mxm大小的feature map)都在每个像素应用sigmoid操作用来评估是否属于该类。
由于mask分支为FCN结构,所以能让分支上的每一层都保持对应的空间结构,这就要求RoI特征和输入图像的特征在空间位置上要保存对应关系,不能有空间上的偏移,这促使作者改进Faster R-CNN的RoI Pooling层为RoI Align。
2.2 RoI Align
RoI Pooling是从每个RoI中提取小特征图(例如7x7)的标准操作。在Faster R-CNN中,使用RoI Pooling之前的特征图大小是原图的1/16,假设某个RoI区域在原图位置上的横坐标范围是x0到x1,纵坐标范围是y0到y1,那么这个RoI区域在经过一系列卷积后,在RoI Pooling的输入特征图上的横坐标范围应为x0/16到x1/16,纵坐标范围应为y0/16到y1/16。但是RoI Pooling操作做了取整操作,即RoI在特征图上的位置变为了[x0/16] 到[x1/16]和[y0/16]到[y1/16],这里的取整操作反映到原图上就发生了位置偏移,造成了RoI区域在空间位置上没有对齐,这可能对分类不会有太大影响,但是对应mask学习,影响太大了。所以作者没有采用RoI Pooling,而且采用了RoI Align,它没有取整操作,而且对相应位置做了双线性插值,以保证位置前后对齐。
3、实验结果
作者以ResNet50,ResNet101和ResNeXt50,ResNeXt101作为backbone,假如Faster R-CNN采用ResNet50并以第4个stage的输出作为RoI的特征就命名为ResNet-50-C4,实验在COCO数据集上进行统计,实例分割结果如下:
目标检测的结果如下:
关键点检测结果如下:
4、创新点
- 创新点:
1、在Faster R-CNN的基础上新增mask分支,对bounding box回归有相互促进的效果;
2、提出RoI Align操作,纠正了RoI Pooling在特征图上的取值偏移,使得检测分支和mask分支在特征图上的RoI区域和原图的RoI区域在空间位置上对齐;