SSD的損失函式設計

是蒼啊!發表於2020-12-22

這篇部落格介紹SSD的損失函式設計。想要理解損失函式,需要從錨框與Ground truth box 的匹配策略講起,此外,本文還闡述了SSD中描述的難例挖掘(hard negative mining)。 我們先從SSD中的匹配策略說起:

一.匹配策略

SSD會生成很多錨框,然後對比Ground Truth Boxes 進行微調。相比於Ground Truth Box, 錨框的數量是很巨大的。因此,怎樣進行錨框和Ground Truth Box的匹配是一個需要做好的精細活。
匹配的大體思路是把一個錨框和它重疊程度最大的Ground Truth Box進行匹配;如果沒有一個Ground Truth Box能和某個錨框匹配,那麼就把這個錨框和背景框匹配。此外,SSD中還要求每一個Ground Truth Box起碼有一個錨框和其匹配。
基於以上描述,匹配策略有如下兩條:

1.為Ground Truth Box匹配錨框

首先,應保證每個Ground Truth Box起碼匹配一個錨框,所以先為Ground Truth Box錨框。即:
為每一個ground truth box尋找和其有最大IOU(論文中叫jaccard overlap)的錨框,把Ground Truth Box與該錨框匹配。(不用擔心會沒有錨框覆蓋到Ground Truth Box,因為錨框的生成幾乎是逐畫素的)

2.為錨框匹配Ground Truth Box

完成規則1後,對剩餘的還沒有配對的錨框與任意一個ground truth box嘗試配對,只要兩者之間的IOU大於閾值(一般是0.5),那麼該錨框也與這個ground truth進行匹配。
按照這樣的規則匹配錨框,可能會導致某一Ground Truth Box同時匹配了多個錨框,這不要緊;我們只要保證錨框只匹配一個Ground Truth Box即可(舉一個極端例子,如果每個錨框都能和所有Ground Truth Box匹配,那我們就不用訓練了)。

3.匹配結果思考

1.SSD會生成大量的錨框(遍佈於整張影像),而Ground Truth Box只佔據了影像的很小一部分割槽域,這注定了絕大部分錨框都會與背景框匹配。這樣的錨框被稱作負例(negative examples)。
2.如果某個Ground Truth Box A所對應最大IOU的錨框小於閾值,並且所匹配的錨框卻與另外一個Ground Truth Box B的IOU大於閾值,那麼該錨框應該選A,因為首先要確保每個ground truth一定有一個prior bbox與之匹配。

4.示例

在這裡插入圖片描述
影像中有7個紅色的框代表先驗框,黃色的是ground truths,在這幅影像中有三個真實的目標。按照前面列出的步驟將生成以下匹配項:在這裡插入圖片描述

二.損失函式

1.損失函式

SSD將總體的目標損失函式定義為 定位損失(loc)和置信度損失(conf)的加權和,見公式(1):
在這裡插入圖片描述
其中N是匹配到GT(Ground Truth)的prior bbox數量,如果N=0,則將損失設為0;而 α 引數用於調整confidence loss和location loss之間的比例,預設 α=1。

再展示一張圖片,給你一個感性的認識:在這裡插入圖片描述
圖片來自:https://blog.csdn.net/qq_30815237/article/details/90292639?ops_request_misc=%25257B%252522request%25255Fid%252522%25253A%252522160864080816780288223823%252522%25252C%252522scm%252522%25253A%25252220140713.130102334…%252522%25257D&request_id=160864080816780288223823&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2alltop_click~default-1-90292639.nonecase&utm_term=ssd

2.confidence loss

在這裡插入圖片描述
confidence loss是在多類別置信度©上的softmax loss。其中i指代搜尋框序號,j指代真實框序號,p指代類別序號,p=0表示背景。其中 x i j P x^P_{ij} xijP中取i表示第i個錨框匹配到第 j 個GT box,而這個GT box的類別為 p 。 C i P C^P_i CiP表示第i個搜尋框對應類別p的預測概率。此處有一點需要關注,公式前半部分是正樣本(Pos)的損失,即分類為某個類別的損失(不包括背景),後半部分是負樣本(Neg)的損失,也就是類別為背景的損失。

3.location loss

而location loss(位置迴歸)是典型的 s m o o t h L 1 smooth _{L1} smoothL1 loss。
在這裡插入圖片描述
其中,l為預測框,g為ground truth。(cx,xy)為補償(regress to offsets)後的預設框d的中心,(w,h)為預設框的寬和高。
關於為什麼要使用 s m o o t h L 1 smooth _{L1} smoothL1 loss,強烈建議閱讀知乎中點贊最高的回答,清晰易懂,能學到很多!
https://www.zhihu.com/question/58200555

三.難負例挖掘(Hard negative mining)

值得注意的是,一般情況下negative prior bboxes數量 >> positive prior bboxes數量,直接訓練會導致網路過於重視負樣本,預測效果很差。為了保證正負樣本儘量平衡,我們這裡使用SSD使用的線上難例挖掘策略(hard negative mining),即依據confidience loss對屬於負樣本的prior bbox進行排序,只挑選其中confidience loss高的bbox進行訓練,將正負樣本的比例控制在positive:negative=1:3。其核心作用就是隻選擇負樣本中容易被分錯類的困難負樣本來進行網路訓練,來保證正負樣本的平衡和訓練的有效性。

舉個例子:假設在這 441 個 prior bbox 裡,經過匹配後得到正樣本先驗框P個,負樣本先驗框 441−P 個。將負樣本prior bbox按照prediction loss從大到小順序排列後選擇最高的M個prior bbox。這個M需要根據我們設定的正負樣本的比例確定,比如我們約定正負樣本比例為1:3時。我們就取M=3P,這M個loss最大的負樣本難例將會被作為真正參與計算loss的prior bboxes,其餘的負樣本將不會參與分類損失的loss計算。

參考:
https://datawhalechina.github.io/dive-into-cv-pytorch/#/chapter03_object_detection_introduction/3_5

相關文章