motivation:主流的 two stage 检测方法中的 ROI pooling 存在量化误差(misalignment),这个误差会影响检测的精度。为克服这一问题提出 mask rcnn

ROI pooling 局限性
常见 two stage 检测算法中,ROI pooling 的作用是根据 proposal box 的位置坐标在特征图中将相应区域池化为固定尺寸的特征图,以便进行后续的分类和回归训练。但是 proposal box 的位置通常是通过模型(RPN)回归得到的,通常表现为浮点数的形式,而池化后的特征图需要尺寸统一。这个 pipeline 就存在两次量化过程。
- 将 proposal box 的坐标值整型化
- 将量化后的边界区域平均分割成 k*k 个 bin,对每一个单元的边界进行量化
实际上,经过两次量化。当前的 box 已经跟最初 proposal 的 box 已经存在了一定的偏差,这个偏差对检测的精度有很大的影响,论文中称之为“misalignment”
RoIAlign
为了解决 ROI pooling 的历史遗留问题,作者提出了 ROIAlign:取消量化操作,使用双线性内插的方法获得坐标为浮点数的像素点上的图像数值,从而将整个特征聚集过程转化为一个连续的操作。思路清晰,但四两拨千斤,在 instance segmentation 任务上提升不少。

假设我们有一个 128×128 的图像,25×25 的特征图,想要找出与原始图像左上角 15×15 位置对应的特征区域,怎么在特征图上选取像素?

我们知道原始图像的每一个像素与特征图上的 25/128 个像素对应。为了在原始图像选取 15 个像素,在特征图上我们需要选择 15 * 25/128 ~= 2.93 个像素。对于这种情形,RoIPool 会舍去零头选择两个像素,导致 misalignment 问题。但在 RoIAlign 中直接使用双线性插值(bilinear interpolation)准确获得 2.93 像素位置的信息。在 mask 生成之后,Mask R-CNN 把它们与 Faster R-CNN 的分类、选框结合起来,生成相当精确的分割。detection 对于这样的误差不是特别敏感,但是 segmentation 是基于单个像素的,对于这种像素级别的误差非常敏感,因此RoI Align 对于 segmentation 非常有用。

mask prediction & class prediction
该框架对每个类别独立地预测一个二值 mask,没有引入类间竞争,每个二值 mask 的类别依靠网络 RoI classification branch 给出的分类预测结果。这与 FCNs 不同,FCNs 是对每个像素进行多类别分类,它同时进行分类和分割,基于实验结果表明这样对于对象实例分割会得到一个较差的性能。
在训练阶段,作者对于每个采样的 RoI 定义一个多任务损失函数L= Lcls + Lbox+Lmask ,前两项不过多介绍。mask branch 对于每个RoI 会有一个 Km*m 维度的输出,它编码了 K 个分辨率为 m×m 的二值掩模,分别对应着 K 个类别。因此作者利用了 per-pixel sigmoid,并且定义 Lmask 为平均二值交叉熵损失(the average binary cross-entropy loss)。对于一个属于第 k 个类的 RoI,Lmask 仅仅考虑第 k 个 mask(其他的 mask 输入不会贡献到损失函数中)。这样的定义会允许对每个类别都会生成掩模,并且不会存在类间竞争。一个 mask 编码了一个输入对象的空间布局。作者使用了一个 FCN 来对每个 RoI 预测一个 m×m 的掩模,这保留了空间结构信息。