mask rcnn

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

Adding a branch for predicting segmentation masks on each Region of Interest (RoI), in parallel with the existing branch for classification and bounding box regression

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 非常有用。

main architecture. backbone can be either FPN or resNet.

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 的掩模,这保留了空间结构信息。

Share this to:

发表评论

电子邮件地址不会被公开。 必填项已用*标注