目录
- 什么是 Region of Interest
- RoI Pooling 的工作原理
- RoI Pooling 的缺点
- RoI Align 的工作原理
什么是 Region of Interest
Region of Interest 是 RoI Pooling 处理的对象,对 Faster R-CNN 是 RPN 部分输出的建议区域(Proposal Area)。如下图,建议区域并不都是我们想要的对象,里面也可能包含没有我们想要的对象的区域以及不完整对象的区域,如图中绿色的 Box。
图1:Region of Interest
图中的建议区域如图呈现出不同大小不同比例,怎么样放入网络进行处理?最简单的方式就像R-CNN一样单个传入网络,但是这样会加大计算代价。
怎么处理呢?解决方案是借鉴 SPP Net,SPP Net 在卷积结构后加入一个结构使输出的结构进行统一,这个结构就是 RoI Pooling,在 Faster R-CNN 中是对接在 RPN 结构之后,使 RPN 结构形成统一的输出,在论文中给出的输出尺寸 。
图2:RoI Pooling 在 Faster R-CNN 中的位置
RoI Pooling 的工作原理
下面举个例子来看看 RoI Pooling 是如何工作的,下面一张图是在 RoI Pooling 的资料中常见的一个经典的示例,下方的 的矩阵是 Backbone 输出的特征图,黑色框是 RPN 输出的 Proposal Area。
Proposal Area 在特征图的坐标是(左上角坐标)(右下角坐标),目标是得到 的输出,如何能得到 的输出呢?(这里指的是任意尺寸缩小到想到的尺寸,例子中是 到 )
图3:RoI Pooling 例子
前面解释了 RoI(Region of Interest) 的含义,Pooling 是缩小的意思,采用最大池化或者平均池化来取值,以上图为例,如图 4 所示,这里可以看到 4 个区域的形状并不一样,这是因为 "Proposal Area" 的形状并不能很好的整除,只能采取这种“不公平”的分配方式。以 Max Pooling 为例,得到下面的结果。这是单个通道的流程示意,对于多通道的数据,逐通道计算。
图4:ROI Pooling 例子
RoI Pooling 的缺点
在上面的 RoI Pooling 的工作流程中,存在 2 个“近似”。
首先第一个近似是特征图上的 Anchor,它其实是映射到原图像中的,Anchor 中的坐标也是原图中的坐标,在 ROI Pooling 处理 Proposal Area(筛选后的 Anchor)是在特征图上的,所以需要将 Anchor 映射回特征图。
从特征图映射回原图时,计算出步距,根据步距计算得到原图坐标,现在从原图到特征图的过程类似,原图坐标除以步距得到特征图坐标。如图 5 所示。
图5:原图映射回特征图
左图中 Anchor 中心点坐标为 ,宽度 ,高度 ,步距 。原图坐标除以步距得到特征图坐标,坐标为(9.25, 6)
坐标在映射回特征图时向下取整,不要小看这零点几的差距,这是经过 32 倍缩小的结果,在原图上可能进行了二三十个像素的偏移。相对于原图中的 Proposal Area,会产生出额外的区域以及丢失一些区域,如图 6 所示。图中蓝色部分是相对于原本 Proposal Area 多出来的部分,绿色是缺失的部分。
图6:原图映射回特征图示意
第二个近似是在“切割”的时候做近似,当 RoI 不能被整好的切分的时候需要对取整的区域进行些取整,如图 7 所示,平均的切分结果在 cell 的中间,所以需要分成不相等的几块在做 Pooling。
图7:ROI 切割示意图
RoI Align 的工作原理
原理
针对 RoI Pooling 的以上问题,RoI Align 是对这些问题进行改进。RoI Align 和 RoI Pooling 的作用相同,都是使不同输入得到相同尺寸的输出。总体的步骤也相似,只是在 2 个步骤不太一样。
在原图中的坐标映射回特征图的过程不再用取整操作了,就是用计算出来的小数坐标,RoI Align 在这一步不做取整操作,保留映射回特征图的 Anchor “最原始”的状态,如图 8。
图8:RoI Align
在下面的取值过程,这里希望输出得到 的结构,如图 9 中绿色部分。
图9:RoI Align
下面需要对每个绿色区域取值,可以看到每个绿色区域里的大部分特征点(表格的每个 cell 表示一个特征点)都不完全存在,需要进行采样,采样可以理解成找点,论文中推荐是使用采样点为4个,如图 10 所示。
图10:采样示意图
对于每个采样点,都可以找到坐标,如图 10 所示,有了采样点,在采样点中做 Max Pooling(或是 Average Pooling),得到每个绿色格子中的值,每个绿色格子做同样的操作得到最终输出(例子中是对单个通道的输出处理,对于多通道输出,逐个计算每个通道的值)。
现在剩下的问题是采样点的值如何取,如果正好落在特征图上的特征点上很好说,直接取值就好,但是如果如图 10 并不是整数的坐标该如何呢?使用的是插值的方式,双线性插值,如图 11 论文中的介绍。
图11:RoI Align 双线性插值
双线性插值(Bilinear Interpolation)
双线性插值不是 RoI Align 独用的,是一种最常用的插值方式,是最均衡的插值方式,常用在对图片进行 Resize。在图像进行 Resize 之后,同样面临着找到对应的点的问题,这个过程和特征图到原图以及原图到特征图的过程特别的相似。
单线性插值
说双线性插值之前需要先说下单线性插值,已知中 点和 点,坐标分别为 、,要计算 区间内某一位置 在直线上的 值。根据初中的知识,2 点求一条直线公式(这是双线性插值所需要的唯一的基础公式)。
经过简单整理成下面的格式:
这里没有写成经典的 的形式,因为这种形式从权重的角度更好理解。首先看分子,分子可以看成 与 和 的距离作为权重,这也是很好理解的, 点与 、 点符合线性变化关系,所以 离 近就更接近 ,反之则更接近 现在再把公式中的分式看成一个整体,原式可以理解成 与 是加权系数,如何理解这个加权,要返回来思考一下,咱们先要明确一下根本的目的:咱们现在不是在求一个公式,而是在图像中根据 2 个点的像素值求未知点的像素值。这样一个公式是不满足咱们写代码的要求的。现在根据实际的目的理解,就很好理解这个加权了, 与 分别代表原图像中的像素值,上面的公式可以写成如下形式:
图12: 单线性插值
双线性插值
如图 13,已知 ,求其中点 的值。
图13 双线性插值
双线性插值是分别在两个方向计算了共 3 次单线性插值,如图所示,先在 方向求 2 次单线性插值,获得 、 两个临时点,再在 方向计算 1 次单线性插值得出 (实际上调换 2 次轴的方向先 后 也是一样的结果)。
- 方向单线性插值,直接带入前一步单线性插值最后的公式:
- 方向单线性插值
将第一步结果带入第二步:
在双线性插值计算中有这样的关系 和 ,那么上面的公式中的分母全都为 1,如下所示。
今天详细介绍了 RoI Pooling 与 RoI Align 的工作原理,祝大家有所进步!