Mask_RCNN是何凯明基于以往的faster-rcnn构架提出的新的卷积网络,该方法再有效的目标的同时完成了高质量的语义分割。主要思路就是把原有的faster-rcnn进行扩展,添加一个分支使用现有的检测对目标进行并行预测,可以很方便的应用其他的应用领域,向目标检测,分割和人物关键点检测等。其网络结构如下。

目标检测算法-Mask-RCNN

 

目标检测算法-Mask-RCNN

Mask-RCNN是在faster-RCNN的基础上添加了一个预测分割mask分支,将ROIPooling替换成了ROIAlign层添加了并列的FCN层(mask层)。

为什么替换ROIPooling层?

因为ROIPooling操作中两次量化回造成区域不匹配。比如,在在faster-rcnn框架中,输入一张800×800的图片,图片上有一个665×665的包围框,图片经过主干网络提取特征后,特征图缩放步长为32,因此,图像和包围框的边长都是输入时的1/32,800正好被32整除,但是665除以32以后为20.78,于是ROIPooling直接将它量化成20,接下来需要把框内的特征池化为7×7的大小,因此将上述包围框平均分成7×7个矩形,显然每个矩形的边长为2.86,于是ROIPooling再次将它量化到2,候选区域已经出现了明显的偏差,更终要的是,该特征图上0.1像素的偏差缩放到原图就是3.2个像素,那么0.8的偏差,在原图上就是接近30个像素的差别。

在此之前先引入线性插值。

线性插值

已知数据 目标检测算法-Mask-RCNN 与 目标检测算法-Mask-RCNN ,要计算 目标检测算法-Mask-RCNN 区间内某一位置 目标检测算法-Mask-RCNN 在直线上的 目标检测算法-Mask-RCNN 值,如下图所示。

目标检测算法-Mask-RCNN

计算方法很简单,通过斜率相等就可以构建y和x之间的关系,如下:
目标检测算法-Mask-RCNN
仔细看就是用 目标检测算法-Mask-RCNN 和 目标检测算法-Mask-RCNN , 目标检测算法-Mask-RCNN 的距离作为一个权重(除以 目标检测算法-Mask-RCNN 是归一化的作用),用于 目标检测算法-Mask-RCNN 和 目标检测算法-Mask-RCNN 的加权。这个思想很重要,因为知道了这个思想,理解双线性插值就非常简单了。

双线性插值。

双线性插值本质上就是在两个方向上做线性插值。

目标检测算法-Mask-RCNN

 

 

如图,假设我们想得到P点的插值,我们可以先在x方向上,对 目标检测算法-Mask-RCNN 和 目标检测算法-Mask-RCNN 之间做线性插值得到 目标检测算法-Mask-RCNN , 目标检测算法-Mask-RCNN 同理可得。然后在y方向上对 目标检测算法-Mask-RCNN 和 目标检测算法-Mask-RCNN 进行线性插值就可以得到最终的P。其实知道这个就已经理解了双线性插值的意思了,如果用公式表达则如下(注意 目标检测算法-Mask-RCNN 前面的系数看成权重就很好理解了)。

首先在 x 方向进行线性插值,得到

目标检测算法-Mask-RCNN

 

 目标检测算法-Mask-RCNN

然后在 y 方向进行线性插值,得到

目标检测算法-Mask-RCNN


这样就得到所要的结果 目标检测算法-Mask-RCNN


目标检测算法-Mask-RCNN

 

所以ROIAlign中去掉了ROIPooling过程中所有的量化过程,包括从原图proposal到最后一层feature map映射,以及把feature map划分成m×m的bin过程的量化。

目标检测算法-Mask-RCNN

 

 为了得到固定大小的feature map,ROIAlign技术并没有使用量化操作,既不引入量化误差。这里使用双线性插值来解决,利用双线性插值来估计这些蓝色点的像素值,然后在每一个网格内进行max pooling或average pooling操作,得到2×2的输出结果。整个过程中没有用到量化操作,没有引入误差,即原图中的像素和feature map中的像素是完全对齐的,没有偏差。

什么是mask分支

目标检测算法-Mask-RCNN

mask分支本质上是一个FCN网络,FCN采用反卷积层对最后一个卷积层得到的特征图进行上采样,对于每一个ROI,mask分支定义一个k×m×m的矩阵,表示k个不同的分类对于每一个m×m的区域,对于每一个类都有一个,对于每一个像素都使用sigmoid函数进行求相对熵,得到平局相对熵误差Lmask,对于每一个ROI如果检测得到的ROI属于哪一个类,就只使用哪一个分支的相对熵作为误差值进行计算,这样的定义使得我们的网络不需要去区分每一个像素属于哪一个类,只需要去区分在这个类当中的不同分别小类。这里要注意,在完成目标检测后用回归后哦的box取feature map上截取后,在经过ROIAlign后在进行mask。