RoI Pooling 与 RoI Align 的原理

人工智能与算法视频云

目录

  • 什么是 Region of Interest
  • RoI Pooling 的工作原理
  • RoI Pooling 的缺点
  • RoI Align 的工作原理

什么是 Region of Interest

Region of Interest 是 RoI Pooling 处理的对象,对 Faster R-CNN 是 RPN 部分输出的建议区域(Proposal Area)。如下图,建议区域并不都是我们想要的对象,里面也可能包含没有我们想要的对象的区域以及不完整对象的区域,如图中绿色的 Box。

picture.image 图1:Region of Interest

图中的建议区域如图呈现出不同大小不同比例,怎么样放入网络进行处理?最简单的方式就像R-CNN一样单个传入网络,但是这样会加大计算代价。

怎么处理呢?解决方案是借鉴 SPP Net,SPP Net 在卷积结构后加入一个结构使输出的结构进行统一,这个结构就是 RoI Pooling,在 Faster R-CNN 中是对接在 RPN 结构之后,使 RPN 结构形成统一的输出,在论文中给出的输出尺寸 。

picture.image 图2:RoI Pooling 在 Faster R-CNN 中的位置

RoI Pooling 的工作原理

下面举个例子来看看 RoI Pooling 是如何工作的,下面一张图是在 RoI Pooling 的资料中常见的一个经典的示例,下方的 的矩阵是 Backbone 输出的特征图,黑色框是 RPN 输出的 Proposal Area。

Proposal Area 在特征图的坐标是(左上角坐标)(右下角坐标),目标是得到 的输出,如何能得到 的输出呢?(这里指的是任意尺寸缩小到想到的尺寸,例子中是 到 )

picture.image 图3:RoI Pooling 例子

前面解释了 RoI(Region of Interest) 的含义,Pooling 是缩小的意思,采用最大池化或者平均池化来取值,以上图为例,如图 4 所示,这里可以看到 4 个区域的形状并不一样,这是因为 "Proposal Area" 的形状并不能很好的整除,只能采取这种“不公平”的分配方式。以 Max Pooling 为例,得到下面的结果。这是单个通道的流程示意,对于多通道的数据,逐通道计算。

picture.image 图4:ROI Pooling 例子

RoI Pooling 的缺点

在上面的 RoI Pooling 的工作流程中,存在 2 个“近似”。

首先第一个近似是特征图上的 Anchor,它其实是映射到原图像中的,Anchor 中的坐标也是原图中的坐标,在 ROI Pooling 处理 Proposal Area(筛选后的 Anchor)是在特征图上的,所以需要将 Anchor 映射回特征图。

从特征图映射回原图时,计算出步距,根据步距计算得到原图坐标,现在从原图到特征图的过程类似,原图坐标除以步距得到特征图坐标。如图 5 所示。

picture.image 图5:原图映射回特征图

左图中 Anchor 中心点坐标为 ,宽度 ,高度 ,步距 。原图坐标除以步距得到特征图坐标,坐标为(9.25, 6)

坐标在映射回特征图时向下取整,不要小看这零点几的差距,这是经过 32 倍缩小的结果,在原图上可能进行了二三十个像素的偏移。相对于原图中的 Proposal Area,会产生出额外的区域以及丢失一些区域,如图 6 所示。图中蓝色部分是相对于原本 Proposal Area 多出来的部分,绿色是缺失的部分。

picture.image 图6:原图映射回特征图示意

第二个近似是在“切割”的时候做近似,当 RoI 不能被整好的切分的时候需要对取整的区域进行些取整,如图 7 所示,平均的切分结果在 cell 的中间,所以需要分成不相等的几块在做 Pooling。

picture.image 图7:ROI 切割示意图

RoI Align 的工作原理

原理

针对 RoI Pooling 的以上问题,RoI Align 是对这些问题进行改进。RoI Align 和 RoI Pooling 的作用相同,都是使不同输入得到相同尺寸的输出。总体的步骤也相似,只是在 2 个步骤不太一样。

在原图中的坐标映射回特征图的过程不再用取整操作了,就是用计算出来的小数坐标,RoI Align 在这一步不做取整操作,保留映射回特征图的 Anchor “最原始”的状态,如图 8。

picture.image 图8:RoI Align

在下面的取值过程,这里希望输出得到 的结构,如图 9 中绿色部分。

picture.image 图9:RoI Align

下面需要对每个绿色区域取值,可以看到每个绿色区域里的大部分特征点(表格的每个 cell 表示一个特征点)都不完全存在,需要进行采样,采样可以理解成找点,论文中推荐是使用采样点为4个,如图 10 所示。

picture.image 图10:采样示意图

对于每个采样点,都可以找到坐标,如图 10 所示,有了采样点,在采样点中做 Max Pooling(或是 Average Pooling),得到每个绿色格子中的值,每个绿色格子做同样的操作得到最终输出(例子中是对单个通道的输出处理,对于多通道输出,逐个计算每个通道的值)。

现在剩下的问题是采样点的值如何取,如果正好落在特征图上的特征点上很好说,直接取值就好,但是如果如图 10 并不是整数的坐标该如何呢?使用的是插值的方式,双线性插值,如图 11 论文中的介绍。

picture.image 图11:RoI Align 双线性插值

双线性插值(Bilinear Interpolation)

双线性插值不是 RoI Align 独用的,是一种最常用的插值方式,是最均衡的插值方式,常用在对图片进行 Resize。在图像进行 Resize 之后,同样面临着找到对应的点的问题,这个过程和特征图到原图以及原图到特征图的过程特别的相似。

单线性插值

说双线性插值之前需要先说下单线性插值,已知中 点和 点,坐标分别为 、,要计算 区间内某一位置 在直线上的 值。根据初中的知识,2 点求一条直线公式(这是双线性插值所需要的唯一的基础公式)。

经过简单整理成下面的格式:

这里没有写成经典的 的形式,因为这种形式从权重的角度更好理解。首先看分子,分子可以看成 与 和 的距离作为权重,这也是很好理解的, 点与 、 点符合线性变化关系,所以 离 近就更接近 ,反之则更接近 现在再把公式中的分式看成一个整体,原式可以理解成 与 是加权系数,如何理解这个加权,要返回来思考一下,咱们先要明确一下根本的目的:咱们现在不是在求一个公式,而是在图像中根据 2 个点的像素值求未知点的像素值。这样一个公式是不满足咱们写代码的要求的。现在根据实际的目的理解,就很好理解这个加权了, 与 分别代表原图像中的像素值,上面的公式可以写成如下形式:

picture.image 图12: 单线性插值

双线性插值

如图 13,已知 ,求其中点 的值。

picture.image 图13 双线性插值

双线性插值是分别在两个方向计算了共 3 次单线性插值,如图所示,先在 方向求 2 次单线性插值,获得 、 两个临时点,再在 方向计算 1 次单线性插值得出 (实际上调换 2 次轴的方向先 后 也是一样的结果)。

  1. 方向单线性插值,直接带入前一步单线性插值最后的公式:

picture.image

  1. 方向单线性插值

picture.image

将第一步结果带入第二步:

在双线性插值计算中有这样的关系 和 ,那么上面的公式中的分母全都为 1,如下所示。

今天详细介绍了 RoI Pooling 与 RoI Align 的工作原理,祝大家有所进步!

0
0
0
0
关于作者
关于作者

文章

0

获赞

0

收藏

0

相关资源
字节跳动客户端性能优化最佳实践
在用户日益增长、需求不断迭代的背景下,如何保证 APP 发布的稳定性和用户良好的使用体验?本次分享将结合字节跳动内部应用的实践案例,介绍应用性能优化的更多方向,以及 APM 团队对应用性能监控建设的探索和思考。
相关产品
评论
未登录
看完啦,登录分享一下感受吧~
暂无评论