目标检测网络之 Mask R-CNN

Mask R-CNN

论文Mask R-CNN(ICCV 2017, Kaiming He,Georgia Gkioxari,Piotr Dollár,Ross Girshick, arXiv:1703.06870)
这篇论文提出了一个概念简单,灵活,通用的目标实例分割框架,能够同时检测目标并进行实例分割.在原Faster R-CNN基础上添加了object mask分支与原目标检测任务分支并列.速度大约5 fps.另外,Mask R-CNN也很容易扩展到其它的任务,比如人体姿态评估.

原Faster R-CNN输出两类值:class label和bounding-box offset.Mask R-CNN加入一路object mask分支输出.object mask要求比前两个具有更精细的空间布局特征.mask分支作用于Fast R-CNN,而RPN保持不变.
多任务损失定义为: L = Lcls+ Lbox+ Lmask.
Lcls+ Lbox保持不变,mask分支输出K个二值mask矩阵(每个像素经过sigmoid,限制到(0,1)区间,使用阈值0.5二值化),Lmask定义为平均交叉熵损失(average binary cross-entropy loss).这种Lmask定义方式与FCN等语义分割网络的损失定义有所不同.FCN使用per-pixel softmax 和 multinomial cross-entropy loss,会在类间产生竞争.

与FCN一样,采用转置卷积产生和原图中ROI大小相同的mask图.由于是像素到像素的映射,所以原来的fc层的特征向量的形式不能够被使用,并且RoIPool层缺失一些特征空间对应关系.因此作者提出了RoIPool层的改进版RoIAlign层.

RoIAlign

RoIPooling将大小不同的RoI对应的特征图划分为7×7的bins,每个bin采用max pooling,这样每个RoI都得到了相同尺度的特征.由于RoI对应到特征图上的区域时对坐标值做除法并取整([x/16]),并且划分7x7网格时也有除法操作.如果不能整除,带来不对齐的问题. 比如由于量化操作将2.4量化为2,那么这0.4的偏差放大到输入原图大小, 如放大32倍,那么偏差变为12.8像素. 偏差较大,对小目标的检测不利.
论文提出的RoIAlign避免了对RoI边界的处理,采用了双线性差值(采用Spatial transformer networks中的方法)计算每个RoI bin中若干个采样点(相比于RoIPooling,这里的采样点是浮点型)的特征值. 浮点型的采样点像素值的计算通过与该点最近邻的四个整数点的像素值差值得到.距离越近的值贡献越高,如下图所示:

roi-align

线性差值与双线性差值

线性差值: 已知数据 (x0, y0) 与 (x1, y1),要计算 [x0, x1] 区间内某一位置 x 在直线上的 y 值:

\[\begin{equation} \frac{y - y_0}{x - x_0} = \frac{y_1 - y_0}{x_1 - x_0} \\ y = \frac{x_1 - x}{x_1 - x_0}y_0 +\frac{x - x_0}{x_1 - x_0}y_1 \end{equation} \]

双线性插值: 相继在x和y两个方向上做线性差值. 如下图所示, 先在x方向上插值得到R1, R2, 再由R1, R2在y方向上插值得到点P的结果:

双线性插值

如果选择一个坐标系统使得 f 的四个已知点坐标分别为 (0, 0)、(0, 1)、(1, 0) 和 (1, 1),那么插值公式就可以化简为

\({\displaystyle f(x,y)\approx f(0,0)\,(1-x)(1-y)+f(1,0)\,x(1-y)+f(0,1)\,(1-x)y+f(1,1)xy}\)

实验结果也表明RoIAlign可以提高COCO数据集上的准确率,而在VOC上提升不明显,而COCO包含较多的小目标. 因此 RoIAlign 在COCO数据集上的提升比较明显,见下表:

RoIAlign

作者与之前采用的RoIWarp方法(Instance-aware semantic segmen-
tation via multi-task network cascades. CVPR2016)做了对比.
RoIWarp是在RoIPool基础上用双线性差值,与RoIPool同样存在不对齐的问题,与RoIAlign的结果对比表明align在其中起到关键作用.

RoIAlign-compare

ROI Align 反向传播:

反向传播: ROI Pooling与max pooling类似,只在选择的点上进行梯度回传.

\[\frac{\partial L}{\partial x_i}=\sum_r\sum_j [i=i^*(r,j)]\frac{\partial L}{\partial y_{rj}} \]

\(x_i\) 代表池化前特征图上的像素点; \(y_{rj}\) 代表池化后的第r个候选区域的第j个点; \(i^*(r,j)\) 代表点 \(y_{rj}\) 像素值的来源.

ROI Align 中特征图上的像素点 \(i^*(r,j)\)被选择作为池化结果的计算时用到了相邻的若干个点(论文取4个点),因此梯度反向传播如下:

\[{\partial L\over \partial x_i}=\sum_r\sum_j [d(i,i^*(r,j))<1](1-\Delta h)(1-\Delta w){\partial L\over \partial y_{rj}} \]

Inference测试阶段

测试时只计算top-100的目标框对应的mask,每个目标框对应K个类别的mask.将目标框的分类类别(置信度最大的)对应的mask作为最终的结果. mask分支仅加重了原网络~20%的计算量.

mask-rcnn

在COCO数据集上的检测结果对比:

mask-rcnn-obj-det

可以看出,仅替换RoIPool就在FPN的结果上提高了1%,使用Mask分支后又提高了约1%,加入Mask分支使检测任务的结果得以提升的原因可能是因为分割任务的训练使特征提取更好,毕竟数据集标签中多了mask这种更加详细的像素类别信息.

应用分析

制作mask标记可能比较费时费力,如果不需要实例分割功能的话,我们可以不使用mask分支,仅使用其提出的RoIAlign方法对原网络进行提升.

参考:

posted @ 2018-06-11 11:10  康行天下  阅读(3688)  评论(0编辑  收藏  举报