【目标检测】【边界框回归】Bounding-Box regression
【目标检测】【边界框回归】Bounding-Box regression
最近开始看目标检测的论文,第一篇为R-CNN论文,是两阶段目标检测的开山奠基之作。论文中的损失函数包含了边界框回归,且在R-CNN论文里面有详细的介绍。
一、为什么要做边界框回归?
对于上图,绿色的框表示Ground Truth,红色的框为Selective Search提取的Region Proposal。那么即便红色的框被分类器识别为飞机,但是由于红色的框定位不准(IoU<0.5),那么这张图相当于没有正确的检测出飞机。
这时,我们可以对红色的框进行微调,使得微调后的窗口跟Ground Truth更接近,这样就能实现较为准确的定位。
而Bounding-Box regression就是用来微调这个窗口的。
二、边界框回归是什么?
对于窗口,我们一般用四维向量
(
x
,
y
,
w
,
h
)
(x,y,w,h)
(x,y,w,h)来表示,分别表示窗口的中心点坐标和宽高。
红色的框
P
P
P代表原始的Proposal, 绿色的框
G
G
G 代表目标的Ground Truth, 我们的目标是寻找一种关系使得输入原始的窗口
P
P
P经过映射得到一个跟真实窗口
G
G
G更接近的回归窗口
G
^
\hat{G}
G^。
边框回归的目的既是:给定 ( P x , P y , P w , P h ) (P_x,P_y,P_w,P_h) (Px,Py,Pw,Ph)寻找一种映射 f f f,使得 f ( P x , P y , P w , P h ) = ( G ^ x , G ^ y , G ^ w , G ^ h ) f(P_x,P_y,P_w,P_h) = (\hat{G}_x,\hat{G}_y,\hat{G}_w,\hat{G}_h) f(Px,Py,Pw,Ph)=(G^x,G^y,G^w,G^h)并且 ( G ^ x , G ^ y , G ^ w , G ^ h ) ≈ ( G x , G y , G w , G h ) (\hat{G}_x,\hat{G}_y,\hat{G}_w,\hat{G}_h) \approx (G_x,G_y,G_w,G_h) (G^x,G^y,G^w,G^h)≈(Gx,Gy,Gw,Gh)。
三、边界框回归怎么做的?
那么经过何种变换才能从图中的窗口 P 变为窗口 G ^ \hat{G} G^呢?比较简单的思路就是: 平移+尺度放缩。
第一步:先做平移 ( Δ x , Δ y ) (\Delta_x,\Delta_y) (Δx,Δy)
其中:
Δ
x
=
P
w
d
x
(
P
)
\Delta_x=P_wd_x(P)
Δx=Pwdx(P),
Δ
y
=
P
h
d
y
(
P
)
\Delta_y=P_hd_y(P)
Δy=Phdy(P),这是R-CNN论文里面的:
G
^
x
=
P
w
d
x
(
P
)
+
P
x
\hat{G}_x=P_wd_x(P)+P_x\\
G^x=Pwdx(P)+Px
G
^
y
=
P
h
d
y
(
P
)
+
P
y
\hat{G}_y=P_hd_y(P)+P_y
G^y=Phdy(P)+Py
第二步:做尺度缩放 ( S w , S h ) (S_w,S_h) (Sw,Sh)
S
w
=
e
x
p
(
d
w
(
P
)
)
S_w=exp(d_w(P))
Sw=exp(dw(P)),
S
h
=
e
x
p
(
d
h
(
P
)
)
S_h=exp(d_h(P))
Sh=exp(dh(P)),对应的论文中:
G
^
w
=
P
w
e
x
p
(
d
w
(
P
)
)
\hat{G}_w=P_wexp(d_w(P))
G^w=Pwexp(dw(P))
G
^
h
=
P
h
e
x
p
(
d
h
(
P
)
)
\hat{G}_h=P_hexp(d_h(P))
G^h=Phexp(dh(P))
观察上面的等式我们不难发现,边界框回归学习就是
d
x
(
P
)
,
d
y
(
P
)
,
d
w
(
P
)
,
d
h
(
P
)
d_x(P),d_y(P),d_w(P),d_h(P)
dx(P),dy(P),dw(P),dh(P)这四个变换。下一步就是设计算法得到这四个映射。
边界框回归,我们该如何去理解呢?
首先对于线性回归的概念,我们给定输入的特征向量 X X X,学习一组参数 ω \omega ω,使得经过线性回归后的值跟真实值 Y Y Y(Ground Truth)非常接近,即 Y ≈ ω X Y\approx \omega X Y≈ωX。那么Bounding-Box中我们的输入与输出分别是什么呢?
Input:
Region Proposal -> P ( P x , P y , P w , P h ) P(P_x,P_y,P_w,P_h) P(Px,Py,Pw,Ph),这个是什么? 输入就是这四个数值吗?
其实真正的输入是这个窗口对应的 CNN 特征,也就是 R-CNN 中的 Pool5 feature(特征向量)。
(注:训练阶段输入还包括 Ground Truth, 也就是下边提到的 t ∗ = ( t x , t y , t w , t h ) t_{\ast}=(t_x,t_y,t_w,t_h) t∗=(tx,ty,tw,th)
Output:
需要进行的平移变换和尺度缩放 d x ( P ) , d y ( P ) , d w ( P ) , d h ( P ) d_x(P),d_y(P),d_w(P),d_h(P) dx(P),dy(P),dw(P),dh(P), 或者说是 Δ x , Δ y , S w , S h \Delta_x,\Delta_y,S_w,S_h Δx,Δy,Sw,Sh,我们的最终输出不应该是 Ground Truth 吗? 是的, 但是有了这四个变换我们就可以直接得到 Ground Truth, 这里还有个问题, 根据公式我们可以知道, P 经过 d x ( P ) , d y ( P ) , d w ( P ) , d h ( P ) d_x(P),d_y(P),d_w(P),d_h(P) dx(P),dy(P),dw(P),dh(P)得到的并不是真实值 G, 而是预测值 G ^ \hat{G} G^。的确, 这四个值应该是经过 Ground Truth 和 Proposal 计算得到的真正需要的平移量 ( t x , t y ) (t_x,t_y) (tx,ty)和尺度缩放 ( t w , t h ) (t_w,t_h) (tw,th)。
这也就是 R-CNN 中的下述的公式:
t
x
=
(
G
x
−
P
x
)
/
P
w
t_x=(G_x-P_x)/P_w
tx=(Gx−Px)/Pw
t
y
=
(
G
y
−
P
y
)
/
P
h
t_y=(G_y-P_y)/P_h
ty=(Gy−Py)/Ph
t
w
=
log
(
G
w
/
P
w
)
t_w=\log(G_w/P_w)
tw=log(Gw/Pw)
t
h
=
log
(
G
h
/
P
h
)
t_h=\log(G_h/P_h)
th=log(Gh/Ph)
那么目标函数可以表示为:
d
∗
(
P
)
=
w
∗
T
Φ
5
(
P
)
d_{\ast}(P)=w_{\ast}^{T}\Phi_5(P)
d∗(P)=w∗TΦ5(P)
其中
Φ
5
(
P
)
\Phi_5(P)
Φ5(P)是输入 Proposal 的特征向量,
w
∗
w_{\ast}
w∗是要学习的参数(
∗
\ast
∗表示
x
,
y
,
w
,
h
x,y,w,h
x,y,w,h,也就是每一个变换对应一个目标函数,
d
∗
(
P
)
d_{\ast}(P)
d∗(P)是得到的预测值。我们要让预测值跟真实值
t
∗
=
(
t
x
,
t
y
,
t
w
,
t
h
)
t_{\ast}=(t_x,t_y,t_w,t_h)
t∗=(tx,ty,tw,th)差距最小,得到损失函数为:
L
o
s
s
=
∑
i
N
(
t
∗
i
−
w
^
∗
T
ϕ
5
(
P
i
)
)
2
Loss=\sum_{i}^{N}(t_{\ast}^i-\hat{w}_{\ast}^{T}\phi_5(P^i))^2
Loss=i∑N(t∗i−w^∗Tϕ5(Pi))2
函数优化目标为:
W
∗
=
arg min
w
∗
∑
i
N
(
t
∗
i
−
w
^
∗
T
ϕ
5
(
P
i
)
)
2
+
λ
∣
∣
w
^
∗
∣
∣
2
W_{\ast}=\argmin_{w_{\ast}}\sum_{i}^N(t_{\ast}^i-\hat{w}_{\ast}^{T}\phi_5(P^i))^2+\lambda||\hat{w}_{\ast}||^2
W∗=w∗argmini∑N(t∗i−w^∗Tϕ5(Pi))2+λ∣∣w^∗∣∣2
利用梯度下降法或者最小二乘法就可以得到
w
∗
w_{\ast}
w∗。
四、为什么宽高尺度会设计这种形式?
文章将会重点解释一下为什么设计的 t x , t y t_x,t_y tx,ty为什么除以宽高,为什么 t w , t h t_w,t_h tw,th会有 log \log log形式?
首先CNN具有尺度不变性,以下图为例(图片来源于知乎):
x,y坐标除以宽高
上图的两个人具有不同的尺度,因为他都是人,我们得到的特征相同。假设我们得到的特征为
ϕ
1
\phi_1
ϕ1、
ϕ
2
\phi_2
ϕ2。如果我们直接学习坐标差值,以
x
x
x坐标为例,
x
i
x_i
xi,
p
i
p_i
pi分别代表第i个框的
x
x
x坐标,学习到的映射为
f
f
f:
f
(
ϕ
1
)
=
x
1
−
p
1
f(\phi_1)=x_1-p_1
f(ϕ1)=x1−p1
同理,
f
(
ϕ
2
)
=
x
2
−
p
2
f(\phi_2)=x_2-p_2
f(ϕ2)=x2−p2。
从上图显而易见, x 1 − p 1 ≠ x 2 − p 2 x_1-p_1\neq x_2-p_2 x1−p1=x2−p2。也就说同一个 x x x对应于多个 y y y,这明显不满足函数的定义。
边界框回归学习的是回归函数,然而你的目标却不满足函数定义,当然学习不到什么。
宽高坐标log形式
我们想要得到一个放缩的尺度,也就是说这里限制尺度必须大于0。
我们学习的 t w , t h t_w,t_h tw,th怎么保证满足大于0呢?直观的想法就是 e x p exp exp函数,如R-CNN论文里面的公式,那么反过来推到就是log函数的来源了。
为什么IoU较大,认为是线性变换?
当输入的 Proposal 与 Ground Truth 相差较小时(RCNN 设置的是 IoU>0.6), 可以认为这种变换是一种线性变换, 那么我们就可以用线性回归来建模对窗口进行微调, 否则会导致训练的回归模型不 work(当 Proposal跟 GT 离得较远,就是复杂的非线性问题了,此时用线性回归建模显然不合理)。这里解释:
Log函数明显不满足线性函数,但是为什么当Proposal 和Ground Truth相差较小的时候,就可以认为是一种线性变换呢?大家还记得这个公式吗?
lim
x
=
0
log
(
1
+
x
)
=
x
\lim_{x=0}\log(1+x)=x
x=0limlog(1+x)=x
现在反过来看公式:
t
w
=
log
(
G
x
/
P
w
)
=
log
(
G
x
+
P
w
−
P
w
P
w
)
=
log
(
1
+
G
w
−
P
w
P
w
)
t_w=\log(G_x/P_w)=\log(\frac{G_x+P_w-P_w}{P_w})=\log(1+\frac{G_w-P_w}{P_w})
tw=log(Gx/Pw)=log(PwGx+Pw−Pw)=log(1+PwGw−Pw)
当且仅当
G
w
−
P
w
=
0
G_w-P_w=0
Gw−Pw=0的时候,才会是线性函数,也就是宽度和高度必须近似相等。
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)