ROI Align(Region of Interest Align)是一种从卷积特征图上抽取任意候选框区域特征的方法:它不把坐标取整,而是用双线性插值(bilinear interpolation)在浮点位置上估出特征值,从而消除 ROI Pooling 因取整带来的位置错位。
错位从哪来
两阶段检测器(如 Faster R-CNN 系列)先由区域建议网络给出候选框,再从特征图上抠出每个框对应的区域做池化。问题是特征图通常只有原图的 1/16 或 1/32,候选框映射到特征图上的坐标几乎总是小数。ROI Pooling 要把它切成 k×k 个小格(bin)做池化,就必须先取整——而且取两次:一次把 ROI 的边界对齐到特征图格点,一次把每个 bin 的边界再对齐。两次误差叠加,最多能偏掉接近一个特征图像素。
一个像素为什么值得较真
特征图上一个像素在原图上对应 16 或 32 个像素。对大目标,这点偏差无关痛痒;但对一个在特征图上只占 2×2 的小目标,偏半个像素就等于把框挪了四分之一。检测框的回归、分割掩码(mask)的边缘,都会被这个系统性偏移带歪。
它怎么做到不取整
把特征图想成一面瓷砖墙,每块瓷砖中心有个已知数值。ROI Pooling 只肯站在瓷砖缝(整数格点)上取样,框没对齐就先把框挪到最近的缝。ROI Align 则允许站在任意位置:把每个 bin 均匀撒几个采样点(常见默认是每个 bin 取 4 个,即 2×2),采样点落在瓷砖中央时,就用周围四块瓷砖的数值按距离加权平均估出来——这正是双线性插值的含义。最后对每个 bin 内的采样值取最大或平均,得到该 bin 的特征。
| 方法 | ROI 边界坐标 | bin 内取样位置 | 主要问题 |
|---|---|---|---|
| ROI Pooling | 取整 | 整数格点 | 两次量化,位置错位 |
| RoIWarp | 保留浮点 | 仍按整数格点 | 错位减轻但未消除 |
| ROI Align | 保留浮点 | 双线性插值采样点 | 计算略多,多依赖专用算子 |
对从业者的意义
ROI Align 由 Mask R-CNN 提出,最初是为了让分割掩码更贴合物体边界,实践中对小目标、密集目标场景(行人、遥感影像、文字行)以及关键点检测的提升尤其直观——因为误差是相对尺度,目标越小,相对误差越大。使用时有两个常见误解:它本质上是把离散取样换成连续取样,并非“更准的池化”;采样点数是个超参数,取得太少会退化接近 Pooling,取得太多则收益递减、开销上升。主流框架大多提供对应的 GPU 算子,不必自己写循环,具体支持情况以官方文档为准。
