Bounding-Box regression

原文鏈接:https://blog.csdn.net/zijin0802034/article/details/77685438

最近一直看檢測有關的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)
來表示, 分別表示窗口的中心點座標和寬高。 對於圖 2, 紅色的框 P 代表原始的Proposal, 綠色的框 G 代表目標的 Ground Truth, 我們的目標是尋找一種關係使得輸入原始的窗口 P 經過映射得到一個跟真實窗口 G 更接近的迴歸窗口G^


這裏寫圖片描述

邊框迴歸的目的既是:給定(Px,Py,Pw,Ph)
尋找一種映射f, 使得f(Px,Py,Pw,Ph)=(Gx^,Gy^,Gw^,Gh^) 並且(Gx^,Gy^,Gw^,Gh^)≈(Gx,Gy,Gw,Gh)

邊框迴歸怎麼做的?

那麼經過何種變換才能從圖 2 中的窗口 P 變爲窗口G^

呢? 比較簡單的思路就是: 平移+尺度放縮

    先做平移(Δx,Δy)

, Δx=Pwdx(P),Δy=Phdy(P) 這是R-CNN論文的:
G^x=Pwdx(P)+Px,(1)
G^y=Phdy(P)+Py,(2)
然後再做尺度縮放(Sw,Sh)
, Sw=exp(dw(P)),Sh=exp(dh(P)), 對應論文中:
G^w=Pwexp(dw(P)),(3)
G^h=Phexp(dh(P)),(4)

觀察(1)-(4)我們發現, 邊框迴歸學習就是dx(P),dy(P),dw(P),dh(P)

這四個變換。下一步就是設計算法那得到這四個映射。

線性迴歸就是給定輸入的特徵向量 X, 學習一組參數 W, 使得經過線性迴歸後的值跟真實值 Y(Ground Truth)非常接近. 即Y≈WX

。 那麼 Bounding-box 中我們的輸入以及輸出分別是什麼呢?
Input:

RegionProposal→P=(Px,Py,Pw,Ph)
,這個是什麼? 輸入就是這四個數值嗎?其實真正的輸入是這個窗口對應的 CNN 特徵,也就是 R-CNN 中的 Pool5 feature(特徵向量)。 (注:訓練階段輸入還包括 Ground Truth, 也就是下邊提到的t∗=(tx,ty,tw,th)

)
Output:

需要進行的平移變換和尺度縮放 dx(P),dy(P),dw(P),dh(P)
, 或者說是Δx,Δy,Sw,Sh 。 我們的最終輸出不應該是 Ground Truth 嗎? 是的, 但是有了這四個變換我們就可以直接得到 Ground Truth, 這裏還有個問題, 根據(1)~(4)我們可以知道, P 經過 dx(P),dy(P),dw(P),dh(P) 得到的並不是真實值 G, 而是預測值G^。 的確, 這四個值應該是經過 Ground Truth 和 Proposal 計算得到的真正需要的平移量(tx,ty) 和尺度縮放(tw,th)


這也就是 R-CNN 中的(6)~(9):
tx=(Gx−Px)/Pw,(6)

ty=(Gy−Py)/Ph,(7)

tw=log(Gw/Pw),(8)

th=log(Gh/Ph),(9)

那麼目標函數可以表示爲 d∗(P)=wT∗Φ5(P)
, Φ5(P)是輸入 Proposal 的特徵向量,w∗是要學習的參數(*表示 x,y,w,h, 也就是每一個變換對應一個目標函數) , d∗(P) 是得到的預測值。 我們要讓預測值跟真實值t∗=(tx,ty,tw,th)

差距最小, 得到損失函數爲:

Loss=∑iN(ti∗−w^T∗ϕ5(Pi))2

函數優化目標爲:

W∗=argminw∗∑iN(ti∗−w^T∗ϕ5(Pi))2+λ||w^∗||2

利用梯度下降法或者最小二乘法就可以得到 w∗


爲什麼寬高尺度會設計這種形式?

這邊我重點解釋一下爲什麼設計的tx,ty
爲什麼除以寬高,爲什麼tw,th

會有log形式!!!

首先CNN具有尺度不變性, 以圖3爲例:

這裏寫圖片描述

x,y 座標除以寬高

上圖的兩個人具有不同的尺度,因爲他都是人,我們得到的特徵相同。假設我們得到的特徵爲ϕ1,ϕ2
,那麼一個完好的特徵應該具備ϕ1=ϕ。ok,如果我們直接學習座標差值,以x座標爲例,xi,pi 分別代表第i個框的x座標,學習到的映射爲f, f(ϕ1)=x1−p1,同理f(ϕ2)=x2−p2。從上圖顯而易見,x1−p1≠x2−p1

。也就是說同一個x對應多個y,這明顯不滿足函數的定義。邊框迴歸學習的是迴歸函數,然而你的目標卻不滿足函數定義,當然學習不到什麼。
寬高座標Log形式

我們想要得到一個放縮的尺度,也就是說這裏限制尺度必須大於0。我們學習的tw,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

現在回過來看公式(8):

tw=log(Gw/Pw)=log(Gw+Pw−PwPw)=log(1+Gw−PwPw)

當且僅當Gw−Pw

=0的時候,纔會是線性函數,也就是寬度和高度必須近似相等。

對於IoU大於指定值這塊,我並不認同作者的說法。我個人理解,只保證Region Proposal和Ground Truth的寬高相差不多就能滿足迴歸條件。x,y位置到沒有太多限制,這點我們從YOLOv2可以看出,原始的邊框迴歸其實x,y的位置相對來說對很大的。這也是YOLOv2的改進地方。詳情請參考我的博客YOLOv2。
總結

裏面很多都是參考師兄在caffe社區的回答,本來不想重複打字的,但是美觀的強迫症,讓我手動把latex公式巴拉巴拉敲完,當然也爲了讓大家看起來順眼。後面還有一些公式那塊資料很少,是我在閱讀paper+個人總結,不對的地方還請大家留言多多指正。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章