ROI Pooling 与 ROI Align

date
Sep 20, 2021
Last edited time
Mar 27, 2023 08:48 AM
status
Published
slug
ROI_Pooling与ROI_Align
tags
DL
CV
summary
总是忘记 ROI Align 和 ROI Pooling的区别,还是复制以下吧
type
Post
Field
Plat
ROI Align 是在 Mask-RCNN 这篇论文里提出的一种区域特征聚集方式, 很好地解决了 ROI Pooling 操作中两次量化造成的区域不匹配 (mis-alignment) 的问题。实验显示,在检测测任务中将 ROI Pooling 替换为 ROI Align 可以提升检测模型的准确性。

ROI Pooling 过程:

1、首先根据后面网络要求的输入尺寸求网格大小,如输入特征图尺寸为 55,而网络输入尺寸为 22,那么网格的划分结果为
notion image
2、对于每个小网格,求最大值作为该网格最大池化之后的值。
在这个过程中会有两次量化操作。对于一个 region proposal,首先从原图经过全卷积网络到特征图,得到的候选框位置可能存在浮点数,进行取整操作从而出现第一次量化;其次,在 ROI Pooling 求取每个小网格的位置时也同样存在浮点数取整的情况。这两次量化的结果都使得候选框的位置会出现偏差,在论文里,作者把它总结为 “不匹配问题(misalignment)。如下图所示,假设图片经过主干网络提取特征后,特征图缩放步长(stride)为 32,则该层特征图上 0.1 个像素的偏差,缩放到原图就是 3.2 个像素。
notion image

ROI Align 过程:

为了解决 ROI Pooling 的上述缺点,作者提出了 ROI Align 这一改进的方法。ROI Align 的思路很简单:取消量化操作,使用双线性内插的方法获得坐标为浮点数的像素点上的图像数值, 从而将整个特征聚集过程转化为一个连续的操作,。值得注意的是,在具体的算法操作上,ROI Align 并不是简单地补充出候选区域边界上的坐标点,然后将这些坐标点进行池化,而是重新设计了一套比较优雅的流程,如图 3 所示:
遍历每一个候选区域,保持浮点数边界不做量化。
将候选区域分割成 k x k 个单元,每个单元的边界也不做量化。
在每个单元中计算固定四个坐标位置,用双线性内插的方法计算出这四个位置的值,然后进行最大池化操作。
这里对上述步骤的第三点作一些说明:这个固定位置是指在每一个矩形单元(bin)中按照固定规则确定的位置。比如,如果采样点数是 1,那么就是这个单元的中心点。如果采样点数是 4,那么就是把这个单元平均分割成四个小方块以后它们分别的中心点。显然这些采样点的坐标通常是浮点数,所以需要使用插值的方法得到它的像素值。在相关实验中,作者发现将采样点设为 4 会获得最佳性能,甚至直接设为 1 在性能上也相差无几。事实上,ROI Align 在遍历取样点的数量上没有 ROIPooling 那么多,但却可以获得更好的性能,这主要归功于解决了 misalignment 的问题。值得一提的是,我在实验时发现,ROI Align 在 VOC2007 数据集上的提升效果并不如在 COCO 上明显。经过分析,造成这种区别的原因是 COCO 上小目标的数量更多,而小目标受 misalignment 问题的影响更大(比如,同样是 0.5 个像素点的偏差,对于较大的目标而言显得微不足道,但是对于小目标,误差的影响就要高很多)。
notion image
notion image

反向传播公式:

常规的 ROI Pooling 的反向传播公式如下:
这里, 代表池化前特征图上的像素点; 代表池化后的第 个候选区域的第 个点; 代表点 像素值的来源(最大池化的时候选出的最大像素值所在点的坐标)。由上式可以看出,只有当池化后某一个点的像素值在池化过程中采用了当前点 的像素值(即满足 ),才在 处回传梯度。
类比于 ROIPooling,ROIAlign 的反向传播需要作出稍许修改:首先,在 ROIAlign 中,是一个浮点数的坐标位置 (前向传播时计算出来的采样点),在池化前的特征图中,每一个与 横纵坐标均小于 的点都应该接受与此对应的点 回传的梯度,故 ROI Align 的反向传播公式如下:
上式中, 表示两点之间的距离, 表示 横纵坐标的差值,这里作为双线性内插的系数乘在原始的梯度上。
 

© Lazurite 2021 - 2024