SPPNet、roi pooling 和 average pooling之间的区别,都是起到对任意大小的输入产生固定的输出的作用。其中SPPNet、roi pooling是一样的。
下面对ROI Pooling 进行详解:
- ROI是Region of Interest的简写,指的是在“特征图上的框”;
- POOling是一个池化操作。
可以再了解一下这个概念【region proposal】:
给定一张输入image找出objects可能存在的所有位置。这一阶段的输出应该是一系列object可能位置的bounding box。这些通常称之为region proposals或者 regions of interest(ROI)。
ROI Pooling的输入
输入有两部分组成:
- 特征图:通过神经网络的特征图feature map;
- rois:在Fast RCNN中,指的是Selective Search的输出;在Faster RCNN中指的是RPN的输出,一堆矩形候选框框,size为[1x5x1x1](4个坐标+索引index),其中值得注意的是:坐标的参考系不是针对feature map这张图的,而是针对原图的(神经网络最开始的输入)左上角和右下角坐标。
ROI Pooling的输出
输出是batch个vector,其中batch的值等于RoI的个数,vector的大小为channel * w * h;RoI Pooling的过程就是将一个个大小不同的box矩形框,都映射成大小固定(w * h)的矩形框。
ROI pooling具体操作
- 根据输入image,将ROI映射到feature map对应位置;
- 将映射后的区域划分为相同大小的sections(sections数量与输出的维度相同);
- 对每个sections进行max pooling操作。
下面拿官网的图来举个栗子吧~假设我们要对一个8*8大小的feature map进行ROI pooling操作,其1含有一个ROI,需要输出大小为2*2.
- 输入的feature map 如下
- region proposal 投影之后位置(左上角,右下角坐标):(0,3),(7,8)。
我们先把roi中的坐标映射到feature map上,映射规则比较简单,就是把各个坐标除以“输入图片与feature map的大小的比值”,得到了feature map上的box坐标。
- 将其划分为(2*2)个sections(因为输出大小为22),通过第二步,我们可以发现,所得到的矩形框大小为5x7,输出为2x2,所以在57的特征图划分成2*2的时候不是等分的,行是5/2,第一行得到2,剩下的那一行是3,列是7/2,第一列得到3,剩下那一列是4。因此,我们可以把这个矩形这样划分:
- 然后对这个2x2的区域进行max pooling操作。
下面是一个动态图,可以更形象的说明整个roi pooling的过程:
参考: