什么是 ROI
目标检测通常可以分为两个阶段:
- Region proposal:给定一张输入图片找出所有物体可能存在的所有位置。这一阶段的输出应该是一系列物体可能位置的 bounding box,这些通常就被称为region proposals或 者 regions of interest(ROI),在这一过程中用到的方法是selective search(Fast R-CNN)或 RPN (Faster R-CNN)
- Final classification:确定上一阶段的每个region proposal 是属于目标一类还是背景
什么是 ROI Pooling
顾名思义,ROI Pooling 是 Pooling 层的一种,而且是针对 RoIs 的 Pooling,它的特点是输入特征图尺寸不固定,但是输出特征图尺寸固定
ROI Pooling 的输入
输入有两部分组成:
- 从具有多个卷积核池化的深度网络中获得的固定大小的特征图
- 个表示所有 ROI 的 N?5N*5N?5 的矩阵,其中 NNN 表示ROI的数目,每个 ROI 有 5 个参数分别是 1 个 索引+ 4 个坐标
【注】坐标的参考系不是针对特征图的,而是针对原图
ROI Pooling 的具体操作
具体的操作过程如下:
- 根据输入图片,将 ROI 映射到特征图标对应位置;
- 将映射后的区域划分为相同大小的 sections(sections 的数量与输出的维度相同);
- 对每个 sections 进行 max pooling 操作。
【举个栗子】 ?(? ? ??)
假设我们有一个 8x8 的特征图和一个ROI,输出为 2x2
输入特征图
将 region proposal 投影到特征图上
将其划分为 2x2 个 sections(因为输出大小为2*2),于是得到
对每个section做max pooling,可以得到
整体过程如下 GIF
【注】在这个例子中 region proposals 是 5x7 的,在 pooling 之后需要得到 2x2 的,所以在5x7 的特征图划分成 2x2 的时候不是等分的,行是 5/2(取整) ,第一行得到2,剩下的那一行是3,列是 7/2 (取整),第一列得到3,剩下那一列是4。
ROI Pooling 存在的问题
从上面的分析可以看出来,候选框从原图坐标映射到的特征图坐标时,位置坐标可能存在浮点数,此时进行取整操作从而出现第一次量化;其次,在 ROI Pooling 求取每个小网格的位置时也同样存在浮点数取整的情况。这两次量化的结果都使得候选框的位置出现了偏差。
为了解决这个问题,于是有了下面的 ROI Align
ROI Align
RoI Align不再采用取整量化操作,如果计算得到小数,也就是没有落到真实的像素点上,那么就用最近像素点对这一点虚拟的像素点进行双线性插值,得到这个像素点的值。具体的过程步骤如下:
假设需要的输出为 2x2 :
- 先将ROI切分成 2x2 的单元格;
- 如果采样点数是4,将每个单元格子均分成四个小方格,以每个小方格的中心作为采样点;
- 对采样点像素进行双线性插值,得到该像素点的值;
- 对每个单元格内的 4 个采样点进行 max pooling,得到最终的 ROI Align 结果。
双线性插值
已知 Q12Q_12Q1?2,Q22Q_22Q2?2,Q11Q_11Q1?1,Q21Q_21Q2?1,但是要插值的点为 PPP,这时就要用双线性插值了,首先在 x 轴方向上,对 R1R_1R1? 和 R2R_2R2? 两个点进行插值,这个很简单,然后根据 R1R_1R1? 和 R2R_2R2? 对 PPP 点进行插值,这就是所谓的双线性插值。
首先在 x 方向进行线性插值,得到
然后在 y 方向进行线性插值,得到
这样就得到所要的结果 f(x,y)f \left( x, y \right)f(x,y)
Reference
- ROI Pooling层解析
- ROI Pooling原理及实现
- 【目标检测】RoI Pooling及其改进
- 双线性插值算法的详细总结