天天看點

目标定位與檢測系列(15):目标檢測常用損失函數類别損失位置損失

文章目錄

  • 類别損失
    • Cross Entropy Loss
    • Focal Loss
  • 位置損失
    • L1 Loss
    • L2 Loss
    • Smooth L1 Loss
    • IoU Loss
    • GIoU Loss
    • DIoU Loss
    • CIoU Loss

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

類别損失

Cross Entropy Loss

交叉熵損失是基于“熵”這個概念,熵用來衡量資訊的不确定性。對于機率分布為 p ( X ) p(X) p(X)的随機變量 X X X,熵可以表示為:

f ( x ) = { − ∫ p ( x ) log ⁡ p ( x ) d x x 連 續 − ∑ x log ⁡ p ( x ) x 離 散 f(x)=\left\{ \begin{aligned} -\int{p(x)\log p(x)dx} & &{x連續}\\ -\sum_{x}\log p(x) & &{x離散} \end{aligned} \right. f(x)=⎩⎪⎪⎨⎪⎪⎧​−∫p(x)logp(x)dx−x∑​logp(x)​​x連續x離散​

當 X X X分布的不确定性越大,對應的熵越大(對應 log ⁡ ( x ) \log(x) log(x))積分面積),反之,熵越小。當把熵用于分類問題時,分類的結果越好(可以了解為預測為某一類的機率遠高于其他類别的機率),不确定性越低,熵就越小;反之,分類的結果越差(可以了解為預測的各個類别的機率都比較高,沒有明确的分界線),此時不确定性越強,熵就越高。

針對以上分析,可以把熵用于分類問題的損失,根據分類的類别數量不同,可以分為二進制交叉熵損失和多分類交叉熵損失。

對于二分類問題(即0-1分類),即屬于第1類的機率為 p p p,屬于第0類的機率為 1 − p 1-p 1−p。則二進制交叉熵損失可表示為:

L = { − log ⁡ ( 1 − p ) y = 0 − log ⁡ ( p ) y = 1 L=\left\{ \begin{aligned} -\log (1-p) & &{y=0}\\ -\log (p) & &{y=1} \end{aligned} \right. L={−log(1−p)−log(p)​​y=0y=1​

也可以統一寫成如下形式:

L = − y ∗ log ⁡ ( p ) − ( 1 − y ) ∗ log ⁡ ( 1 − p ) L = -y* \log(p) - (1-y) * \log(1-p) L=−y∗log(p)−(1−y)∗log(1−p)

可以了解為:當實際類别為1時,我們希望預測為類别1的機率高一點,此時 l o g ( p ) log(p) log(p)的值越小,産生的損失越小;反之,我們希望預測為類别0的機率高一點,此時 l o g ( 1 − p ) log(1-p) log(1−p)的值越小,産生的損失也越小。在實際應用中,二分類的類别機率通常采用sigmoid函數把結果映射到(0,1)之間。

對比二進制交叉熵損失,可以推廣到多分類交叉熵損失,定義如下:

L ( X i , Y i ) = − ∑ j = 1 c y i j ∗ log ⁡ ( p i j ) L(X_i, Y_i) = -\sum_{j=1}^{c}{y_{ij} * \log(p_{ij})} L(Xi​,Yi​)=−j=1∑c​yij​∗log(pij​)

其中, Y i Y_i Yi​是一個one-hot向量,并定義如下:

y i j = { 1 第 i 個 樣 本 屬 于 類 别 j 0 o t h e r w i s e y_{ij}=\left\{ \begin{aligned} 1 & &{第i個樣本屬于類别j}\\ 0 & &{otherwise} \end{aligned} \right. yij​={10​​第i個樣本屬于類别jotherwise​

p i j p_{ij} pij​表示第 i i i個樣本屬于類别j的機率。在實際應用中通常采用SoftMax函數來得到樣本屬于每個類别的機率。

Focal Loss

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

目标檢測論文筆記:RetinaNet

它是對典型的交叉資訊熵損失函數的改進,主要用于樣本分類的不平衡問題。為了統一正負樣本的損失函數表達式,首先做如下定義:

p t = { p y = 1 1 − p y = 0 p_t=\left\{ \begin{aligned} p & &{y =1}\\ 1-p & &{y=0} \end{aligned} \right. pt​={p1−p​​y=1y=0​

p t p_t pt​在形式上就表示被預測為對應的正确類别的置信度。這樣二分類交叉資訊熵損失就可以重寫成如下形式:

C E ( p , y ) = C E ( p t ) = − log ⁡ ( p t ) CE(p,y) = CE(p_t) = -\log(p_t) CE(p,y)=CE(pt​)=−log(pt​)

為了平衡多數類和少數類的損失,一種正常的思想就是在損失項前乘上一個平衡系數 α ∈ ( 0 , 1 ) \alpha\in(0,1) α∈(0,1),當類别為正時,取 α t = α \alpha_t=\alpha αt​=α,當類别為負時,取 α t = 1 − α \alpha_t=1-\alpha αt​=1−α,這樣得到的帶有平衡系數的交叉資訊熵損失定義如下:

C E ( p t ) = − α log ⁡ ( p t ) CE(p_t) = -\alpha \log(p_t) CE(pt​)=−αlog(pt​)

這樣,根據訓練樣本中正負樣本數量來選取 α \alpha α的值,就可以達到平衡正負樣本的作用。然而,這樣做還不能對簡單和困難樣本差別對待,在目标檢測中,既要平衡多數類(背景)和少數類(包含目标的前景),還要平衡簡單樣本和困難樣本,而往往訓練過程中往往遇到的問題就是大量簡單的背景樣本占據損失函數的主要部分。是以,還需要對上述帶有平衡系數的交叉資訊熵損失做進一步的改進。于是就有了Focal Loss,它定義如下:

F L ( p t ) = − ( 1 − p t ) γ log ⁡ ( p t ) FL(p_t) = -(1-p_t)^{\gamma} \log(p_t) FL(pt​)=−(1−pt​)γlog(pt​)

相比于上面的加了平衡系數 α \alpha α的損失函數相比,Focal Loss有以下兩點不同:

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

位置損失

L1 Loss

L1 loss即平均絕對誤差(Mean Absolute Error, MAE),指模型預測值和真實值之間距離的平均值。

M A E = ∑ n = 1 n ∣ f ( x i ) − y i ∣ n MAE=\frac{\sum_{n=1}^n{|f(x_i)-y_i|}}{n} MAE=n∑n=1n​∣f(xi​)−yi​∣​

記 x = f ( x i − y i ) x=f(x_i-y_i) x=f(xi​−yi​),對于單個樣本,L1 loss可表示為:

M A E = ∣ f ( x i ) − y i ∣ = ∣ x ∣ MAE= |f(x_i)-y_i|=|x| MAE=∣f(xi​)−yi​∣=∣x∣

L2 Loss

L2 loss即均方誤差損失(Mean Square Error, MSE),指預測值和真實值之差的平方的平均值。

M S E = ∑ n = 1 n ( f ( x i ) − y i ) 2 n MSE=\frac{\sum_{n=1}^n{(f(x_i)-y_i)^2}}{n} MSE=n∑n=1n​(f(xi​)−yi​)2​

對于單個樣本,L2 loss可表示為:

M S E = ( f ( x i ) − y i ) 2 = x 2 MSE = (f(x_i)-y_i)^2=x^2 MSE=(f(xi​)−yi​)2=x2

Smooth L1 Loss

Smooth L1 loss是基于L1 loss修改得到,對于單個樣本,記 x x x為預測值和真實值的內插補點,則對應的Smooth L1 loss可表示為:

f ( x ) = { 0.5 x 2 i f ∣ x ∣ < 1 ∣ x ∣ − 0.5 o t h e r w i s e f(x)=\left\{ \begin{aligned} 0.5x^2 & &{if|x|<1}\\ |x|-0.5 & &{otherwise} \end{aligned} \right. f(x)={0.5x2∣x∣−0.5​​if∣x∣<1otherwise​

IoU Loss

IoU類的損失函數都是基于預測框和标注框之間的IoU(交并比),記預測框為 P P P,标注框為 G G G,則對應的IoU可表示為:

I o U = P ∩ G P ∪ G IoU = \frac{P \cap G}{P \cup G} IoU=P∪GP∩G​

即兩個框的交集和并集的比值。IoU loss定義為:

L I = 1 − I o U L_I = 1 - IoU LI​=1−IoU

GIoU Loss

IoU反映了兩個框的重疊程度,在兩個框不重疊時,IoU衡等于0,此時IoU loss恒等于1。而在目标檢測的邊界框回歸中,這顯然是不合适的。是以,GIoU loss在IoU loss的基礎上考慮了兩個框沒有重疊區域時産生的損失。具體定義如下:

L G = 1 − I o U + R ( P , G ) = 1 − I o U + ∣ C − P ∪ G ∣ ∣ C ∣ L_G = 1 - IoU + R(P,G)= 1 - IoU + \frac{|C-P \cup G|}{|C|} LG​=1−IoU+R(P,G)=1−IoU+∣C∣∣C−P∪G∣​

其中,C表示兩個框的最小包圍矩形框, R ( P , G ) R(P,G) R(P,G)是懲罰項。從公式可以看出,當兩個框沒有重疊區域時,IoU為0,但 R R R依然會産生損失。極限情況下,當兩個框距離無窮遠時, R → 1 R \rightarrow1 R→1

DIoU Loss

IoU loss和GIoU loss都隻考慮了兩個框的重疊程度,但在重疊程度相同的情況下,我們其實更希望兩個框能挨得足夠近,即框的中心要盡量靠近。是以,DIoU在IoU loss的基礎上考慮了兩個框的中心點距離,具體定義如下:

L G = 1 − I o U + R ( P , G ) = 1 − I o U + ρ 2 ( p , g ) c 2 L_G = 1 - IoU + R(P,G)= 1 - IoU + \frac{\rho^2(p,g)}{c^2} LG​=1−IoU+R(P,G)=1−IoU+c2ρ2(p,g)​

其中, ρ \rho ρ表示預測框和标注框中心端的距離, p p p和 g g g是兩個框的中心點。 c c c表示兩個框的最小包圍矩形框的對角線長度。當兩個框距離無限遠時,中心點距離和外接矩形框對角線長度無限逼近, R → 1 R \rightarrow1 R→1

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

目标定位與檢測系列(15):目标檢測常用損失函數類别損失位置損失

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

CIoU Loss

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

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

具體定義如下:

L G = 1 − I o U + R ( P , G ) = 1 − I o U + ρ 2 ( p , g ) c 2 + α v L_G = 1 - IoU + R(P,G)= 1 - IoU + \frac{\rho^2(p,g)}{c^2} + \alpha v LG​=1−IoU+R(P,G)=1−IoU+c2ρ2(p,g)​+αv

其中:

v = 4 π 2 ( a r c t a n w g h g − a r c t a n w p h p ) 2 v = \frac {4} {{\pi}^2} (arctan\frac{w^g}{h^g} - arctan\frac{w^p}{h^p})^2 \\ v=π24​(arctanhgwg​−arctanhpwp​)2

α = v ( 1 − I o U ) + v \alpha = \frac{v}{(1-IoU)+v} α=(1−IoU)+vv​

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

在使用CIoU loss時需要注意的是,在代碼實作上,公式中的 v v v僅用于計算 α \alpha α,而原來的 v v v會用另一個變量 a r a_r ar​代替,在計算 a r a_r ar​的時候需要用到标準化的寬高(使用絕對寬高loss會發散)。

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

繼續閱讀