衆所周知,Yolo v2最大的改進就是錨框機制,并且錨框的生成不是和以前靠經驗所得,而是通過更加科學K-Means聚類獲得的。那麼這個Anchor是如何與yolo相結合的呢?
首先來了解一下錨框機制,錨框(Anchor)就是預設好的一堆虛拟的框,它們的尺寸和大小是固定的,但是它們與物體的真實标注框(GT)存在一些差異。人為設定錨框參數時要盡量使它能夠貼近真實框。我們期望錨框是接近于真實框的,但是這顯然是不可能的(因為真實框大小不一樣,而錨框尺寸是固定不變的)。但是我們可以通過網絡預測的結果去調整錨框,使其接近于真實框。
這個過程用數學公式就可以表達為下面圖裡的内容:
首先需要明确的一點是,yolo網絡輸出的結果是一個偏移量,表示anchor與GT的內插補點,我們需要通過公式去調整,使anchor與預測結果的融合去貼近GT.
公式的前面兩行是通過網絡的預測的偏移量對anchors進行調整來獲得預測的框。其中粉色的是網絡預測的偏移量,藍色的是計算出來的預測框,紅色的是預設anchor的尺寸。至于為什麼中心點的計算要除以anchor的寬和高是為了歸一化,預測框的寬高取log是為了抑制過長或寬物體對整個loss的影響。
公式的後面兩行是通過GT與anchor計算出偏移量,用灰色的框進行表示,這個是計算出來的,它的目的是為了與網絡預測的偏移量計算損失,來調整網絡參數。
上面講的是錨框機制,這個機制在yolo中又做了一些改進。Yolo中引入網格(cell或者grid)這個機率,将錨框的計算方式做了一個簡化,如圖所示:
右邊的公式是改進後的錨框調整公式,左邊的是原來的調整公式。由于yolo是那個物體的中心落在那個網格,那麼這個網格就負責預測這個物體。如果物體的中心落在了這個網格,那麼這個物體的中心坐标就應該是網絡預測的偏移量加上這個網格的坐标。(例如,預測的偏移量為0.2,屬于預測這個物體的網格是10,那麼最終的預測的框的坐标就是10.2)也就對應了右邊式子的第一行。其中,藍色是預測結果,紅色是網格的值,等号坐标是網絡預測的偏移量。為什麼要加sigmoid呢?是為了限制網絡的預測偏移量在這一個網格内進行調整。這樣對錨框進行調整後,即将錨框與yolo結合起來,又省下了歸一化操作。