论文下载:
https://arxiv.org/pdf/1703.06870.pdf
论文代码:
https://github.com/facebookresearch/Detectron
论文摘要:
本文提出了一个概念简单、灵活和通用的对象实例分割框架,有效地检测图像中的对象,同时为每个实例生成高质量的分割掩码。这个框架称为Mask R-CNN,由Faster R-CNN扩展,通过增加一个分支来预测一个对象掩模,并与现有的分支来识别边框。Mask R-CNN很容易训练,并且只在Faster R-CNN上增加了很小的开销,运行速度为5帧每秒。此外,Mask R-CNN很容易推广到其他任务,例如,在相同的框架下可以估计人类姿态。
ROIAlign:
ROIPooling则是把任意大小的特征图提取成固定大小的特征,所以避免不了ROI区域长宽不能整除的情况。如下图的ROI区域需要划分为2×2的特征,长宽不能整除2,所以会划分四个区域进行Pooling。
图像转换为矩阵输入到网络,因为像素是整数,所以特征的长宽的值为整数。目标检测数据集的标签文件的框的坐标通常是小数(浮点数),提取ROI区域的时候,为了方便Pooling操作,会将标注的坐标进行取整操作。
在Faster RCNN进行ROIPooling的时候,进行两次整数化(量化,quantizes)的过程。
进行整数化之后标注框的坐标,即检测框的位置相对于原标签会有误差,即论文中作者提到的ROIPooling后候选框与标注框的“不对准”(misalignment)问题。
所以本作者通过取消整数化操作,利用双线性插值计算出候选框像素点的值。
虚线代表特征层,长宽单位为整数。实现表示ROI区域,即2×2的单元格。每个单元格有四个采样点,这四个采样点的坐标是浮点数,所以与标注框的浮点数坐标相对应。每个采样点的值由它所在的网格四个点的值进行双线性插值计算得到(如图四个箭头)。
最后每个单元格里面的四个采样点进行max,得到最终maxpooling的结果。
相关实验中,采样点的个数设为4的性能最佳。
不匹配问题对于目标检测效果无太大影响,但是对于实力分割影响很大。
LOSS函数:
总的损失函数有三部分组成,也就是三个分支的loss组成。其中的Lmask为K个类别的sigmoid,也就是二进制交叉熵损失,并且计算损失时并不是每个类别的sigmoid输出都要计算,该像素属于哪个类,哪个类的sigmoid输出才计算。
整体架构:
进行ROIAlign后延伸三条分支分别进行分类、标注、分割(图中的class box包含两个分支)
实验结果:
Mask R-CNN在COCO测试集上的结果:
在COCO test-dev上的实例分段掩码:
FCIS+++(上)vs. Mask R-CNN(下,ResNet-101-FPN):
backbone架构,多分类与二分类损失,ROIPoling和ROIAlign精度的对比:
对象检测单模型结果(边界框AP), vs. test-dev上的最先进水平: