Focal loss與RetinaNet: Focal Loss for Dense Object Detection

不放過每一個學習的機會,關注微信公衆號:AI算法愛好者
或掃描二維碼:
在這裏插入圖片描述

Paper Title: Focal Loss for Dense Object Detection
論文鏈接:https://arxiv.org/abs/1708.02002
代碼地址1:https://github.com/facebookresearch/Detectron
代碼地址2:https://github.com/tensorflow/models/tree/master/research/object_detection


1. ​1. 概述

目前目標檢測基本上可以分爲兩大類:one-stage和two-stage目標檢測。單階段檢測網絡通常速度比較快,但是精度趕不上兩階段的。兩階段的反過來,通常精度比較高,速度趕不上單階段的。
在這裏插入圖片描述

two-stage檢測網絡
two-stage檢測網絡的典型代表是Faster-RCNN。第一階段是使用候選框提取網絡(region proposal network),簡稱RPN,來縮小候選目標位置的數量,剔除掉大部分的背景樣本。第二階段對上一階段得到的候選目標位置做分類,樣本使用的前景背景比例爲1:3,或者使用OHEM(online hard example mining)從一個minibatch中挑選出一小部分anchors。因此這種two-stage的檢測網絡是存在前景-背景類平衡的。

one-stage檢測網絡
在這裏插入圖片描述
如上圖所示,one-stage檢測網絡中有很多類似圖像右上方所示的負例背景樣本,他們基本上分佈在整副圖片上,而且有不同長寬比和大小。他們對訓練的貢獻很小,而且其數量上又佔據主導地位。通常,可以採用bootstrapping或hard example mining來解決這種問題,但是這兩種方法效率都不夠高。

上面想要說的其實就是one-stage檢測網絡相對於two-stage檢測網絡存在的問題是:類別不平衡。那麼問題來了,爲什麼會類別不平衡?爲什麼類別不平衡就會導致檢測精度下降?

首先來看一些經典網絡的候選框數量比較:

  • YOLOv1: 98 boxes

  • YOLOv2: ~1k

  • OverFeat: ~1–2k

  • SSD: ~8–26k

  • RetinaNet: ~100k

一張圖像中有這麼多的候選框,但是真正的正例目標通常只有幾個,算上與正例交併比大於某個閾值的候選框也會比這總共的少很多很多。這就是不平衡,數量上差別太大。而這些大量的負例大部分都屬於簡單樣本,即對分類器來說很容易分類,並取得較高的confidence,這種情況對訓練階段是非常不好的,通俗的說,它會讓你誤以爲你的檢測質量很高,然而並不是,你一旦換了正負比例不同的數據集你會發現檢測精度差異很大,而且可能非常低。更嚴謹的解釋可以看下面講到的交叉熵。

Focal loss的出現正是爲了解決在one-stage檢測網絡中類別不平衡導致的訓練精度不夠高的問題。簡單來說,Focal loss主要是在標準交叉熵的基礎上增加了調製因子和平衡因子,從而降低了簡單易分類樣本的的損失貢獻。爲了驗證Focal loss的巨大作用,作者還設計並訓練了一個網絡:RetinaNet。結果顯示RetinaNet不僅具有one-stage檢測網絡的速度,而且在精度上超過了所有SOTA(state-of-the-art)two-stage檢測網絡。


2.crossentropy 2. 交叉熵(cross entropy)

標準交叉熵

先來看下標準的二分類交叉熵:
在這裏插入圖片描述

上式中,y ∈ {±1}表示是否爲ground-truth的分類,p ∈ [0, 1]爲模型預測標籤y=1的概率。爲了簡單起見,作者定義了pt:
在這裏插入圖片描述

這樣一來,交叉熵就可以寫爲:CE(p, y) = CE(pt) = − log(pt)。標準交叉熵損失函數可以看做如圖Figure 1所示的藍色曲線,從圖中可以看出,對於容易分類的樣本(well-classified examples)也會產生一部分損失,當這樣的樣本數量佔據主導位置時,那麼這些損失值雖小,由於數量大卻能淹沒數量較小的樣本的損失,這也就是前面說的類別不平衡所帶來的問題。

