官方DarkNet YOLO V3損失函數完結版
1. 前言
有了前面兩篇文章的鋪墊,基本上 YOLOV3 的損失函數就比較明確了。然後在上一節還存在一個表述錯誤,那就是在坐標損失中針對 bbox 的寬度w和高度h仍然是 MSE Loss,而針對 bbox 的左上角坐標x,y的損失則是我們YOLOV3損失函數再思考 Plus 推出來的 BCE Loss。接下來我就完整的寫一下根據 DarkNet 官方源碼推出來的 YOLOV3 的 Loss。
2. DarkNet YOLOV3 Loss
直接寫出公式,注意帶*
號的變量代表預測值,不帶*
號的表示標籤:
loss(object)=\sum_{i=0}^{K\times K}\sum_{j=0}^MI_{ij}^{obj}(2-w_i*h_i)(-x_i*log(\hat{x_i})-(1-x_i)*log(1-x_i^*)) +
\sum_{i=0}^{K\times K}\sum_{j=0}^MI_{ij}^{obj}(2-w_i*h_i)(-y_i*log(\hat{y_i})-(1-y_i)*log(1-y_i^*)) +
\sum_{i=0}^{K\times K}\sum_{j=0}^MI_{ij}^{obj}(2-w_i*h_i)[(w_i-w_i^*)^2+(h_i-h_i^*)^2] –
\sum_{i=0}^{K\times K}\sum_{j=0}^MI_{ij}^{obj}[C_ilog(C_i^*)+(1-C_i)log(1-C_i^*)]-
\sum_{i=0}^{K\times K}\sum_{j=0}^MI_{ij}^{noobj}[C_ilog(C_i^*)+(1-C_i)log(1-C_i^*)]-
\sum_{i=0}^{K\times K}\sum_{j=0}^MI_{ij}^{obj}\sum_{c\in classes}[p_i(c)log(p_i^*(c))+(1-p_i(c))log(1-p_i^*(c))]
我們再來解釋一下這個公式。
在 YOLOV3 中,Loss 分成三個部分:
- 一個是目標框位置x,y,w,h(左上角和長寬)帶來的誤差,也即是 box 帶來的 loss。而在 box 帶來的 loss 中又分為x,y帶來的 BCE Loss 以及w,h帶來的 MSE Loss。
- 一個是目標置信度帶來的誤差,也就是 obj 帶來的 loss(BCE Loss)。
- 最後一個是類別帶來的誤差,也就是 class 帶來的 loss(類別數個 BCE Loss)。
另外值得注意的一個點是網上大多數博客寫這個損失的時候都加了\lambda_{coord},\lambda_{obj},\lambda_{noobj}參數,但我們打開YOLOV3.cfg發現,原版的 YOLOV3 中並沒有這幾個參數,並且代碼中也沒有體現,所以正確的公式應當去掉這幾個參數。
3. 答讀者問
下面選幾個留言區裏面讀者的問題來回答一下。
3.1 來自 kun
Q: 如果坐標中心點用 BCE Loss 的話,那麼是怎麼設置標籤呢,BCE 的標籤不是 0 或者 1 嗎?
A: 首先 YOLOV3 沒有中心點一說,只有左上角的點。那麼它是怎麼設置標籤呢?首先在 YOLOV2/V3 裏面引入了一個直接坐標預測的概念,可以看看下面的幾個圖片:
從圖 2 可以看出,最終得到的邊框坐標值是bx,by,bw,bh
,即邊界框相對於特徵圖的位置和大小,是我們需要預測的輸出坐標值。但是,網絡實際上學習的東西是tx,ty,tw,th(這和損失函數公式裏面的xywh一致,前面已經說明),其中tx,ty 是預測的坐標偏移值,tw,th 是尺度縮放,有了這4個偏移量自然可以根據前面的公式計算出真正的bx,by,bw,bh這 4 個坐標。
我們現在可以正面解答這位同學的問題了,標籤該怎麼設置呢?BCE 的標籤不是 0 或者 1? 在二分類問題並且使用 One-Hot 編碼的情況下確實是這樣的,但是我們這裡並不是分類,我們要做的是預測出來的偏移值靠近原始的 GT 相對於於c_x,c_y的偏移值,所以這個標籤就是提前算好,代碼如下:
3.2 磕鹽小白喵
Q: YOLOV3 置信度誤差 label 中的置信度數值,也就是公式中的 C,還是之前 YOLOV1 裏面 Ground Truth 和預測得到的 bbox 之間的 IOU 嗎?看到有些博客上說是當第k個 anchor box 有目標時設為1否則為 0。對此有些疑惑,是否能解答一下?
A: 這個問題主要是沒有對 YOLOv3 的匹配策略搞清楚,其實我們公眾號出版的 PDF 說得很清楚了,如下:
而 YOLOV1 的正負樣本制定規則是啥呢?
輸入圖片為448\times 448,yolo 將其劃為為 49(7\times 7)個 cell, 每個 cell 只負責預測一個物體框, 如果這個物體的中心點落在了這個 cell 中,這個 cell 就負責預測這個物體,然後對於 2 個 box 來說,依然選擇 IOU 最大的那個,當然 YOLOV1 的損失沒有這麼複雜,感興趣可以去看我之前的文章。
有了匹配策略,你的問題自然就解決了,不過私以為最好的方式仍然是讀源碼。
4. 對讀者想說的話
這個公眾號是我在 2019 年的 11 月創建的,過去了半年時間了,也快有上萬小夥伴關注了我們。我的初心就是建立一個超大的 CV 知識庫(後面我們也會拓展到機器學習和 GAN),真正的傳播知識,提高自己的同時幫助一些入門的人。
然後,非常感謝公眾號的三個運營者,以及一些投稿的作者們對我的信任。我相信,就算 CV 崗位某一天真的面臨大規模縮減,大家被迫轉行(開個玩笑而已),但是通過這個公眾號學到的思維和解決問題的方式可以對大家有一些幫助。
最後,謝謝大家,過幾天粉絲突破一萬給大家抽個獎。
歡迎關注 GiantPandaCV, 在這裡你將看到獨家的深度學習分享,堅持原創,每天分享我們學習到的新鮮知識。( • ̀ ω•́ )✧
有對文章相關的問題,或者想要加入交流群,歡迎添加 BBuf 微信:
為了方便讀者獲取資料以及我們公眾號的作者發佈一些 GitHub 工程的更新,我們成立了一個 QQ 群,二維碼如下,感興趣可以加入。