目标检测与实例分割: Mask rcnn

mask rcnn 是何凯明团队在faster rcnn的基础上, 将目标检测与实例分割整合到一起的又一力作, 同时改进了faster RCNN 中 ROI pooling存在的 misalignment 问题.

主要创新点

  • faster RCNN 结合 instance segmentation
  • 提出 RoIAlign, 消除 ROI pooling 两次量化带来的RoI和提取的特征之间未对齐问题

网络结构

mask rcnn 网络结构如上图所示. 可以看做是用 ROIAlign 替换掉 ROI pooling 层的faster rcnn外接一个分割分支. 流程简述为:

  • 输入图片, 经过 CNN 网络得到 feature maps
  • RPN 网络在 feature maps 上进行 region proposal区域, 得到ROI
  • 对每一个有效的ROI, 通过 ROIAlign, 得到对应的特征, 分别进行分类、box 回归以及分割.

mask 预测分支

对于每一个 ROI, mask 分支输出为 $K * m * m$. 编码了 $K$ 个大小为 $m * m$ 的二值mask. 其中 $K$ 为类别数量.

与 FCN 不同的是, mask rcnn 分割分支将 mask 与 类别预测解耦. mask 分支的预测使用逐像素的 sigmoid, fcn 采用 softmax. 对每一个类都生成mask, 且类间没有竞争(当使用 softmax 激活时, 一个像素应该只属于$K$类中的一个, 某一类的概率大时,属于其它类的概率就小. 使用 sigmoid 时各个类别的概率是独立的).

mask loss 计算时只计算 gt 对应的mask的损失.

对于最终输出哪一个mask, 依赖于分类模块, ROI被分类模块分为哪一类, 就输出对应的mask. 网络输出的 mask 大小为 $m * m$, 最终会被resize 到ROI的大小, 以0.5 为阈值二值化.

RoIAlign

ROI pooling 被用来给每个 ROI 抽取固定大小的特征图. 但是由于其存在两次量化操作, 导致最终的特征与真实的ROI存在偏差ROI pooling量化存在的问题.

ROIAlign 采用的方式是取消了两次量化操作. 在每个 ROI bin的四个规则采样点位置处使用双线性插值法来计算该点的特征值, 然后对采样得到的四个值进行池化. 如下图所示:

其中, 虚线代表 feature map, 实线代表一个 ROI. 需要将任意大小 ROI 固定为 2 * 2 的特征图. 故 ROI 被划分为 2 * 2 个bins. 点代表每个 bin 内的四个固定位置的采样点(将每个bin 均分为4, 每一个的中心点即为采样点). RoIAlign通过双线性插值法从特征图上附近的网格点计算每个采样点的值, 即每个采样点的值根据它所在的网格的四个顶点的值来计算. 因此, 对于 ROI 没有进行任何量化操作.

双线性插值

如上图, 点 $P$ 为某个bin的固定采样点, 已知 $Q _{11}$,$Q _{12}$,$Q _{21}$,$Q _{22}$ 四个邻近网格点的激活值 $f(Q _*)$, 插值出点 $P$ 的值 $f(P)$.

记点的坐标分别为 $Q _{11} = (x_1, y_1), Q _{12} = (x_1, y_2), Q _{21} = (x_2, y_1), Q _{22} = (x_2, y_2), P=(x, y)$

首先在 $x$ 方向进行插值:

$$f(R _1) \approx \frac{x_2 - x}{x_2 -x_1} * f(Q _{11}) + \frac{x -x _1}{x_2 - x_1}* f(Q _{21}), R_1=(x,y_1)$$

$$f(R _2) \approx \frac{x_2 - x}{x_2 -x_1} * f(Q _{12}) + \frac{x -x _1}{x_2 - x_1}* f(Q _{22}), R_2=(x,y_2)$$

然后在 $y$ 方向进行插值:

$$f(P) \approx \frac{y_2 - x}{y_2 -y_1} * f(R _1) + \frac{y -y _1}{y_2 - y_1}* f(R _2)$$

若记 $Q _{11} = (0, 0), Q _{12} = (0, 1), Q _{21} = (1, 0), Q _{22} = (1, 1)$, 采样点 $P$ 的值便可算出.

ref