在這裏插入圖片描述

平衡交叉熵

一種解決類別不平衡的常用方法是加入權重因子α ∈ [0, 1]。類別1的權重因子爲α,-1的爲1 − α。實際應用中,α可能會被設置爲類別頻率的倒數,或作爲超參數通過交叉驗證來設置。類似於pt的定義,平衡交叉熵可以表示爲:
在這裏插入圖片描述

在前面講到的兩階段檢測網絡中所說的前景背景比爲 1:3 其實就是實現了此處α效果。


3.FocalLoss 3. Focal Loss

平衡交叉熵中的α雖然平衡了正負樣本的重要性,但是它並沒有區分簡單和困難樣本。作者改變了loss函數的表現形式,使得降低了簡單樣本的loss權重,將訓練聚焦在困難樣本上。方法是在交叉熵損失函數中加入一個調製因子:
在這裏插入圖片描述

其中,γ ≥ 0 是一個可調節的聚焦參數。

因此,Focal loss的定義爲:
在這裏插入圖片描述

在圖Figure 1中我們可以看到γ取[0, 5]之間不同值時Focal loss的曲線。

Focal loss的兩點屬性:

  1. 當樣本被誤分類時並且pt很小,此時調製因子接近於1,loss不會被影響。如果pt趨近於1,調製因子就趨近於0,簡單易分類樣本的loss就會被降低權重。

  2. 聚焦參數γ平滑地調整簡單樣本被加權的比率。 當γ=0 時,FL(Focal loss) 等同於CE。 當γ增加時,調製因子的影響同樣增加。(γ=2在實驗中效果最好。)

例如當γ=2 時,與CE相比,分類爲pt=0.9的樣本將具有100倍低的損失,對於pt=0.968,其將具有1000倍低的損失。反過來,這種機制又增加了糾正錯誤分類的樣本的重要性。對於 pt≤0.5和γ=2,損失按比例縮小至最多4倍。

Focal loss的變體
在實際應用中,作者使用的其實是Focal loss的α平衡(α-Balanced)變體,公式如下:

在這裏插入圖片描述

之所以採用這種形式的Focal loss,是因爲作者在實驗中發現帶有α平衡因子比不帶會帶來一點點的精度提升。另外,在計算p的時候加入了sigmoid激活函數,這種操作大幅增加了數值穩定。

注意:Focal loss的表達形式並不一定要跟上面的保持一致,在paper的附錄當中作者也給出了其他的表現形式,感興趣的可以查閱。

類別不平衡和模型初始化
通常情況下,二分類模型在初始化的時候把兩類輸出的概率設置爲相等。然而,在類別不平衡的情況下,數量較多的樣本對loss的貢獻會佔據主導地位,這會導致在模型訓練早期的不穩定。爲了解決這個問題,作者提出了在訓練開始時,爲模型對稀有類別預測的p值引入一個“先驗”概念,並將這個先驗表示爲π。通過對這個值的設置,如0.01,模型對稀有類別的預測值p就會相對比較小。作者發現這樣做的結果是,在類別嚴重不平衡時,不管是標準交叉熵,還是這裏提出的Focal loss,模型訓練的穩定性都得到了提高。

注意:這僅僅是對模型初始化做出的變化,跟損失函數沒關係。


4.RentinaNetDetector 4. RentinaNet Detector

RetinaNet是一個one-stage的網絡,主要用來驗證Focal loss的作用。它由一個backbone骨幹網絡和兩個特定任務的子網絡構成。骨幹網絡主要負責對輸入圖像的feature map的提取。第一個子網絡對骨幹網絡的輸出做目標分類(object classification),第二個子網絡做包圍框迴歸(bounding box regression)。

在這裏插入圖片描述

Feature Pyramid Network Backbone
RetinaNet的骨幹網絡是將FPN應用在ResNet之上,用於從單個分辨率輸入圖像構建豐富的多尺度特徵金字塔。FPN是多尺度的,在所有尺度上都具有強大的語義,並且計算速度快。另外,這裏的FPN有一些適度的變化。 金字塔是從P3到P7生成的。 一些主要的變化是:(i)由於計算原因,現在不使用P2。(ii)P6是通過帶stride的卷積而不是下采樣計算得到的。(iii)另外包括P7以提高大物體檢測的精度。

