在Faster-rcnn中,ROIPooling的作用是将原图像上不同大小的proposal映射到特征图上同等大小的区域,以便后面进行分类和回归预测。既然是pooling,它的本质也是一种最大池化。那么究竟是如何映射的呢?
可以通过代码来了解一下
这个是roi的代码部分,其中输入feature是网络输出的特征图,proposal是RPN网络生成的,并且经过筛选的候选框,image_shapes是原始图像的尺寸。输出就是经过roi之后固定区域的候选框。
通过debug来详细看一下各个部分的形状
features:
我么使用的主干网是mobilenet batch是2 所以这里是2x1280x17x17
proposal
两张图像对于有两个候选框的列表
候选框在在第一张图像上有512个 第二张图像上有508个
image_shape
这个里面存放的是输入图像的尺寸。
box_feature
它是通过roi之后的结果,可以发现它的通道数为1280,是之前特征图的通道数,7x7是固定尺寸的大小,1020是两个候选框列表加起来的总数。这个是怎么来的呢?
为了在特征图上获得尺寸大小相同的候选框,第一步肯定就是要把候选框弄到特征图上去,第二部获得相同大小的候选框。
第一步实现方式:
从上面代码中可以发现,我们传入了输入图像的尺寸和特征图的大小,那么我么就可以根据它们二者的关系算出特征图和原始输入图像的缩放关系,我们这里记为ratio。
对于候选框,rpn网络预测的候选框是对应原图上面的候选框,并且用的是左上角加右下角的坐标形式来表示这个框(这就是为什么候选框的形状是512x4,表示总共512个候选框,每个框四个坐标),所以我们可以根据这个缩放关系ration,将这个候选框的四个坐标映射回特征图上面,这个过程要进行一次取整操作。
第二步实现方式:
现在在特这图上已经有了大小不一的候选框,我们就是要把它弄成一样尺寸的。这里借助一下网上的例子,假设输出的尺寸统一为2x2,特征图如下所示,某个候选框映射到特征图上的坐标为(0,3),(7,8),即为图中黑色的部分。注图像的坐标系以左上角为(0,0)
那么整个候选框的区域大小为(5,7),我们为了得到2x2的候选框,将它分别除(2,2)然后取整,得到每个roipooling的区域大小。
即5/2=2.5取整得2,7/2取整得3
然后在行上取两行,列上取三列作为第一个区域,剩下的作为第二个区域。这样候选框就被划分为四个不同大小的区域,然后我们再对每个区域求最大池化,可以得到四个相同的区域。
这个就是roipooling的过程了。再回到上面的代码,通过roipooling函数之后的输出为
它只是输出区域的尺寸为7x7,然后由于特征图有1280个通道,候选框映射回去之后要对每个通道的特征图进行roipooling所以通道是不会改变,1020就是候选框的个数总和,即把两张输入图像的候选框堆叠到一起了。
总结
roipooling就是把输入图像的不同尺寸候选框映射到特征图上相同尺寸,其间会有两次取整操作,会损失一些精度,故之后又提出roialign。
都看到这里了