RoIAlign理解

1. RoIPool的不足

  首先,不管是ROI Pool还是ROIAlign,目的都是提取输出特征图上该ROI坐标所对应的特征。RPN网络得到的ROI坐标是针对输入图像大小的,所以首先需要将ROI坐标缩小到输出特征对应的大小,假设输出特征尺寸是输入图像的1/16,那么先将ROI坐标除以16并取整(第一次量化),然后将取整后的ROI划分成H*W个bin(论文中是 7*7,有时候也用14*14),因为划分过程得到的bin的坐标是浮点值,所以这里还要将bin的坐标也做一个量化,具体而言对于左上角坐标采用向下取整,对于右下角坐标采用向上取整,最后采用最大池化操作处理每个bin,也就是用每个bin中的最大值作为该bin的值,每个bin都通过这样的方式得到值,最终输出的H*W大小的ROI特征。从这里的介绍可以看出ROI Pool有两次量化操作,这两步量化操作会引入误差。

  例如:原图上的bbox大小为665x665,经backbone后,spatial scale=1/32。因此bbox也相应应该缩小为665/32=20.78,但是这并不是一个真实的pixel所在的位置,因此这一步会取为20。0.78的差距反馈到原图就是0.78x32=25个像素的差距。如果是大目标这25的差距可能看不出来,但对于小目标而言差距就比较巨大了。

bcb0c570c6dbeeebf0e6af31cf2acddb1603775341826

图1

  因此运用roipool对小目标的预测偏差较大,更不用说运用到像素级精度的语义分割上面了。

2. RoIAlign的计算方法

  ROIAlign不再引入量化操作,对于RPN网络得到的ROI坐标直接除以缩放倍数(比如16),这个过程不进行量化,因此得到的ROI坐标仍是浮点值,然后将ROI划分成H*W个bin,划分得到的bin坐标也是浮点值,不进行量化,接着通过在每个bin中均匀取4个点,这4个点的值通过该bin所包含的点插值计算得到,最后对这4个点求均值或最大值作为这个bin的值,通过这种方式计算每个bin的值后,最终输出H*W大小的ROI特征。可以看出ROIAlign整个过程没有采用量化操作,因此大大减少了量化带来的误差。

  同样以图1为例,去图中小狗的bbox作为例子。

  1) Conv layers使用的是VGG16,feat_stride=32(即表示,经过网络层后图片缩小为原图的1/32),原图800*800,最后一层特征图feature map大小:25*25。

  2) 图中有一小狗的region proposal,大小为665*665,这样,映射到特征图中的大小:665/32=20.78,即20.78*20.78,此时,没有像RoiPooling那样就行取整操作,保留浮点数

  3) 假定pooled_w=7,pooled_h=7,即pooling后固定成7*7大小的特征图,所以,将在 feature map上映射的20.78*20.78的region proposal 划分成49个同等大小的小区域,每个小区域的大小20.78/7=2.97,即2.97*2.97,如下图所示。

下载

  4) 假定采样点数为4,即表示,对于每个2.97*2.97的小区域,平分四份,每一份取其中心点位置,而中心点位置的像素,采用双线性插值法进行计算,这样,就会得到四个点的像素值,如下图所示:

cc84a28e7f0ae568ac3c730915429abd1603775341828

上图中,四个红色叉叉‘×’的像素值是通过双线性插值算法计算得到的。

最后,取四个像素值中最大值作为这个小区域(即:2.97*2.97大小的区域)的像素值,如此类推,同样是49个小区域得到49个像素值,组成7*7大小的feature map。

3. 参考

https://zhuanlan.zhihu.com/p/73662410

https://zhuanlan.zhihu.com/p/73138740

(完)

本文版权归作者(https://www.cnblogs.com/harrymore/)和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接,如有问题, 可邮件(harrymore@126.com)咨询.
原文地址:https://www.cnblogs.com/harrymore/p/14870198.html