YOLO v2和V3 關於設置生成anchorbox,Boundingbox的個人理解

PS:這篇文章是自己學習紀錄下的筆記,主要是通過閱讀paddle復現的yolov3源碼,其中代碼註釋和圖例非常詳細。

https://www.paddlepaddle.org.cn/tutorials/projectdetail/356456#anchor-21

不對的地方還請指正!!感謝

網上有很多優秀博客,介紹了yolov2的設計思想以及實現過程。絕大部分我都翻閱了一遍,也看了論文,找了視頻看了。

這篇文章只說明anchorbox 和boundingbox之間的關係,想學習YOLOv2和v3整體的過程可參考這個:https://zhuanlan.zhihu.com/p/47575929

https://www.jianshu.com/p/d13ae1055302

正文:

首先看了 yolov1 過程都比較直接,直接對框位置進行迴歸,選擇最大IOU,還算好理解。隨後我看了yolov2的博客和論文,卡在了聚類生成anchorbox,框迴歸得到偏移值t後,如何確定位置這裏。

我一直以爲是類似RCNN中,先對每一個anchor點周圍生成9種anchorbox,再框迴歸得到偏移量去調整框的位置得到boundingbox,最後利用BBox和GT的IOU去篩選框。深受這種思想的影響,所以我帶着這種主觀意識去看YOLO真的看得我頭昏腦大。

先上論文的圖:

 

yolo v2 借鑑了RPN的技巧,但是是略有不同的。

anchor box:就是上圖的黑色虛線框,我覺得這個圖有點誤導人,這個是框迴歸產生偏移之後的結果,但是anchorbox也隨着變動了位置,具體原因見下面的分析。

BoundingBox:藍色框,通過迴歸得到偏移值後,以anchorbox爲基準進行尺度縮放變換後的框。

其實通過聚類得到的只是先驗框又叫錨框(anchorbox)的高寬(是一個固定值),(網上有些博客把anchorBox和boudingBox混淆了,讓我以爲anchorbox是每一次都在變化調整的,搞暈了),只是用幾個固定的寬高比例來描述anchorbox的尺寸信息的,所以論文中聚類得到的是5種box的高寬,不需要中心座標!那麼"中心座標"在哪呢? 回憶,我們在yolo中是將圖片劃分成N*N的塊,每一塊都是原圖片的一小塊(如上圖的紅色小塊),而anchorbox的這個所謂的中心點其實可以看作是每一塊的左上角座標,如上圖的箭頭所指點C,其中Cx和Cy是C點的座標,這裏先假設tx,ty,tw,th是網絡輸出的預測值,這個是代表座標的偏移值(圖上的σ定義爲sigmoid激活函數(將函數值約束到[0,1]),這樣就可以使得偏移後的C點也就是中心點落在紅色這一塊中)。而計算bw和bh就是我們唯一用到'anchorbox'的地方,這裏我們只用到了它的寬高(Pw和Ph)。exp(tw),exp(th)代表着縮放比例,將exp(tw),exp(th) 和(Pw,Ph)相乘後得到縮放後的長寬(參考上圖),最後得到的這個(bx,by,bw,bh)就是描述的BoundingBox(預測框)的信息。

那麼如何去描述他們的損失呢? 

首先,yolo按照上面同樣的方式先用GroundTruth(真實框)和anchorbox(先驗框,錨框)算出偏移和縮放比,設爲dx,dy,dh,dw,這個即標籤label,

然後網絡輸出的BoundingBox(預測框)是tx,ty,th,tw四個值,用來代表和anchorbox(先驗框,錨框)的偏移和縮放比。

我們的目標是通過學習(tx,ty,tw,th)這四個值去微調anchorbox(先驗框,錨框)得到BoundingBox(預測框),使得BoundingBox不斷接近GroundTruth(真實框)也就是(tx,ty,tw,th)不斷的接近(dx,dy,dh,dw),梯度下降的目標也就是縮小這兩者的LOSS,這就是yolov2中的迴歸方法。 (具體YOLO損失函數可以網上搜索)

圖片來源:https://zhuanlan.zhihu.com/p/77051828

 

 

 

 

 

 

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