1. 前言
文章标题给出了四种Pooling的方法,这feature pooling方法是我在看论文的时候看到的,从最开的PoI Pooling到目前最新的Precise RoI Pooling由Pooling操作带来的检测精度影响越来越小。这篇文章目的是想梳理一下它们之间的区别与联系。
2. RoI Pooling
这种Pooling方法我是在Faster RCNN中看到的,该种Pooling方法采用的运算方法比较直接。下面是其计算的流程图:
在该网络中假设使用的骨架网络中的
,且测试图像中的一个边界框的大小为
。
1)首先计算对应feature map上图的大小,那么在特征图上的大小就是
,注意这个时候出现小数了。那么就需要对其进行第一次量化操作,得到的特征图上大小为
。
2)得到Pooling结果。最后的RoI Pooling的输出是固定的为
,那么就要对这个特征图进行划分,那么划分出来的每一块的大小就是
。-_-||,小数又来了,那么取整吧,这是第二次量化操作,块的区域就变成了
,然后再在这个区域上做max pooling得到最后的结果。
所以很大的误差是来自于量化过程,量化误差不断积累就变得很大了。
3. RoIWrap Pooling
该Pooling方法比前面提到的Pooling方法稍微好一些。该方法出现在Instance-aware Semantic Segmentation via Multi-task Network Cascades中。对于一个选出来的预测框,它的对应的RoI区域可以通过
算出来(crop操作),如下图所示:
那么该方法与上一个方法的区别是什么呢?主要的区别在于第二步。还是用上面提到的例子:在该网络中假设使用的骨架网络中的
,且测试图像中的一个边界框的大小为
。
1)corp操作。边界框在对应feature map上的大小为
,注意这个时候出现小数了。那么就需要像之前的方法一样对其进行第一次量化操作,得到的特征图上大小为
。
2)warp操作。这里使用的是双线性差值算法,使corp操作的特征图变化到固定的尺度上去,比如
,这样再去做Pooling得到固定的输出。这里的坐标就是连续的了,不会存在量化误差。
可以看出这里去掉了第二次的量化操作,进而减小了误差,也提升了检测的精度。
4. RoIAlign Pooling
这种Pooling方法是在Mask RCNN中被采用的,这相比之前的方法其内部完全去掉了量化操作,取而代之的线性操作,使得网络特征图中的点都是连续的。从而提升了检测的精确度。
那么它具体是怎么搞的呢?还是用之前的例子来看看吧。在该网络中假设使用的骨架网络中的
,且测试图像中的一个边界框的大小为
。
1)得到对应feature map中对应的区域。这里可以算出对应的区域大小为
,这个通过双线性差值计算的得到。这就是这一部分的结果了,不会对其进行量化操作。
2)得到Pooling结果。假设Pooling的固定输出为
,那么每个块得到的大小是
。对于这样的一个块,假设在其中选择
个采样点,那么每个采样点的值也是可以通过双线性差值得到,这样也是连续的。
因而相比前面的两个算法,其内部实现并没有存在量化的操作,也就没有因为量化而带来的误差。这就使得其检测精确度进一步提升。具体的差别有多大呢?可以看一下Mask RCNN中给出的实验数据。
5. Precise RoI Pooling
这里的这个方法就更厉害了,其第一步与前面一种方法一样通过双线性运算得到。区别就是第二步了,在上一个方法中使用的是采样的方式得到最后的结果,这里使用积分取均值实现