RoiPooling, RoiAlign 和 RoIWarp

本文最后更新于:2022年8月17日 上午

Roi 特征处理过程中会遇到需要变换为固定尺寸的情形,本文介绍 Roi 特征池化方法。

RoI

**RoI(Region of Interest)**是从原始图像或特征中提取的区域。

  • 对于 $H \times W \times C$ 的特征

  • 一般地,取 Bbox $ [X_{min}, Y_{min}, X_{max}, Y_{max}]$,这四个坐标 可以不为整数

  • 当需要将上述 Bbox 框定的特征变化为 $h \times w \times C$ 时就需要 Roi 的 Pooling 操作

RoiPooling

  • 假设 feature map 上原始的 RoI 如下所示,左上角坐标(9.25, 6):

  • RoiPooling 会对 bbox 取整,得到 $[9, 6, 15, 10]$,宽 6 ,高 4,都是量化取整的结果,这样会多引入部分额外数据 (绿色),也可能丢失数据 (蓝色)

  • 经过 bbox 量化我们得到了整数范围的 bbox,假设我们需要 pooling 的目标尺寸为 $3 \times 3$

  • 对于不能整除的情况,则会再次量化,舍弃部分像素,以最大池化为例

数据池化处理过程

  • 这个过程是在整个RoI 矩阵上完成的,而不仅仅是在最顶层。所以最终的结果是这样的:

  • 因此总体来说 RoiPooling 过程会对原始 Roi 有些处理:

  • bbox 量化多出的数据是绿色的,深蓝是过程中丢失的数据,浅蓝色是Pooling 量化中丢失的数据

RoIAlign

  • RoiPooling 过程量化导致信息偏差,RoIAlign 不再对数据进行量化、不再取整,就带着小数硬算,实在取不着的值就线性插值,得到的结果会细腻合理一些。

  • 还是考虑上文的情形,将原始RoI分成9个等大小的小格子,并在每个盒子内应用双线性插值。

  • 目标为 $3 \times 3$ 的池化层,所以我们必须将映射的RoI ( 6.25x4.53) 除以3。这样我们就得到了一个高为 1.51 ,宽为 2.08 的方框。

  • 划分成 $3 \times 3$ 范围:

  • 对于每个格子,取其中 1/3 位置的四个点,通过线性插值计算出值:

  • 依据这四个值可以计算 Avgpooling 或 Maxpooling

  • 计算获得的特征更加细腻平滑

RoIWarp

  • RoIWarp 是将 RoI 进行了量化(就像 RoiPooling一样),之后再对数据进行插值(就像 RoiAlign 一样)。

  • 数据丢失/额外数据:

效果

  • Mask R-CNN 有比较几种 Pooling 方式的效果:

参考资料


RoiPooling, RoiAlign 和 RoIWarp
https://www.zywvvd.com/notes/study/deep-learning/layer/roi-pooling/roi-pooling/
作者
Yiwei Zhang
发布于
2022年8月16日
许可协议