RoIPool最初是在Fast RCNN中提出的,是SPP(spatial pyramid pooling)的一个特例,解决RoI(Region of Interest)大小不一致但是全连接层输入只能是固定大小的问题。但是会有错位(misalignment)的问题——由于两次量化导致执行完RoIPool后的结果与原始的Region Proposal在特征图(Feature map)中的位置发生偏移。针对小物体会更加的明显。
为了解决上面的问题,HE Kaiming等人在Mask R-CNN中提出了RoIAlign,一个更加优雅的解决方案,既可以解决全连接层输入大小固定的问题又解决了RoIPooling中出现的misalignment的问题。下面我们分别详细说一下:
RoIPooling
在SPP-net中对全连接层只接受固定输入的解决方案是添加一个SPP层。SPP层的输入的大小可以是不同的,但是输出的大小是固定的。到后面Fast R-CNN中的RoIPooling功能与SPP层类似,只不过是将RPN输出的RoI作为输入,这些RoI的大小是不同的。Fast R-CNN中RoI pooling层的输出是一个超参的配置。RoI的定义为(r,c,h,w),(r, c)是左上角坐标,(h, w)是高和宽。
RoIPool的计算过程如下(不知道图的原出处, 借用一下):
-
- 原始图片大小为800x800。假定骨干网络(这里是VGG16)的缩放步长为32,也就是最后得到的特征图的大小是原始图片大小的1/32,即25x25。
-
- 通过RPN网络选出一个665x665的RoI,RoI的坐标假定为(r, c, h, w),对应的RoI映射到特征图的大小为(665/32)x(655/32)