RoI Pooling
在Fast R-CNN首次出现了ROI Pooling
下面以Fast R-CNN为例
可以看到先对原图进行卷积,得到卷积层,在将Selective Search选择的proposals对应到卷积层。由于proposal尺寸不一样,需要进行RoI pooling,比如下面是卷积层:
有一个proposals:
划分网格,paper里设置的是7 * 7,下图是2 * 2:
每个网格选最大值(max pooling一个意思):
动画:
和SPP对比,就是只有一层(尺度)的SPP
从上面可以发现,虽然经过RoI Pooling转换后得到的长度一样了,然后可以接全连接层。
但是存在以下问题:
region proposal的xywh通常是小数,但是为了方便操作会把它整数化。
将整数化后的边界区域平均分割成 k x k 个单元,对每一个单元的边界进行整数化。
两次整数化的过程如下图所示:
事实上,经过上述两次整数化,此时的候选框已经和最开始回归出来的位置有一定的偏差,这个偏差会影响检测或者分割的准确度。在论文里,作者把它总结为“不匹配问题”(misalignment)。而mask检测,即实例分割(instance segmentation)需要像素-Feature Map对应,所以就有下面的RoI Align。
RoI Align
RoI Align首次出现在Mask R-CNN中
比如ROI(proposal)是黑框,蓝色虚线交点处是Featur Map的点,下面把ROI分成2 * 2网格,这一步和RoI Polling一样
接下来对每个网格取4个采样点(RoI Polling是根据网格划分的结果中去对应的Featur Map,由于进行了整数化,就不存在小数),4个采样点灭有进行取整,所以进行双线性插值,双线性插值核心思想就是那个点举例采样点近,那个点发挥的作用就更大。
最后的步骤也和RoI Polling一样,网格内的采样点取一个最大值代表这个网格。所以最后输出的结果是固定大小。
需要说明的是,在相关实验中,作者发现将采样点设为4会获得最佳性能,甚至直接设为1在性能上也相差无几。事实上,ROI Align 在遍历取样点的数量上没有ROIPooling那么多,但却可以获得更好的性能,这主要归功于解决了misalignment的问题。
参考
令人拍案称奇的Mask RCNN