RoI Pooling 与 RoI Align 都是“把不同大小的候选框(RoI)变成固定尺寸特征图”的操作,但 RoI Pooling 用量化→粗糙对齐,RoI Align 用双线性插值→子像素对齐,后者精度更高,已成为 2025 年检测/分割标配。
下面用“1 张图 + 2 段代码 + 3 个数字”一次讲清,面试直接背。
一、为什么必须“统一尺寸”
表格
模块 | 输入 | 要求 |
---|---|---|
检测头 / 分割头 | 任意框 (N×4) | 固定张量 (N×7×7×256) |
全连接 / Transformer | 可变长 | 定长向量 |
→ 需要 “框 → 特征图” 的桥梁:RoIX
二、RoI Pooling vs Align 流程对比
表格
步骤 | RoI Pooling (2015) | RoI Align (2017) |
---|---|---|
1. 框坐标 | 浮点 x1,y1,x2,y2 | 同上 |
2. 量化**→粗糙** | quant = floor(x/stride) |
不量化 保持浮点 |
3. 分 bin | 7×7 整数格 | 7×7 浮点格 |
4. 采样点 | 每 bin 左上角 1 点 | 每 bin 4 子点(双线性插值) |
5. 特征值 | 直接取整坐标 | 4 子点双线性平均 |
结果 | 对齐误差 0~1 像素 | 子像素精度 |
对齐误差 → 小目标、分割边缘 mAP↓1-2%;Align 修复。
三、子像素采样图解(7×7 输出)
bin 位置(浮点)
├─ 量化后 → 整点(Pooling)→ 边缘错位
└─ 4 子点 → 双线性插值(Align)→ 无错位
4 子点坐标:
s = 0.5, 1.5, 2.5, ..., 6.5
每 bin 宽 h/7,步长 h/7
四、代码级(MMDetection 风格)
Python
# RoI Pooling(旧)
roi_layer=dict(type='RoIPool', output_size=7, spatial_scale=1./16.)# RoI Align(2025 默认)
roi_layer=dict(type='RoIAlign', output_size=7, sampling_ratio=0, spatial_scale=1./16.)
sampling_ratio=0
→ 自动 2×2=4 子点;设 1 → 3×3=9 点,更精细但慢。
五、精度对比(COCO 2017)
表格
模型 | 头类型 | AP @0.5:0.95 | AP_s |
---|---|---|---|
Faster R-CNN | RoI Pool | 39.3 | 21.8 |
Faster R-CNN | RoI Align | 40.7 | 23.1 |
小目标 AP_s ↑1.3%,边缘分割更锐利。
六、金句
“RoI Pooling 量化取整导致边缘错位;RoI Align 保持浮点 + 双线性插值 4 子点,实现 子像素对齐,2025 年检测/分割已全面替换。”