Focal Loss for Dense Object Detection

文章地址:https://arxiv.org/abs/1708.02002
代碼: https://github.com/facebookresearch/Detectron

0 摘要

迄今爲止最高精度的目標檢測器基於由R-CNN推廣的兩階段方法,將分類器應用於稀疏的候選目標位置集。相比之下,在可能的位置進行規則、密集採樣的單階段檢測器具有更快和更簡單的可能性,但迄今爲止其精度落後於兩階段檢測器的精度。本文中,我們研究了出現這種情況的原因。我們發現密集檢測器訓練過程中前景區域和背景區域的極度不均衡是造成這種情況的主要原因。我們提出修改標準的交叉熵損失,降低對較好分類的樣本的權重,以解決樣本數量不一致的問題。我們提出的focal loss目的是在訓練過程減少大量的easy nagative樣本,專注於真正的難例樣本。爲了驗證我們提出的損失函數的有效性,我們設計和訓練了一個叫做RetinaNet的簡單的密集檢測器。實驗結果表明,使用focal loss的RetinaNet,具有一階段檢測器的速度,同時準確率超過了所有的兩階段檢測器。代碼爲:https://github.com/facebookresearch/Detectron

1 簡介

當前的SOTA的檢測器主要基於兩階段的、prposal驅動的機制。正如R-CNN的做法,第一階段生成候選目標位置的稀疏集,第二階段使用卷積神經網絡判斷每一個候選框是前景還是背景。通過一系列的改進,這種兩階段的檢測器在coco目標檢測任務上取得了最好的效果。

儘管兩階段檢測器取得了很好的成功,一個問題是:一個簡單的一階段檢測器能否取得同樣的準確率?一階段檢測器應用於正規的、密集的目標位置、尺度和長寬比。最近的一階段檢測器,如YOLO、SSD在準確率達到目前SOTA 兩階段檢測器10% - 40%的同時取得了更快的檢測速度。

本文首次通過應用新的損失函數,使一階段檢測器達到了和目前最先進的兩階段檢測器(FPN、Mask-RCNN)相近的檢測準確率。我們發現一階段檢測器訓練過程中樣本類別不均衡是準確率無法令人滿意的主要原因,通過使用本文提出的focal loss消除了這種障礙。

在兩階段的R-CNN族檢測器中,提出proposal的階段(selective search,EdgeBoxes,DeepMask,RPN)將候選proposal數量降低到了一個很小的數量(1 - 2k),剔除了大量的背景樣本。在這種兩階段檢測器中,啓發式採樣,例如將前景:背景樣本的比例限定在1:3,或是通過OHEM實現了背景和前景樣本的相對平衡。

作爲對比,一階段檢測器必須處理採樣自輸入圖像的更大的候選proposal集合。通常,根據不同的位置、尺度和長寬比,大約會得到100k個proposal。雖然可以通過相似的啓發式策略進行處理,但是仍然不足夠高效。

在這裏插入圖片描述
本文提出了一個用於解決類別不均衡的損失函數。該損失函數是交叉熵損失的縮放,當正確分類的概率上升時,該損失函數可以下降到0,如圖1所示。直觀上來說,提出的損失函數在訓練過程中會自動降低容易分類的樣本的權重並專注於難例樣本的學習。實驗表明,使用focal loss的一階段檢測器可以輕鬆超越使用啓發式採樣/難例挖掘的一階段檢測器。我們還證明,focal loss的形式是不固定的,很多其他的形式也可以達到相近的效果。

我們設計了一個叫做RetinaNet的一階段檢測器用於顯示focal loss的有效性。

在這裏插入圖片描述

2 Focal Loss

