边框回归(Bounding Box Regression)详解

Bounding-Box regression

最近一直看检测有关的Paper, 从rcnn, fast rcnn, faster rcnn, yolo, r-fcn, ssd,到今年cvpr最新的yolo9000。这些paper中损失函数都包含了边框回归,除了rcnn详细介绍了,其他的paper都是一笔带过,或者直接引用rcnn就把损失函数写出来了。前三条网上解释比较多,后面的两条我看了很多paper,才得出这些结论。

  • 为什么要边框回归?
  • 什么是边框回归?
  • 边框回归怎么做的?
  • 边框回归为什么宽高,坐标会设计这种形式?
  • 为什么边框回归只能微调,在离Ground Truth近的时候才能生效?

为什么要边框回归?

这里引用王斌师兄的理解,如下图所示:


这里写图片描述

对于上图,绿色的框表示Ground Truth, 红色的框为Selective Search提取的Region Proposal。那么即便红色的框被分类器识别为飞机,但是由于红色的框定位不准(IoU<0.5), 那么这张图相当于没有正确的检测出飞机。 如果我们能对红色的框进行微调, 使得经过微调后的窗口跟Ground Truth 更接近, 这样岂不是定位会更准确。 确实,Bounding-box regression 就是用来微调这个窗口的。

边框回归是什么?

继续借用师兄的理解:对于窗口一般使用四维向量(x,y,w,h)” role=”presentation” style=”position: relative;”>(x,y,w,h)(x,y,w,h)


这里写图片描述

边框回归的目的既是:给定(Px,Py,Pw,Ph)” role=”presentation” style=”position: relative;”>(Px,Py,Pw,Ph)(Px,Py,Pw,Ph)

边框回归怎么做的?

