0%

RoI Pooling, RoI Align, PS-RoI Pooling

1. RoI

RoI(Region of Interest), 从原图中通过某些区域选择方法得到的候选区域。

量化(quantization)是指将输入连续值(或者大量可能的离散值)采样为有限多个离散值的过程。或者理解为,将输入数据集(如实数)约束到离散集(如整数)的过程。

RoI Pooling 和 RoI Align 均是将任意大小的特征图(输入),映射为固定尺寸的特征(输出)。

2. RoI Pooling

image-20220106102835274

RoI Pooling的作用本质上是为了将不同尺寸的RoI特征转换为相同的特征图输出,保证特征图展开(flatten)后具有相同的大小尺寸,能够与下层的全连接层连接,分别执行线性分类(linear classifier)和边框回归(bounding box regressor)

  • 1 将RoI 对齐到特征图的网格单元(snap to grid cell)

    首先将特征图上的浮点数RoI(举例 : 665 665 —> 665/32=20.78 —> 20.78 20.78 —> 20 20)进行量化。下图中绿色框为RoI对应的实际区域(*由于经过特征尺度变换,导致RoI的坐标会可能会落到特征图的单元之间), 蓝色框代表量化(网格对齐)后的RoI所对应的特征图。

image-20220106103613312

image-20220106105319288

  • 2 划分网格为子区域

    将上一步得到的量化RoI 特征进一步细分为量化的空间单元(bin)。为了得到输出的特征图为 2 2 512 ,这里的量化操作就是将上一步的到量化特征图划分为2 2个特征单元。如果无法通过直接均分得到量化的子区域,通过分别采取向上取整(ceil)和向下取整(floor)的到对应的单元尺寸大小。以当前 4 5 尺寸的特征图为例,对于宽度方向 4 / 2 = 2, 对于高度方向 5 / 2 = 2.5), 通过向上和向下取整整,确定高度方向特征子区域的大小分别为2和3。

image-20220106110344846

  • 3 子区域最大池化

在每一个子区域执行聚合操作得到单元的特征值(一般是最大池化)。对上一步得到的 2 2个子区域分别做最大池化操作,得到 2 2 * 512的目标特征图。

缺陷

每一次量化操作都会对应着轻微的区域特征错位(misaligned), 这些量化操作在RoI和提取到的特征之间引入了偏差。这些量化可能不会影响对分类任务,但它对预测像素精度掩模有很大的负面影响。

3. RoI Align

RoI Align在Mask RCNN中被首次提出,是针对RoI Pooling 在语义分割等精细度任务中的精确度的问题提出的改进方案。

  • 1 遍历候选每个候选区域,保持浮点数边界不做量化(不对齐网格单元);同时平均分网格分为 2 * 2个子网格区域,每个单元的边界也不做量化。

image-20220106110933568

  • 2 对于每个区域选择4个规则采样点(分别对应将区域进一步平均分为四个区域,取每个子区域的中点)。

    image-20220106111115211

  • 3 利用双线性插值计算得到四个采用点的像素值大小。下图为一个规则采样点所对应的邻近区域示意图。

image-20220106111143717

  • 4 利用最大池化(max pooling)或平均池化(average pooling)分别对每个子区域执行聚合操作,得到最终的特征图。

image-20220106111213485

下图 绿色表示ROI区域额外信息, 蓝色(第一次量化)和天蓝色(第二次量化)表示丢失信息

image-20220106112934397

4. PS-RoI Pooling

位置敏感池化,RFCN引入位置敏感池化,主要基于以下两方面原因

  1. 引入位置敏感,卷积可以保持位置信息,但是经过全连接后,位置信息不在保留。
  2. 对于region-based方法,通常会分为几个sub-network, 一是提取图像特征的主干网络,与region无关,各region共享,计算量大。二是生成候选区域的RPN网络,三是用来分类和回归的prediction网络, 每个region会单独执行这部分sub-network。而RFCN将计算量大卷积尽可能地移到共享的主干网络中,最后仅使用一层卷积做prediction,减少了计算量。

为了实现位置敏感就提出PS-ROI Pooling,核心思想是position sensitive score map。
把位置信息以层的形式就组成position sensitive score maps,进行一次卷积就计算了多个ROI的最终输出(固定长度)。

image-20220106135532044

  • 首先,在共享特征图之后添加1 1 k^2(c+1)维的卷积形成位置敏感特征图,然后在位置敏感特征图上进行PS-RoI Pooling。 k^2代表的是RoI中划分的位置区域数目。比如k=3, 即代表上左(左上角),上中,上右,中左,中中,中右,下左,下中,下右(右下角)共9个子区域。 c+1 代表所有类别加上背景。 k^2(c+1)张特征图每c+1张分成一组,共包含k^2组,每一组负责其对应区域的响应,如上图所示。
  • 然后进行PS-RoI Pooling,对位置敏感特征图上的RoI区域划分子区域(k^2), 每个对应位置(c+1)内进行全局平均池化, 最后获得一组(c+1)* k^2的投票矩阵。
  • 最后,每个类对应有9个位置的投票值,这9个值求和,就是这个类的概率。

5. RoI Align的反向传播

和ROI Pooling核心思想是一样的,但是在ROI Align中,i ∗ ( r , j )是一个浮点数的坐标位置(前向传播时计算出来的采样点),在池化前的特征图中,每一个与 i ∗ ( r , j ) 横纵坐标均小于1的点都应该接受与此对应的点y(r,j)回传的梯度,故ROI Align 的反向传播公式如下:
image-20220106142854108

上式中,d(.)表示两点之间的距离,Δ h 和Δ w 表示 i 与 i ∗ ( r , j )横纵坐标的差值,这里作为双线性内插的系数乘在原始的梯度上。

6 . Reference

  1. https://zhuanlan.zhihu.com/p/161540817
  2. https://cloud.tencent.com/developer/article/1689064