【目标检测】【边界框回归】Bounding-Box regression 小灰灰 2023-09-27 12:18 62阅读 0赞 最近开始看目标检测的论文,第一篇为R-CNN论文,是两阶段目标检测的开山奠基之作。论文中的损失函数包含了边界框回归,且在R-CNN论文里面有详细的介绍。 ### 一、为什么要做边界框回归? ### ![在这里插入图片描述][1dadb99f57e34dca9aa177607b8f8e27.png] 对于上图,绿色的框表示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)来表示,分别表示窗口的中心点坐标和宽高。 ![在这里插入图片描述][f21e4abefd62445f90c1875f60d183a4.png] 红色的框 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具有尺度不变性,以下图为例(图片来源于知乎): ![在这里插入图片描述][3cee17bf31af4edf925d624d77aa564d.png] #### 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的时候,才会是线性函数,也就是宽度和高度必须近似相等。 [1dadb99f57e34dca9aa177607b8f8e27.png]: https://img-blog.csdnimg.cn/1dadb99f57e34dca9aa177607b8f8e27.png [f21e4abefd62445f90c1875f60d183a4.png]: https://img-blog.csdnimg.cn/f21e4abefd62445f90c1875f60d183a4.png [3cee17bf31af4edf925d624d77aa564d.png]: https://img-blog.csdnimg.cn/3cee17bf31af4edf925d624d77aa564d.png
还没有评论,来说两句吧...