转载:https://blog.csdn.net/gusui7202/article/details/84799535
转载:https://www.cnblogs.com/ranjiewen/articles/8869703.html
前面一个理解较为深刻,后面讲的详细点。
roi-pooling的两次量化对小目标的物体会有很大的误差,因此有人提出不需要进行取整操作,如果计算得到小数,也就是没有落到真实的pixel上,那么就用最近的pixel对这一点虚拟pixel进行双线性插值,得到这个“pixel”的值。
具体做法如下图所示:
1、将bbox区域按输出要求的size进行等分,很可能等分后各顶点落不到真实的像素点上
2、没关系,在每个bin中再取固定的4个点(作者实验后发现取4效果较好),也就是图二右侧的蓝色点
3、针对每一个蓝点,距离它最近的4个真实像素点的值加权(双线性插值),求得这个蓝点的值
4、一个bin内会算出4个新值,在这些新值中取max,作为这个bin的输出值
5、最后就能得到2x2的输出
下面来看一下roi-pooling和roi-align的反向传播公式来加深理解。
首先是roi-pooling的反向传播公式:
对于RoI Pooling的反向传播公式可以类比max pooling的反向传播公式理解。不同的是,对于每个mini-batch 的RoI r 和每个pooling单元 j 及其输出
y
r
j
y_{r j}
yrj ,偏导数
∂
L
/
∂
y
r
j
\partial L / \partial y r j
∂L/∂yrj is accumulated if i is the argmax selected for by max pooling(xi被候选区域r的第j个输出节点选为最大值)。在反向传播过程中, 偏导数
∂
L
∂
y
r
j
\frac{\partial L}{\partial y_{r j}}
∂yrj∂L 已经被RoI pooling层之后的层通过反向传播计算好了。
这里为什么要求和,是因为如图1所示,当不同roi的不同区域出现重叠的情况。如下图,也就是不同roi区域之间会有重叠(因为NMS只能滤掉大于阈值的部分。)
RoI Align反向传播
类比于ROI Pooling,ROI Align的反向传播需要稍作修改:因为在ROIAlign中,
i
∗
(
r
,
j
)
i^{*}(r, j)
i∗(r,j) 是一个浮点数的坐标位置(前向传播时计算出来的采样点),所以在池化前的特征图中,每一个与
i
∗
(
r
,
j
)
i^{*}(r, j)
i∗(r,j) 横纵坐标均小于1的点都应该接受与此对应的点
y
r
j
y_{r j}
yrj 回传的梯度,故ROI Align 的反向传播公式如上式所示。 其中, d表示两点之间的距离,
Δ
h
\Delta h
Δh 和
Δ
w
\Delta w
Δw 表示
i
i
i与
i
∗
(
r
,
j
)
i^{*}(r, j)
i∗(r,j) 横纵坐标的差值,这里作为双线性内插的系数乘在原始的梯度上。直观的理解就是离采样点越近的整数坐标点比重越大,极端的例子是
Δ
h
\Delta h
Δh 和
Δ
w
\Delta w
Δw 都等于0的时候,就是当前采样点的值。