动手学CV-目标检测入门教程5:损失函数
3.5 損失函數(shù)
本文來自開源組織 DataWhale 🐳 CV小組創(chuàng)作的目標(biāo)檢測入門教程。
對應(yīng)開源項目 《動手學(xué)CV-Pytorch》 的第3章的內(nèi)容,教程中涉及的代碼也可以在項目中找到,后續(xù)會持續(xù)更新更多的優(yōu)質(zhì)內(nèi)容,歡迎??。
如果使用我們教程的內(nèi)容或圖片,請在文章醒目位置注明我們的github主頁鏈接:https://github.com/datawhalechina/dive-into-cv-pytorch
3.5.1 Matching strategy (匹配策略):
我們分配了許多prior bboxes,我們要想讓其預(yù)測類別和目標(biāo)框信息,我們先要知道每個prior bbox和哪個目標(biāo)對應(yīng),從而才能判斷預(yù)測的是否準(zhǔn)確,從而將訓(xùn)練進(jìn)行下去。
不同方法 ground truth boxes 與 prior bboxes 的匹配策略大致都是類似的,但是細(xì)節(jié)會有所不同。這里我們采用SSD中的匹配策略,具體如下:
第一個原則: 從ground truth box出發(fā),尋找與每一個ground truth box有最大的jaccard overlap的prior bbox,這樣就能保證每一個groundtruth box一定與一個prior bbox對應(yīng)起來(jaccard overlap就是IOU,如圖3-26所示,前面介紹過)。 反之,若一個prior bbox沒有與任何ground truth進(jìn)行匹配,那么該prior bbox只能與背景匹配,就是負(fù)樣本。
圖3-26 IOU一個圖片中g(shù)round truth是非常少的,而prior bbox卻很多,如果僅按第一個原則匹配,很多prior bbox會是負(fù)樣本,正負(fù)樣本極其不平衡,所以需要第二個原則。
第二個原則: 從prior bbox出發(fā),對剩余的還沒有配對的prior bbox與任意一個ground truth box嘗試配對,只要兩者之間的jaccard overlap大于閾值(一般是0.5),那么該prior bbox也與這個ground truth進(jìn)行匹配。這意味著某個ground truth可能與多個Prior box匹配,這是可以的。但是反過來卻不可以,因為一個prior bbox只能匹配一個ground truth,如果多個ground truth與某個prior bbox的 IOU 大于閾值,那么prior bbox只與IOU最大的那個ground truth進(jìn)行匹配。
注意:第二個原則一定在第一個原則之后進(jìn)行,仔細(xì)考慮一下這種情況,如果某個ground truth所對應(yīng)最大IOU的prior bbox小于閾值,并且所匹配的prior bbox卻與另外一個ground truth的IOU大于閾值,那么該prior bbox應(yīng)該匹配誰,答案應(yīng)該是前者,首先要確保每個ground truth一定有一個prior bbox與之匹配。
用一個示例來說明上述的匹配原則:
圖3-27圖像中有7個紅色的框代表先驗框,黃色的是ground truths,在這幅圖像中有三個真實的目標(biāo)。按照前面列出的步驟將生成以下匹配項:
圖3-283.5.2 損失函數(shù)
下面來介紹如何設(shè)計損失函數(shù)。
將總體的目標(biāo)損失函數(shù)定義為 定位損失(loc)和置信度損失(conf)的加權(quán)和:
L(x,c,l,g)=1N(Lconf(x,c)+αLloc(x,l,g))(1)L(x,c,l,g) = \frac{1}{N}(L_{conf}(x,c)+\alpha L_{loc} (x,l,g)) (1) L(x,c,l,g)=N1?(Lconf?(x,c)+αLloc?(x,l,g))(1)
其中N是匹配到GT(Ground Truth)的prior bbox數(shù)量,如果N=0,則將損失設(shè)為0;而 α 參數(shù)用于調(diào)整confidence loss和location loss之間的比例,默認(rèn) α=1。
confidence loss是在多類別置信度c上的softmax loss,公式如下:
Lconf(x,c)=?∑i∈PosNxijplog(c^ip)?∑i∈Neglog(c^i0)Wherec^ip=exp(cip)∑pexp(cip)(2)L_{conf}(x,c) = -\sum_{i \in Pos}^N x^{p}_{ij} log(\hat{c}^{p}_{i}) - \sum_{i \in Neg} log(\hat{c}^{0}_{i}) Where \hat{c}^{p}_{i} = \frac{exp(c^{p}_{i})}{\sum_p exp(c^{p}_{i})} (2) Lconf?(x,c)=?i∈Pos∑N?xijp?log(c^ip?)?i∈Neg∑?log(c^i0?)Wherec^ip?=∑p?exp(cip?)exp(cip?)?(2)
其中i指代搜索框序號,j指代真實框序號,p指代類別序號,p=0表示背景。其中xijp={1,0}x^{p}_{ij}=\left\{1,0\right\}xijp?={1,0} 中取1表示第i個prior bbox匹配到第 j 個GT box,而這個GT box的類別為 p 。CipC^{p}_{i}Cip? 表示第i個搜索框?qū)?yīng)類別p的預(yù)測概率。此處有一點需要關(guān)注,公式前半部分是正樣本(Pos)的損失,即分類為某個類別的損失(不包括背景),后半部分是負(fù)樣本(Neg)的損失,也就是類別為背景的損失。
而location loss(位置回歸)是典型的smooth L1 loss
Lloc(x,l,g)=∑i∈Posm∈{cx,cy,w,h}N∑xijksmoothL1(lim?g^jm)(3)L_{loc}(x,l,g) = \sum_{i \in Pos m \in \left\{c_x,c_y,w,h\right\}}^N \sum x^{k}_{ij} smooth_{L1}(l^{m}_{i}-\hat{g}^{m}_{j}) (3) Lloc?(x,l,g)=i∈Posm∈{cx?,cy?,w,h}∑N?∑xijk?smoothL1?(lim??g^?jm?)(3)
g^jcx=(gjcx?dicx)/diw\hat{g}^{c_x}_{j}=(g^{c_x}_{j}-d^{c_x}_{i})/d^{w}_{i} g^?jcx??=(gjcx???dicx??)/diw?
g^jcy=(gjcy?dicy)/dih\hat{g}^{c_y}_{j}=(g^{c_y}_{j}-d^{c_y}_{i})/d^{h}_{i} g^?jcy??=(gjcy???dicy??)/dih?
g^jw=log(gjwdiw)\hat{g}^{w}_{j}=log(\frac{g^{w}_{j}}{d^{w}_{i}}) g^?jw?=log(diw?gjw??)
g^jh=log(gjhdih)\hat{g}^{h}_{j}=log(\frac{g^{h}_{j}}{d^{h}_{i}}) g^?jh?=log(dih?gjh??)
其中,l為預(yù)測框,g為ground truth。(cx,xy)為補償(regress to offsets)后的默認(rèn)框d的中心,(w,h)為默認(rèn)框的寬和高。更詳細(xì)的解釋看-看下圖:
3.5.3 Hard negative mining:
值得注意的是,一般情況下negative prior bboxes數(shù)量 >> positive prior bboxes數(shù)量,直接訓(xùn)練會導(dǎo)致網(wǎng)絡(luò)過于重視負(fù)樣本,預(yù)測效果很差。為了保證正負(fù)樣本盡量平衡,我們這里使用SSD使用的在線難例挖掘策略(hard negative mining),即依據(jù)confidience loss對屬于負(fù)樣本的prior bbox進(jìn)行排序,只挑選其中confidience loss高的bbox進(jìn)行訓(xùn)練,將正負(fù)樣本的比例控制在positive:negative=1:3。其核心作用就是只選擇負(fù)樣本中容易被分錯類的困難負(fù)樣本來進(jìn)行網(wǎng)絡(luò)訓(xùn)練,來保證正負(fù)樣本的平衡和訓(xùn)練的有效性。
舉個例子:假設(shè)在這 441 個 prior bbox 里,經(jīng)過匹配后得到正樣本先驗框P個,負(fù)樣本先驗框 441?P 個。將負(fù)樣本prior bbox按照prediction loss從大到小順序排列后選擇最高的M個prior bbox。這個M需要根據(jù)我們設(shè)定的正負(fù)樣本的比例確定,比如我們約定正負(fù)樣本比例為1:3時。我們就取M=3P,這M個loss最大的負(fù)樣本難例將會被作為真正參與計算loss的prior bboxes,其余的負(fù)樣本將不會參與分類損失的loss計算。
3.5.4 小結(jié)
本小節(jié)介紹的內(nèi)容圍繞如何進(jìn)行訓(xùn)練展開,主要是3塊:
- 先驗框與GT框的匹配策略
- 損失函數(shù)計算
- 難例挖掘
這3部分是需要結(jié)合在一起理解,我們再整個梳理下計算loss的步驟
1)先驗框與GT框的匹配
按照我們介紹的方案,為每個先驗框都分配好類別,確定是正樣本還是負(fù)樣本。
2)計算loss
按照我們定義的損失函數(shù)計算 分類loss 和 目標(biāo)框回歸loss
負(fù)樣本不計算目標(biāo)框的回歸loss
3)難例挖掘
上面計算的loss中分類loss的部分還不是最終的loss
因為負(fù)樣本先驗框過多,我們要按一定的預(yù)設(shè)比例,一般是1:3,將loss最高的那部分負(fù)樣本先驗框拿出來,其余的負(fù)樣本忽略,重新計算分類loss
完整loss計算過程的代碼見model.py中的 MultiBoxLoss 類。
共勉:這一小節(jié)是整個章節(jié)中最難理解,也是代碼最難啃的部分,堅持就是勝利~
總結(jié)
以上是生活随笔為你收集整理的动手学CV-目标检测入门教程5:损失函数的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 文件系统应用笔记之一:FatFS在STM
- 下一篇: mysql 半同步 配置_Mysql 半