目標定位與檢測系列(15):目標檢測常用損失函數


一般的目標檢測模型包含兩類損失函數,一類是類別損失(分類),另一類是位置損失(迴歸)。這兩類損失函數往往用於檢測模型最後一部分,根據模型輸出(類別和位置)和實際標註框(類別和位置)分別計算類別損失和位置損失。

類別損失

Cross Entropy Loss

交叉熵損失是基於“熵”這個概念,熵用來衡量信息的不確定性。對於概率分佈爲p(X)p(X)的隨機變量XX,熵可以表示爲:
f(x)={p(x)logp(x)dxxxlogp(x)x f(x)=\left\{ \begin{aligned} -\int{p(x)\log p(x)dx} & &{x連續}\\ -\sum_{x}\log p(x) & &{x離散} \end{aligned} \right.
XX分佈的不確定性越大,對應的熵越大(對應log(x)\log(x))積分面積),反之,熵越小。當把熵用於分類問題時,分類的結果越好(可以理解爲預測爲某一類的概率遠高於其他類別的概率),不確定性越低,熵就越小;反之,分類的結果越差(可以理解爲預測的各個類別的概率都比較高,沒有明確的分界線),此時不確定性越強,熵就越高。

針對以上分析,可以把熵用於分類問題的損失,根據分類的類別數量不同,可以分爲二元交叉熵損失和多分類交叉熵損失。

對於二分類問題(即0-1分類),即屬於第1類的概率爲pp,屬於第0類的概率爲1p1-p。則二元交叉熵損失可表示爲:
L={log(1p)y=0log(p)y=1 L=\left\{ \begin{aligned} -\log (1-p) & &{y=0}\\ -\log (p) & &{y=1} \end{aligned} \right.
也可以統一寫成如下形式:
L=ylog(p)(1y)log(1p) L = -y* \log(p) - (1-y) * \log(1-p)
可以理解爲:當實際類別爲1時,我們希望預測爲類別1的概率高一點,此時log(p)log(p)的值越小,產生的損失越小;反之,我們希望預測爲類別0的概率高一點,此時log(1p)log(1-p)的值越小,產生的損失也越小。在實際應用中,二分類的類別概率通常採用sigmoid函數把結果映射到(0,1)之間。

對比二元交叉熵損失,可以推廣到多分類交叉熵損失,定義如下:
L(Xi,Yi)=j=1cyijlog(pij) L(X_i, Y_i) = -\sum_{j=1}^{c}{y_{ij} * \log(p_{ij})}
其中,YiY_i是一個one-hot向量,並定義如下:
yij={1ij0otherwise y_{ij}=\left\{ \begin{aligned} 1 & &{第i個樣本屬於類別j}\\ 0 & &{otherwise} \end{aligned} \right.
pijp_{ij}表示第ii個樣本屬於類別j的概率。在實際應用中通常採用SoftMax函數來得到樣本屬於每個類別的概率。

Focal Loss

Focal Loss首次在目標檢測框架RetinaNet中提出,RetinaNet可以參考

目標檢測論文筆記:RetinaNet

它是對典型的交叉信息熵損失函數的改進,主要用於樣本分類的不平衡問題。爲了統一正負樣本的損失函數表達式,首先做如下定義:
pt={py=11py=0 p_t=\left\{ \begin{aligned} p & &{y =1}\\ 1-p & &{y=0} \end{aligned} \right.
ptp_t在形式上就表示被預測爲對應的正確類別的置信度。這樣二分類交叉信息熵損失就可以重寫成如下形式:
CE(p,y)=CE(pt)=log(pt) CE(p,y) = CE(p_t) = -\log(p_t)
爲了平衡多數類和少數類的損失,一種常規的思想就是在損失項前乘上一個平衡係數α(0,1)\alpha\in(0,1),當類別爲正時,取αt=α\alpha_t=\alpha,當類別爲負時,取αt=1α\alpha_t=1-\alpha,這樣得到的帶有平衡係數的交叉信息熵損失定義如下:
CE(pt)=αlog(pt) CE(p_t) = -\alpha \log(p_t)
這樣,根據訓練樣本中正負樣本數量來選取α\alpha的值,就可以達到平衡正負樣本的作用。然而,這樣做還不能對簡單和困難樣本區別對待,在目標檢測中,既要平衡多數類(背景)和少數類(包含目標的前景),還要平衡簡單樣本和困難樣本,而往往訓練過程中往往遇到的問題就是大量簡單的背景樣本佔據損失函數的主要部分。因此,還需要對上述帶有平衡係數的交叉信息熵損失做進一步的改進。於是就有了Focal Loss,它定義如下:
FL(pt)=(1pt)γlog(pt) FL(p_t) = -(1-p_t)^{\gamma} \log(p_t)
相比於上面的加了平衡係數α\alpha的損失函數相比,Focal Loss有以下兩點不同:

  • 固定的平衡係數α\alpha替換成了可變的平衡係數(1pt)(1-p_t)
  • 多了另外一個調節因子γ\gamma,且γ0\gamma\ge0

位置損失

L1 Loss

L1 loss即平均絕對誤差(Mean Absolute Error, MAE),指模型預測值和真實值之間距離的平均值。
MAE=n=1nf(xi)yin MAE=\frac{\sum_{n=1}^n{|f(x_i)-y_i|}}{n}
x=f(xiyi)x=f(x_i-y_i),對於單個樣本,L1 loss可表示爲:
MAE=f(xi)yi=x MAE= |f(x_i)-y_i|=|x|

L2 Loss

L2 loss即均方誤差損失(Mean Square Error, MSE),指預測值和真實值之差的平方的平均值。
MSE=n=1n(f(xi)yi)2n MSE=\frac{\sum_{n=1}^n{(f(x_i)-y_i)^2}}{n}
對於單個樣本,L2 loss可表示爲:
MSE=(f(xi)yi)2=x2 MSE = (f(x_i)-y_i)^2=x^2

Smooth L1 Loss

Smooth L1 loss是基於L1 loss修改得到,對於單個樣本,記xx爲預測值和真實值的差值,則對應的Smooth L1 loss可表示爲:
f(x)={0.5x2ifx<1x0.5otherwise f(x)=\left\{ \begin{aligned} 0.5x^2 & &{if|x|<1}\\ |x|-0.5 & &{otherwise} \end{aligned} \right.

IoU Loss

IoU類的損失函數都是基於預測框和標註框之間的IoU(交併比),記預測框爲PP,標註框爲GG,則對應的IoU可表示爲:
IoU=PGPG IoU = \frac{P \cap G}{P \cup G}
即兩個框的交集和並集的比值。IoU loss定義爲:
LI=1IoU L_I = 1 - IoU

GIoU Loss

IoU反映了兩個框的重疊程度,在兩個框不重疊時,IoU衡等於0,此時IoU loss恆等於1。而在目標檢測的邊界框迴歸中,這顯然是不合適的。因此,GIoU loss在IoU loss的基礎上考慮了兩個框沒有重疊區域時產生的損失。具體定義如下:
LG=1IoU+R(P,G)=1IoU+CPGC L_G = 1 - IoU + R(P,G)= 1 - IoU + \frac{|C-P \cup G|}{|C|}
其中,C表示兩個框的最小包圍矩形框,R(P,G)R(P,G)是懲罰項。從公式可以看出,當兩個框沒有重疊區域時,IoU爲0,但RR依然會產生損失。極限情況下,當兩個框距離無窮遠時,R1R \rightarrow1

DIoU Loss

IoU loss和GIoU loss都只考慮了兩個框的重疊程度,但在重疊程度相同的情況下,我們其實更希望兩個框能捱得足夠近,即框的中心要儘量靠近。因此,DIoU在IoU loss的基礎上考慮了兩個框的中心點距離,具體定義如下:
LG=1IoU+R(P,G)=1IoU+ρ2(p,g)c2 L_G = 1 - IoU + R(P,G)= 1 - IoU + \frac{\rho^2(p,g)}{c^2}
其中,ρ\rho表示預測框和標註框中心端的距離,ppgg是兩個框的中心點。cc表示兩個框的最小包圍矩形框的對角線長度。當兩個框距離無限遠時,中心點距離和外接矩形框對角線長度無限逼近,R1R \rightarrow1

下圖直觀顯示了不同情況下的IoU loss、GIoU loss和DIoU loss結果:

在這裏插入圖片描述

其中,綠色框表示標註框,紅色框表示預測框,可以看出,最後一組的結果由於兩個框中心點重合,檢測效果要由於前面兩組。IoU loss和GIoU loss的結果均爲0.75,並不能區分三種情況,而DIoU loss則對三種情況做了很好的區分。

CIoU Loss

DIoU loss考慮了兩個框中心點的距離,而CIoU loss在DIoU loss的基礎上做了更詳細的度量,具體包括:

  • 重疊面積
  • 中心點距離
  • 長寬比

具體定義如下:
LG=1IoU+R(P,G)=1IoU+ρ2(p,g)c2+αv L_G = 1 - IoU + R(P,G)= 1 - IoU + \frac{\rho^2(p,g)}{c^2} + \alpha v
其中:

v=4π2(arctanwghgarctanwphp)2 v = \frac {4} {{\pi}^2} (arctan\frac{w^g}{h^g} - arctan\frac{w^p}{h^p})^2 \\

α=v(1IoU)+v \alpha = \frac{v}{(1-IoU)+v}

可以看出,CIoU loss在DIoU loss的不同在於最後一項αv\alpha vvv度量了兩個框的長寬比的距離,α\alpha相當於一個平衡係數,取值由IoU和vv共同決定。需要注意的是,計算vv關於wpw^phph^p的梯度時,會在分母上出現wp2+hp2{w^p}^2+{h^p}^2,而CIoU中,wpw^phph^p均是歸一化後的值,會導致wp2+hp2{w^p}^2+{h^p}^2的結果很小,容易出現梯度爆炸。因此,在官方的代碼實現上,對損失函數做了優化,移除了梯度公式中wp2+hp2{w^p}^2+{h^p}^2

在使用CIoU loss時需要注意的是,在代碼實現上,公式中的vv僅用於計算α\alpha,而原來的vv會用另一個變量ara_r代替,在計算ara_r的時候需要用到標準化的寬高(使用絕對寬高loss會發散)。

注:關於IoU系列損失更詳細的分析可以參考論文:Distance-IoU Loss: Faster and Better Learning for Bounding Box Regression

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