RoI Pooling与RoIWrap Pooling与RoIAlign Pooling与Precise RoI Pooling

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/m_buddy/article/details/85110124

1. 前言

文章标题给出了四种Pooling的方法,这feature pooling方法是我在看论文的时候看到的,从最开的PoI Pooling到目前最新的Precise RoI Pooling由Pooling操作带来的检测精度影响越来越小。这篇文章目的是想梳理一下它们之间的区别与联系。

2. RoI Pooling

这种Pooling方法我是在Faster RCNN中看到的,该种Pooling方法采用的运算方法比较直接。下面是其计算的流程图:
在这里插入图片描述
在该网络中假设使用的骨架网络中的 f e a t s t r i d e = 16 feat_stride=16 ,且测试图像中的一个边界框的大小为 400 300 400*300
1)首先计算对应feature map上图的大小,那么在特征图上的大小就是 200 / 16 150 / 16 = 25 18.75 200/16*150/16=25*18.75 ,注意这个时候出现小数了。那么就需要对其进行第一次量化操作,得到的特征图上大小为 25 18 25*18
2)得到Pooling结果。最后的RoI Pooling的输出是固定的为 7 7 7*7 ,那么就要对这个特征图进行划分,那么划分出来的每一块的大小就是 25 / 7 18 / 7 = 3.57 2.57 25/7*18/7=3.57*2.57 。-_-||,小数又来了,那么取整吧,这是第二次量化操作,块的区域就变成了 3 2 3*2 ,然后再在这个区域上做max pooling得到最后的结果。
所以很大的误差是来自于量化过程,量化误差不断积累就变得很大了。

3. RoIWrap Pooling

该Pooling方法比前面提到的Pooling方法稍微好一些。该方法出现在Instance-aware Semantic Segmentation via Multi-task Network Cascades中。对于一个选出来的预测框,它的对应的RoI区域可以通过 f e a t s t r i d e feat_stride 算出来(crop操作),如下图所示:
在这里插入图片描述
那么该方法与上一个方法的区别是什么呢?主要的区别在于第二步。还是用上面提到的例子:在该网络中假设使用的骨架网络中的 f e a t s t r i d e = 16 feat_stride=16 ,且测试图像中的一个边界框的大小为 400 300 400*300
1)corp操作。边界框在对应feature map上的大小为 200 / 16 150 / 16 = 25 18.75 200/16*150/16=25*18.75 ,注意这个时候出现小数了。那么就需要像之前的方法一样对其进行第一次量化操作,得到的特征图上大小为 25 18 25*18
2)warp操作。这里使用的是双线性差值算法,使corp操作的特征图变化到固定的尺度上去,比如 14 14 14*14 ,这样再去做Pooling得到固定的输出。这里的坐标就是连续的了,不会存在量化误差。
可以看出这里去掉了第二次的量化操作,进而减小了误差,也提升了检测的精度。

4. RoIAlign Pooling

这种Pooling方法是在Mask RCNN中被采用的,这相比之前的方法其内部完全去掉了量化操作,取而代之的线性操作,使得网络特征图中的点都是连续的。从而提升了检测的精确度。
在这里插入图片描述
那么它具体是怎么搞的呢?还是用之前的例子来看看吧。在该网络中假设使用的骨架网络中的 f e a t s t r i d e = 16 feat_stride=16 ,且测试图像中的一个边界框的大小为 400 300 400*300
1)得到对应feature map中对应的区域。这里可以算出对应的区域大小为 200 / 16 150 / 16 = 25 18.75 200/16*150/16=25*18.75 ,这个通过双线性差值计算的得到。这就是这一部分的结果了,不会对其进行量化操作。
2)得到Pooling结果。假设Pooling的固定输出为 7 7 7*7 ,那么每个块得到的大小是 25 / 7 18.75 / 7 = 3.57 2.65 25/7*18.75/7=3.57*2.65 。对于这样的一个块,假设在其中选择 2 2 2*2 个采样点,那么每个采样点的值也是可以通过双线性差值得到,这样也是连续的。
因而相比前面的两个算法,其内部实现并没有存在量化的操作,也就没有因为量化而带来的误差。这就使得其检测精确度进一步提升。具体的差别有多大呢?可以看一下Mask RCNN中给出的实验数据。
在这里插入图片描述

5. Precise RoI Pooling

在这里插入图片描述
这里的这个方法就更厉害了,其第一步与前面一种方法一样通过双线性运算得到。区别就是第二步了,在上一个方法中使用的是采样的方式得到最后的结果,这里使用积分取均值实现
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/m_buddy/article/details/85110124