RoI Pooling 、 RoI Align
注意:RoI在原图上
参考:https://blog.youkuaiyun.com/qq_29598161/article/details/108137399
RoI Pooling:
- 原图的候选框映射到feature map上,例如665* 665 映射到feature map25* 25上为665/32(缩放比例)=20.78,取整为20,左上角顶点坐标也会映射一次,坐标也会取整,不会落到bin内部,这是第一次量化
- 如果pooling输出为7*7,那么会把上面映射的feature划分成49个同等大小(feature长宽大小不一样bin就是矩形,如下面gif所示)的bin,每个bin大小为20/7=2.86,取整后为2,这是第二次量化
- 每个bin里取最大,max pooling,得到7*7大小的feature map
反向传播in RoI Pooling
在ROI层反向传播,对每个proposals的网格做如下判断, x i x_i xi中的i是否对应当前ROI,换句话说就是 i = i ∗ ( r , j ) i = i ∗ ( r , j ) i=i∗(r,j)表示特征图上的第 i i i节点是否被候选区域 r r r的第 j j j个节点选为最大值输出。如果是就累加下一个proposals,这样就求出$ \frac{\partial L}{\partial x_{i}} $
RoI Align(2018):
由于上述roi pooling过程的两次量化(取整操作)会造成misalignment,为了做精细的语义分割,roialign实现了pixel-to-pixel alignment,没有取整操作。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Qh75DGe4-1685506927848)(C:\Users\86188\Pictures\works\roialign.png)]
下图align输出为2* 2,和我解释的7*7不一样:
- 原图的RoI映射到feature map上不取整(Figure 3中align输出为2* 2),假设还是665/32=20.78,保留浮点数
- 直接将映射的feature map分割为7* 7大小(align输出大小)的feature map,划分成几个同等大小的区域
- 文章中采样点数为4,表示对每个bin,平分四份,取中心点位置(红叉),中心点的像素采用双线性插值法计算(中心和其所在的feature方格的四个顶点,左上角顶点才是方格的值对应的点),一个bin得到四个值(左上角)
- 每个bin分别取max作为其值,得到最终输出。
对于有较多小物体的图片使用RoIAlign会更加精确。
关于最终的采样结果对采样点的位置,以及采样点的个数并不敏感。
单线性插值
已知数据 (x0, y0) 与 (x1, y1),要计算 [x0, x1] 区间内某一位置 x 在直线上的y值。
双线性插值
有两个方向和对应的值
在两个方向分别进行一次单线性插值
我们想得到未知函数 f 在点 P = (x, y) 的值
已知函数 f 在 Q11 = (x1, y1)、Q12 = (x1, y2), Q21 = (x2, y1) 以及 Q22 = (x2, y2) 四个点的值
首先在 x 方向进行线性插值
然后在 y 方向进行线性插值
对比:
pooling
align
M6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80Mjc4MjE1MA==,size_16,color_FFFFFF,t_70)