roi pooling, roi align等区别

Roi-pooling的问题:

roi-pooling的输入是proposal的坐标,这些坐标由RPN计算得到,因为经过一次回归,所以跟原图上的proposal对应映射到feature map上是一个浮点数的坐标。可想而知,整个feature就是一叠矩阵,矩阵的下标不都是整数吗。所以映射过来的浮点数坐标要被向下取整,缩小为整数区域。如下图所示:可以明显的看到量化后的差异。
在这里插入图片描述

这还没到roi-pooling的步骤,只是获取Proposal对应的特征图。Roi-Pooling进行量化,如下图
在这里插入图片描述

这是一个hw=89的目标特征块,然后非要分成3x3,这样有一个边就不能整除,所以计算的时候roi-pooling再次量化如下
在这里插入图片描述

这下刚好够分了。但一个roi-pooling一共产生了两次量化误差。

Roi-Align的解决办法:

两次量化其实都是因为映射后坐标是浮点数,而特征值只在整数坐标上有。所以要量化。
Align两次都不量化,浮点数坐标就浮点数坐标吧。反正我只是计算,我又不按这个坐标去取feature map上的数值(浮点数的坐标在feature map上是没有值的)。
然后把浮点数坐标当成一个范围,范围的大小为浮点坐标 向上取整,得到两个整数坐标,画出一个规整的框,这个框里的所有特征都要用于计算roi-pooling。其实向上取整就能保证目标特征块不被缩小了,但这样引入了噪声呢。这个范围映射回原图对应的框应该是大于rpn得到的proposal的。引入了背景噪声。
所以计算的时候,用双线性插值,使得原图上任意一个浮点坐标,都将会有值。现在解决浮点坐标的取值问题了。然后怎么修改roi-pooling呢?计算roi-pooling在上图中分隔开的每一个小bin(一共3x3个,红线分出来的)的中心点,因为边界时浮点数,所以每一个中心点都时浮点数,然后用双线性插值得到这个浮点坐标的特征值。作为rop-pooling的结果。9个Bin格,9个中心点,9个特征值。ok,同样满足输入固定的要求,但是量化误差大大减小。
上面的例子为什么要取中心点?其实不一定要取中心点。作者在原文中发现,每一个Bin,划分为4个mini bin,计算每一个mini bin,上面的中心点对应的特征值。如下图所示:
在这里插入图片描述

就相当于每一个bin 得到一个2x2的矩阵,你可以取最大池化或者平均池化,把这四个数值像对特征图一样进行pooling,使得每一个Bin得到一个值,最后还是9个bin,得到固定输出3x3。
同样,你也可以取5、6、7、8、9个点,每一个浮点坐标因为双线性插值的缘故,都有取值。

猜你喜欢

转载自blog.csdn.net/poppyty/article/details/129319286
ROI