Anchors
作者使用具有平移不變性的anchor框,類似於在RPN文獻中的變體。這些anchors的尺寸從32x32到512x512不等,對應到金字塔的P3到P7。對金字塔每一層的anchors,使用三種比例的aspect ratio:1:2,1:1,2:1。對於密集的尺度覆蓋,每一層的anchor尺寸添加2^0, 2^1/3, 2^2/3三個,相當於3種尺寸,每種尺寸對應3種比例。所以總體來看,每層有A=9個anchors。對所有層,這些尺寸覆蓋了相對於網絡輸入圖像32-813範圍的像素。

對每一個anchor,用一個長度爲K的one-hot向量表示,和一個4維向量表示包圍框的迴歸座標。其中,K爲類別數目。使用IoU爲0.5來確定anchors是否爲ground-truth目標框,[0, 0.4) 來確定是否爲背景框。每個anchor至多有一個目標框,並在one-hot編碼的K維向量中將該類別對應的位置置1,其餘位置置0。如果IoU的值在[0.4,0.5) 之間並且在訓練期間被忽略,則取消該anchor的分配。

Classification Subnet
分類子網絡是預測每個位置處目標存在的概率(每個位置有A個anchors和K個目標分類)。

這個子網絡是對金字塔的每一層應用一個FCN的小網絡,子網絡的參數在金字塔的層間是共享的。拿一個有C個channel的輸入feature map來說,它應用四個3×3卷積層,每個卷積層都有C個卷積核,每層卷積後跟着ReLU激活層,然後是帶有KA卷積核的3×3卷積層,緊隨着是sigmoid激活層。如圖 Figure 3© 所示,K個類別,A = 9,C = 256。

Box Regression Subnet
包圍框迴歸子網絡與分類子網絡類似,也是在金字塔的每一層連接一個小的FCN,用來回歸anchor和對應的ground-truth之間的偏移。對每個空間位置它有4A個輸出,對應於每個位置A個anchors的偏移,如圖Figure 3(d) 所示,偏移是指anchor和ground-truth box之間的偏移。

有一點跟其他人研究工作不同的是,作者使用了一個叫類別未知的邊框迴歸器,這種方式使用的參數會更少,但卻發現可以取得同樣的效果。

目標分類子網絡和包圍框迴歸子網絡的結構結構相同,使用相互獨立的參數。

Inference
爲了提高預測速度,在將檢測器置信度設置爲0.05後,對每一層FPN,網絡最多隻對 1k 個top-scoring的包圍框預測做解碼處理。然後合併所有的top預測,並應用閾值爲0.5的非最大抑制(NMS)以產生最終檢測結果。

Training
在訓練期間,一張圖片總的Focal loss是所有大約100k個anchors的Focal loss之和,通過分配給gound-truth box的anchors的數量做歸一化。關於訓練期間的一些參數初始化可以參考論文,不過多介紹了。


5. 5. 實驗對比

AP對比:
在這裏插入圖片描述


6. 6. 總結

這篇文章主要是通過引入了Focal loss和其中的兩個參數α和γ分別用於抑制正負樣本和難易樣本的不平衡,解決了one-stage檢測網絡的類別不平衡問題,並通過設計的網絡RetinaNet驗證了Focal loss的作用。通過實驗對比,AP值超過了所有one-stage和two-stage的網絡。

如圖Figure 2所示是這篇文章給出的網絡和預測時間圖,不過如果你看過YOLOv3的論文你會知道RetinaNet的速度還不夠快,下圖是YOLOv3給出的,可以看到RetinaNet還是慢了一些。
在這裏插入圖片描述

在這裏插入圖片描述
YOLOv3Speedaccuracytradeoff YOLOv3 Speed-accuracy tradeoff


參考:

https://arxiv.org/abs/1708.02002


END - END -

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