二分類y{1,+1},p[0,1]y \in \{-1,+1\},p \in [0,1]是樣本爲正樣本的概率,交叉熵:
CE(p,y)={log(p)   if y=1log(1p)  otherwiseCE(p,y) = \begin{cases} -\log(p) ~~~if~y = 1 \\ -\log(1-p) ~~ otherwise\end{cases}

交叉熵的物理含義是,對於正樣本,預測其爲正樣本的概率越大損失越小,對於負樣本,預測其爲正樣本的概率越小損失越小。因此最小化交叉熵損失的目的就是使正樣本被預測爲正樣本的概率儘可能大,負樣本被預測爲正樣本的概率儘可能小,也就是對所有的樣本都儘可能正確的進行分類。

定義:
pt={p  if y=11p  otherwisep_t = \begin{cases} p~~if~y=1 \\ 1-p~~otherwise\end{cases}
因此,CE(p,y)=CE(pt)=log(pt)CE(p,y)=CE(p_t)=-\log(p_t)

圖1中最上面的藍色線表示交叉上的曲線。一個值得注意的特性是,即便對於容易分類的樣本(pt>>0.5p_t >> 0.5),其損失值也不是特別小。當訓練集中包含很多的正樣本時,這些難以訓練的難例樣本會淹沒在大量的正樣本中

2.1 平衡交叉熵

解決樣本類別不均衡的做法是使用一個權重係數α[0,1]\alpha \in [0,1]。一般這個值是樣本出現頻率的倒數或者是一個交叉驗證得到的超參數。定義:
αt={α  if y=11α otherwise\alpha_t = \begin{cases} \alpha~~if~y=1\\ 1-\alpha~otherwise\end{cases}

定義α\alpha平衡的交叉熵損失爲:
CE(pt)=αtlog(pt)={αlog(p)  if y=1(1α)log(1p) otherwiseCE(p_t) = -\alpha_t \log(p_t) = \begin{cases} -\alpha \log(p) ~~ if~y = 1 \\ -(1- \alpha)\log(1-p)~otherwise\end {cases}
α\alpha可以實現對正負樣本數量不均衡的平衡。對於數量較多的樣本類,可以令其α\alpha值較小。同理,對於樣本數量較少的樣本類,可以令其α\alpha值較大。但α\alpha沒有解決easy和hard negative的不均衡。

2.2 focal loss

FL(pt)=(1pt)γlog(pt),γ>0FL(p_t) = -(1 - p_t)^{\gamma}\log(p_t),\gamma > 0

pt1p_t \rightarrow 1(正樣本被預測爲正樣本的概率很大,負樣本被預測爲正樣本的概率很小)時,1pt01-p_t \rightarrow 0,由於γ>0\gamma > 0(1pt)γ(1-p_t)^{\gamma}很小,所以容易被正確分類的樣本的損失很小。當pt0p_t \rightarrow 0(正樣本被預測爲正樣本的概率很小,負樣本被預測爲正樣本的概率很大)時,(1pt)1(1 - p_t) \rightarrow 1,由於γ>0\gamma > 0, (1pt)γ(1-p_t)^{\gamma}很大,所以難以被正確分類的樣本造成的損失很大。所以focal loss起到了增大難以分類的樣本的損失影響,減弱易於正確分類的樣本的損失影響。總結起來,focal loss解決了easy和hard negative的不均衡

γ\gamma值越大,引入的調整參數的影響越大。實驗中發現γ=2\gamma = 2效果最好。γ=2\gamma = 2時,一個ptp_t = 0.9的樣本,其focal loss相對於交叉熵loss減少了100倍,一個ptp_t = 0.968的樣本,其focal loss相對於交叉熵loss減少了1000倍。同樣對容易誤分類的樣本pt0.5,γ=2p_t \leq 0.5,\gamma = 2時,其損失被增大了4倍以上。

實際實驗中,使用focal loss的α\alpha平衡版本
FL(pt)=αt(1pt)γlog(pt)FL(p_t) = -\alpha_t(1-p_t)^{\gamma}\log(p_t)
之所以使用這種形式是因爲相比不使用α\alpha平衡的focal loss準確率略微上升。同時也提升了數值計算的穩定性。物理意義是同時解決了各類別樣本數量不均衡和easy和hard negative的不均衡兩個問題。

2.3 類別不均衡和模型初始化

二分類默認初始化成得到y=-1和y=1的概率相等。基於這種初始化,在類別不均衡的情況下,總損失取決於經常出現的樣本類別並且會造成訓練早期的不穩定。爲了解決這個問題,在模型訓練早期引入一個基於稀少樣本的概率pp的先驗參數。假如p=0.01p = 0.01,設置該先驗爲π\pi。這是3.1節用到的模型初始化。我們發現在類別嚴重不均衡的情況下,這種初始化可以增強交叉熵損失/focal loss的訓練穩定性。

2.4 類別不均衡和兩階段檢測器

前面的兩階段檢測器一般都是使用交叉熵損失。它們通過兩種機制解決類別不均衡問題:(1)兩階段級聯(2)minibatch樣本重採樣。第一階段的proposal提出機制可以將幾近無窮的proposal數量減少到1 ~ 2k個。更重要的是,這些留下的proposal也不是隨機選取的,而是和真實的目標位置有較大關聯的proposal,這已經移除了大量易於分類的負樣本。在第二階段的訓練過程中,往往會對minibatch進行重新採樣,例如使正負樣本的比例接近1:3。這相當於通過採樣實現α\alpha平衡。本文相當於通過focal loss解決一階段目標檢測系統中的樣本類別不均衡問題。

3 RetinaNet檢測器

RetinaNet由一個骨幹網絡和兩個子網絡組成,骨幹網絡計算整個輸入圖像的卷積特徵。第一個子網絡用於進行目標分類,第二個子網絡用於邊界框迴歸。整個網絡如圖3所示。
在這裏插入圖片描述
FPN骨架:FPN是在卷積網絡的輸出上添加從上到下和橫向的連接,從而能夠基於單幅輸入圖像構建出豐富的、多尺度的特徵金字塔。特徵金字塔的每一層都用於在不同的尺度進行目標檢測。

我們在ResNet基礎架構的基礎上使用FPN,我們構建了一個從P3到P7的金字塔,ll表示金字塔的層數(PlP_l的分辨率比輸入圖像小2l2^l倍)。所有的金字塔層都具有256個channel。

Anchors:P3到P7對應的anchor大小分別爲32232^25122512^2。每一層使用的anchor的長寬比均爲{1:2,1:1,2:1}\{1:2,1:1,2:1\},作者對每一層的每一個長寬比的anchor集設置尺度大小爲原始大小{20,213,223}\{2^0,2^{\frac{1}{3}},2^{\frac{2}{3}}\}的anchor,這樣對每一層有9個不同的anchor。

如果一個anchor和真實框之間的IOU大於等於0.5,設該anchor爲正例。如果一個anchor和真實框之間的IOU介於0到0.4之間,則該anchor爲反例。IOU介於0.4到0.5之間的anchor在訓練過程中被忽略。

卷積子網絡:分類子網絡在每一個空間位置預測A個anchor包含K類目標的概率。該子網絡是一個應用於FCN全部層的小的FCN,各層之間參數共享。設計原則很簡單。給定一個金字塔具有C個channel的輸入特徵映射,先經過通道數同樣爲C的3 * 3卷積,然後使用Relu激活,最後使用KA個大小爲3 * 3的卷積核進行卷積操作。最後使用KA個sigmoid激活輸入每一個anchor包含目標的概率。在大部分實驗中,C = 256,A=9。

目標迴歸子網絡:目標迴歸子網絡使用FCN用於估計一個anchor和它附近真實框之間的偏移量。迴歸子網絡和分類子網絡設計相似,除了輸出大小爲4A。預測的四個值同樣是寬高的比值和中心點的偏移量。

3.1 推理和訓練

推理:推理時每一個FPN層先按照閾值0.05過濾檢測結果,然後按照置信度從高到低選擇至多1000個檢測框。最後所有層的預測框合併並使用0.5的閾值進行NMS操作得到最終的檢測結果。

Focal Loss:分類子網絡使用focal loss。實驗中發現設置γ=2\gamma = 2可以取得最好的效果。在訓練RetinaNet的時候,每一個輸入圖像大約100k個anchor應用focal loss。這和原來很多網絡使用RPN或OHEM只保留很少的anchor不同。最終一個圖像的focal loss是大約100k個anchor的focal loss的和除以和真實框匹配了的anchor的數量。這裏之所以沒有除以所有anchor的數量是因爲大多數的anchor都是easy nagetive樣本,使用focal loss時這些樣本的對損失的貢獻很有限。當γ\gamma增大時,α\alpha的值應該減小,在實驗中發現γ=2,α=0.25\gamma = 2,\alpha = 0.25的效果最好。

初始化:本文實驗中使用了ResNet-50-FPN和ResNet-101-FPN,基礎的ResNet-50和ResNet-101網絡都是在ImageNet1K數據集上訓練的。對FPN新添加的層,除最後一層之外的其他卷積層偏置項b初始化爲0,權重初始化標準差爲0.01的高斯分佈。分類子網絡的最後一個卷積層,偏置b=log((1π)/π)b =-\log((1-\pi)/\pi),其中π\pi表示訓練開始前每一個anchor被標記爲前景目標的概率。在所有的實驗中,作者設置π=0.01\pi = 0.01。這樣初始化可以防止大量的負樣本在訓練的第一次迭代過程中產生一個大的、不穩定的損失值。

最優化:使用SGD優化算法,在8個GPU上,每個minibatch包含16幅圖像。
訓練過程中的整體損失是分類自網絡的focal loss和迴歸子網絡的smooth L1損失。

4 實驗效果

在這裏插入圖片描述使用focal loss的效果要比使用OHEM好很多。

在這裏插入圖片描述

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