SPP Layer

对 RoI 进行 pooling 的操作最早由 SPPNet 中的 SPP layer 提出:
从 RoIPooling 到 RoIAlign_JNing-CSDN博客_roialign - 图1

对 RoI 进行 pooling,使得检测网络可以输入任意 size 的图片。因为从输入图片到 fc 之间契入了对 RoI 的 pooling,使得 fc 的存在也无法写死输入图片的 size。

RoIPooling

2015 年,Ross Girshick 大神在Fast R-CNN中继承了 SPP layer 的精髓,并简化了该设计,提出了 RoIPooling。旨在满足一次性训练 feature map 的前提下,替代 R-CNNwraped region 的功能:
从 RoIPooling 到 RoIAlign_JNing-CSDN博客_roialign - 图2

方位

在 Faster R-CNN 中,anchor 经过优胜劣汰升级为 RoI ,之后 输入 RoIPooling 进行 size 归一化 。其中,RoIPooling 的 位置 如下:
从 RoIPooling 到 RoIAlign_JNing-CSDN博客_roialign - 图3

缺陷

百密一疏。由于 RoIPooling 采用的是 INTER_NEAREST(即最近邻插值) ,即在 resize 时,对于 缩放后坐标不能刚好为整数 的情况,采用了 粗暴的四舍五入,相当于选取离目标点最近的点。

RoIAlign

诞生

Kaiming He 在他的论文Mask RCNN里指出,这样做会在一定程度上损失 空间对称性(Alignment),所以他们把 最近邻插值 换成了 双线性插值 。换完插值法的 RoIPooling 就有了一个更加高大上的名字 —— RoIAlign
从 RoIPooling 到 RoIAlign_JNing-CSDN博客_roialign - 图4

弊端

SPP Layer 及其后继的 RoI Pooling、RoI Align 的出现,使得 Detection 算法可以享受到 “共享特征抽取”,从而免去了前半段网络的重复计算;然而该设计也导致了一个问题——后半段变成了 RoI-wise subnetwork,依然无法共享计算,每输入一个 RoI 都需重复一次。

R-FCN针对这个痛病,将处理位置信息的任务交给了 “position-sensitive score map” (位置敏感得分图) 来做,从而炒了 RoI Pooling 的鱿鱼。

插值法

具体关于 双线性插值 的介绍可参见我的另一篇博客:图像处理: 五种 插值法


[1] 论文阅读: R-FCN
[2] 图像处理: 五种 插值法
https://blog.csdn.net/JNingWei/article/details/78822159?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-6.channel_param&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-6.channel_param