那么经过何种变换才能从图 2 中的窗口 P 变为窗口G&#x005E;” role=”presentation” style=”position: relative;”>G^G^呢? 比较简单的思路就是: 平移+尺度放缩

  1. 先做平移(&#x0394;x,&#x0394;y)” role=”presentation” style=”position: relative;”>(Δx,Δy)(Δx,Δy)
  2. 然后再做尺度缩放(Sw,Sh)” role=”presentation” style=”position: relative;”>(Sw,Sh)(Sw,Sh)

观察(1)-(4)我们发现, 边框回归学习就是dx(P),dy(P),dw(P),dh(P)” role=”presentation” style=”position: relative;”>dx(P),dy(P),dw(P),dh(P)dx(P),dy(P),dw(P),dh(P)这四个变换。下一步就是设计算法那得到这四个映射。

线性回归就是给定输入的特征向量 X, 学习一组参数 W, 使得经过线性回归后的值跟真实值 Y(Ground Truth)非常接近. 即Y&#x2248;WX” role=”presentation” style=”position: relative;”>YWXY≈WX 。 那么 Bounding-box 中我们的输入以及输出分别是什么呢?

Input:

RegionProposal&#x2192;P=(Px,Py,Pw,Ph)” role=”presentation” style=”position: relative;”>RegionProposalP=(Px,Py,Pw,Ph)RegionProposal→P=(Px,Py,Pw,Ph))

Output:

需要进行的平移变换和尺度缩放 dx(P),dy(P),dw(P),dh(P)” role=”presentation” style=”position: relative;”>dx(P),dy(P),dw(P),dh(P)dx(P),dy(P),dw(P),dh(P)
这也就是 R-CNN 中的(6)~(9):

tx=(Gx&#x2212;Px)/Pw,(6)” role=”presentation” style=”text-align: center; position: relative;”>tx=(GxPx)/Pw,(6)tx=(Gx−Px)/Pw,(6)

ty=(Gy&#x2212;Py)/Ph,(7)” role=”presentation” style=”text-align: center; position: relative;”>ty=(GyPy)/Ph,(7)ty=(Gy−Py)/Ph,(7)

tw=log&#x2061;(Gw/Pw),(8)” role=”presentation” style=”text-align: center; position: relative;”>tw=log(Gw/Pw),(8)tw=log⁡(Gw/Pw),(8)

th=log&#x2061;(Gh/Ph),(9)” role=”presentation” style=”text-align: center; position: relative;”>th=log(Gh/Ph),(9)th=log⁡(Gh/Ph),(9)

那么目标函数可以表示为 d&#x2217;(P)=w&#x2217;T&#x03A6;5(P)” role=”presentation” style=”position: relative;”>d(P)=wTΦ5(P)d∗(P)=w∗TΦ5(P)差距最小, 得到损失函数为:

Loss=&#x2211;iN(t&#x2217;i&#x2212;w&#x005E;&#x2217;T&#x03D5;5(Pi))2” role=”presentation” style=”text-align: center; position: relative;”>Loss=iN(tiw^Tϕ5(Pi))2Loss=∑iN(t∗i−w^∗Tϕ5(Pi))2

函数优化目标为:

W&#x2217;=argminw&#x2217;&#x2211;iN(t&#x2217;i&#x2212;w&#x005E;&#x2217;T&#x03D5;5(Pi))2+&#x03BB;||w&#x005E;&#x2217;||2” role=”presentation” style=”text-align: center; position: relative;”>W=argminwiN(tiw^Tϕ5(Pi))2+λ||w^||2W∗=argminw∗∑iN(t∗i−w^∗Tϕ5(Pi))2+λ||w^∗||2

利用梯度下降法或者最小二乘法就可以得到 w&#x2217;” role=”presentation” style=”position: relative;”>ww∗

为什么宽高尺度会设计这种形式?

这边我重点解释一下为什么设计的tx,ty” role=”presentation” style=”position: relative;”>tx,tytx,ty会有log形式!!!

首先CNN具有尺度不变性, 以图3为例:


这里写图片描述

x,y 坐标除以宽高

上图的两个人具有不同的尺度,因为他都是人,我们得到的特征相同。假设我们得到的特征为&#x03D5;1,&#x03D5;2” role=”presentation” style=”position: relative;”>ϕ1,ϕ2ϕ1,ϕ2。也就是说同一个x对应多个y,这明显不满足函数的定义。边框回归学习的是回归函数,然而你的目标却不满足函数定义,当然学习不到什么。

宽高坐标Log形式

我们想要得到一个放缩的尺度,也就是说这里限制尺度必须大于0。我们学习的tw,th” role=”presentation” style=”position: relative;”>tw,thtw,th怎么保证满足大于0呢?直观的想法就是EXP函数,如公式(3), (4)所示,那么反过来推导就是Log函数的来源了。

为什么IoU较大,认为是线性变换?

当输入的 Proposal 与 Ground Truth 相差较小时(RCNN 设置的是 IoU>0.6), 可以认为这种变换是一种线性变换, 那么我们就可以用线性回归来建模对窗口进行微调, 否则会导致训练的回归模型不 work(当 Proposal跟 GT 离得较远,就是复杂的非线性问题了,此时用线性回归建模显然不合理)。这里我来解释:

Log函数明显不满足线性函数,但是为什么当Proposal 和Ground Truth相差较小的时候,就可以认为是一种线性变换呢?大家还记得这个公式不?参看高数1。

limx=0log(1+x)=x” role=”presentation” style=”text-align: center; position: relative;”>limx=0log(1+x)=xlimx=0log(1+x)=x

现在回过来看公式(8):

tw=log&#x2061;(Gw/Pw)=log(Gw+Pw&#x2212;PwPw)=log(1+Gw&#x2212;PwPw)” role=”presentation” style=”text-align: center; position: relative;”>tw=log(Gw/Pw)=log(Gw+PwPwPw)=log(1+GwPwPw)tw=log⁡(Gw/Pw)=log(Gw+Pw−PwPw)=log(1+Gw−PwPw)

当且仅当Gw&#x2212;Pw” role=”presentation” style=”position: relative;”>GwPwGw−Pw=0的时候,才会是线性函数,也就是宽度和高度必须近似相等。

对于IoU大于指定值这块,我并不认同作者的说法。我个人理解,只保证Region Proposal和Ground Truth的宽高相差不多就能满足回归条件。x,y位置到没有太多限制,这点我们从YOLOv2可以看出,原始的边框回归其实x,y的位置相对来说对很大的。这也是YOLOv2的改进地方。详情请参考我的博客YOLOv2

总结

里面很多都是参考师兄在caffe社区的回答,本来不想重复打字的,但是美观的强迫症,让我手动把latex公式巴拉巴拉敲完,当然也为了让大家看起来顺眼。后面还有一些公式那块资料很少,是我在阅读paper+个人总结,不对的地方还请大家留言多多指正。

        <link rel="stylesheet" href="https://csdnimg.cn/release/phoenix/template/css/markdown_views-ea0013b516.css">
            </div>
  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值