本篇文章观点仅限于目前的理解,后续若有新的理解,还会继续更新。
0. Introduce
Mask R-CNN是在Faster R-CNN的基础上进行的改进,可在同时完成目标定位和实例分割。
下图是Faster R-CNN的结构示意图:
Mask R-CNN在最后又添加了分支,该分支对每个RoI生成相应的二进制掩膜binary mask
,对每个RoI,该分支的输出为Km^2
,代表了K个m*m
的二进制掩膜,与另外两个分支的相对应。
RoI Pooling操作在Fast R-CNN中提出,但其中的量化操作会给实例分割带来一定的误差,作者提出了替代方案RoI Align。
本篇文章首先介绍RoI Poolig及RoI Align的原理,然后介绍Mask R-CNN的总体结构,包括mask分支的细节,最后给出作者的一些实验结果。
1. RoI Pooling & RoI Align
RoI Pooling
RoI Pooling操作过程中有两步量化操作:
- 由RPN网络得到的候选区域的位置为浮点数,需要量化为整数;
- 量化后所对应的候选区域会被平均分为k*k个单元(bin),需对每个单元的边长进行量化,之后可在每个单元内进行最大池化操作获得k*k的固定大小的输出;
经过两次量化后,此时的k*k候选框位置与RPN网络得到的最初的浮点结果(该浮点值对应原图中的一块区域)会有一定的偏差,在论文中,作者称之为misalignment
。
下面的例子可简单说明两次量化操作所造成的misalignmet(图片来源于ICCV17上何恺明演讲视频,油管可找到):
图像尺寸为800×800
,其中一个框的尺寸为665×665
,CNN网络的下采样倍数为32,则最终获得的feature map尺寸为25×25
,由于665/32=20.78
,所以此处框的位置被量化为20×20
;
该20×20
的区域需要被池化为7×7
的大小,因此平均分割该区域,由于20/7=2.86
,因此每个单元(bin)的边长又被量化为2,在每个2×2
的区域内执行最大池化最终得到7×7
特征图。
由于下采样倍数为32,所以在最终的特征图上,1个像素的偏差对应到原图则是32个,对小物体来讲,该偏差比较大。
RoI Align
作者提出了RoI Align来解决上述缺点。 如下图所示,RoI Align取消了量化操作,使用双线性内插的方法获得坐标为浮点数的像素点上的像数值:
下图是一个简单示例,橘红色部分表示边长为浮点数的候选区域,该候选区域被平均分为4个单元(bin),需要被池化为2×2
的特征图。
此时的操作是,在每个单元中计算固定的四个坐标的位置,并用双线性内插的方法计算出这四个位置的值,然后进行最大池化操作。
上述固定的四个坐标的位置
指的是在每个单元中的四个采样点,采样点位置为将每个单元平均分为四份后的中心点。
当然也可以仅采样一个点,此时该点可直接视为相应单元的中心点。作者通过实验发现,四个采样点时效果较好。
2. Network Architecture
为了证明该方法的通用性,作者使用了多种结构。 对卷积网络backbone:
- 使用50层和101层的ResNet和ResNeXt网络作为特征提取器,如使用ResNet-50的第四阶段最终卷积层的特征,表示为:ResNet-50-C4;
- 结合特征金字塔网络FPN,使用ResNet-FPN作为特征提取器;
对网络的分支head,如下图所示:
图中的RoI指的是经过RoI Align后获得的固定大小的特征图。
对ResNet-C4 backbone,对该特征图继续进行第五阶段的卷积res5
(这部分看一眼ResNet的结构即可明白),对Mask分支,在该卷积结果上进行一个全卷积操作获得14×14×80
的mask(COCO数据集80类);
对ResNet-FPN的操作如图所示,作者说这个更为高效(ResNet-FPN的网络结构??)
3. Experiments
Ablation experiments: 消融实验,若一篇文章中有n个亮点,则分别使用不同的点进行实验给出效果,相当于控制变量法。
下图是在MS COCO数据集上的测试结果,这里要说明的是,作者在trainval35k
上进行训练,在minival
上进行测试的结果。
在MS COCO2014数据集中,验证集的图片数量约为41k,这两个集合即为将验证集进行划分得到的,具体的信息可以从这里看到: