ROI Pooling和ROI Align

这两个问题一直不求甚解,今天又遇到了,是时候把它解决了
参考https://www.cnblogs.com/wangyong/p/8523814.html
https://blog.****.net/yychentracy/article/details/100172729
看了一些博客,好多都没讲清楚,直接就一个bin取四个点然后取最大值,都没说这个bin是怎么来的,为什么要取最大值,这篇博客讲得就比较清楚,我在这里按自己的理解再梳理一遍


ROI Pooling

为什么要做这个?
答:再得到proposal后,要将proposal扣出来,进行分类和回归
此时由于anchor有不同大小,前面也做了一次回归,所以proposal肯定是大小不统一的,为了统一proposal的大小,对现有proposal采样,使得采样后统一到一个尺寸
ROI Pooling和ROI Align
比如将上述proposal统一到2*2的大小,那么只需要将其平均分成4份,然后每份(每个bin)做max_pooling或者avg_pooling,这样每份(bin)得到一个值,变为2*2
ROI Pooling和ROI Align
问题
(1)第一次量化(就是把小数位去掉):中心点的位置坐标
比如上图是5*7的roi,5/2=2.5,ROI_Pooling直接取2
(2)第二次量化:roi的宽、高
因为anchor的宽、高是在原图上取的(纳尼?为啥我记得anchor是feature map上一个点映射到原图,然后宽高也映射到原图呢?),映射到feature map要除以stride,这时也会有小数,直接量化掉。
这样两次量化就会有框的误差,对大目标不明显,对小目标这点误差影响就比较大了

ROI Align

为了解决ROI_Pooling的误差问题,提出了ROI_Align
1 首先,直接计算出中心点坐标,四个角点坐标,不舍弃小数,途中圆圈为实际存在的像素位置
ROI Pooling和ROI Align
2 分块做max_pooling或者avg_pooling
比如分成7*7的块(bin),做完pooling后得到7*7的结果,相当于每块(bin)给出一个值,而这里是用另外一种方法代替标准的pooling,即用另外一种方法对每个bin进行采样
2.1 假定采样点为4(即每个bin取4个点,求最大值)

Note:之所以说不是标准的max_pooling是因为标准的是每个像素点都参与计算,取最大值,而这里直接定采样点,也就是说相当于固定只有4个点参与计算取最大值

这4个点也是直接暴力计算出的,不舍弃小数点,那么每个bin中的这4个点很可能也不在一个具体的位置上
2.2 对于每个采样点,用双线性插值法取值
ROI Pooling和ROI Align
图中为一个bin,红叉代表4个采样点的位置,有色格子的中心代表该像素的位置,这里红叉的值为离采样点最近的4个像素点双线性插值法取值
eg. 左上角的值为0.85、0.34、0.32、0.74这4个值用双线性插值法求得
2.3 对于每个bin中的4个采样点,取最大值或者平均值
2.4 于是最终每个bin求得了一个值,得到了7*7的结果

补充:双线性插值法

ROI Pooling和ROI Align
已知四个红点,求绿点
(1)用单线性插值法分别求出R_2,R_1
(2)利用R_1,R_2用单线性插值法求出P
ROI Pooling和ROI Align
ROI Pooling和ROI Align