讀Focal Loss

1.簡介

現在最高精度的目標識別方法是從R-CNN推廣的two-stages的方法。它是在candidate object locations的稀疏集合上面用了分類器。與之相反的,one-stage的方法是用在可能的object locations上面做常規、密集採樣,它具有更快速、更簡單的特點,但是精度沒有two stages的方法高。這篇文章主要探究這種情況發生的原因。作者發現 在訓練時候出現前景背景(foreground-background)類別的不平衡(imbalance)是中心原因。作者提出通過reshape標準交叉熵損失解決類別不均衡(class imbalance),這樣它就能降低容易分類的樣例的比重(well-classified examples)。這個方法專註訓練在hard example的稀疏集合上,能夠防止大量的easy negatives在訓練中壓倒訓練器。(overwhelming the detector)為了評估作者的loss的效率,作者設計了一個簡單的密集檢測器(dense detector),名叫RetinaNet結果顯示當RetinaNet在focal loss上訓練之後,它能夠匹配之前的one-stage detector的速度,並且優於已有的state-of-the-art的two-stage detector。

現在的state-of-the-art的object detector都是基於one-stage,proposal-driven機理的。像R-CNN框架一樣,第一步,生成候選物體定位(candidate object location)的稀疏集合;第二步,利用卷積神經網路構造分類器將第一步的集合分為前景和背景。這種方法在COCO的benchmark上面達到top準確率。引出的一個問題是:一個簡單的one-stage detector能夠達到相似的精度么?One stage detector用於對於物體位置(object location)、比例(scale)、寬高比(aspect ratio)上面的常規、密集採樣。最近的YOLO和SSD顯示出有前途的結果,它們更快而且 有10%-40% 在state-of-the-art的two stage方法精準度上面。

這篇文章把性能極限提高了:展示了一個one-stage object第一次達到state-of-art COCO AP(一般是複雜的two-stage方法達到,像Feature Pyramid Network FPN或Mask R-CNN)。為了達到這個結果,作者在訓練時把類別不均衡作為主要的障礙,它阻礙了one stage方法達到state-of-the-art的精度。並且作者提出了新的loss function消除這些屏障。

類別不均衡在類R-CNN方法(兩步級聯two-stage cascade、採樣探索sampling heuristics)中,在proposal stage(像Selective Search、EdgeBoxes、DeepMask、RPN)能快速地減少candidate object location的數量(1-2k),可以過濾大多數的背景採樣。在second classification stage,採樣探索,像固定前景背景率(foreground-to-background ratio)或在線難分樣本挖掘(online hard example mining,OHEM),用來保證前景背景之間的平衡。

與之相反,one-stage方法產生candidate object locations更大的集合。實際上常常是枚舉到100k的location,密集地包括空間位置、尺度、長寬比。當相似的sampling heuristic也被應用,它們是低效率的,因為易分背景樣本始終在訓練產生中佔據主要位置。(They are inefficient as the training procedure is still dominated by easily classified background examples.) 這種低效率是在目標識別的典型問題,一般通過bootstrapping、hard example mining解決。

這篇論文提出一個新的loss function作為之前解決class imbalance的更高效的替代方法。它能動態地縮放交叉熵,隨著正確類別的置信度(confidence in correct class)增加, 其中的尺度因子衰減到零。直觀感受,這個縮放因子可以自動降低訓練時easy example貢獻的比重,快速地focus hard examples的模型。實驗表明Focal Loss可以訓練一個高精度、one-stage方法,它能顯著地勝過用sample heuristic或hard example mining訓練one-stage的方法(之前的state-of-the-art方法)。最後作者說focal loss的確切形式不是非常重要,其他的樣例也可以達到相似的結果。

圖1-1

為了確定focal loss的高效性,作者設計了簡單點的one-stage目標檢測方法。RetinaNet,取這個名字的原因是dense sampling object locations。它通過 in-network feature pyramid和anchor boxes來設計特徵。RetinaNet高效而且準確度。基於ResNet-101-FPN backbone,達到COCO test-dev ( 39.1 AP 5fps)

圖1-2

2.相關工作

Classic Object Detectors:滑動窗口。HOG(方向梯度直方圖,Histogram of oriented gradient)。DPMs。

Two-stage Detectors: Selective Search,R-CNN,RPN(Region Proposal Networks)。Faster R-CNN。

One-stage Detectors: OverFeat, SSD, YOLO。 SSD在 AP上低了10-20%。最近two-stage方法通過減少輸入圖片的解析度和proposal的數量增加速度,one-stage方法訓練用更大的計算budget。本文的目的是理解one-stage方法可以匹配或者超過two-stage的精度同時標尺相似或者更快的速度。RetinaNet與之前方法有很多相似,像RPN的anchor和在SSD和FPN中的feature pyramid。

Class Imbalance:之前的one-stage方法訓練時都面臨類別不平衡問題。要評估10^4-10^5候選定位,但是只有很少包含對象。類別不平衡導致兩個問題:

(1)訓練不高效,大多數位置都是easy negtive,貢獻很少的有用學習信號(useful learning signal)。

(2)easy negative 會overwhelm主導訓練,導致退化的模型(degenerate models)。

常用的解決思路是用hard negative mining。難分類負樣本挖掘。在訓練時採樣難分樣本,或者更複雜的採樣、重新分配權重計劃。Focal loss不用sample,也不會讓easy negative主導損失和梯度。

Robust Estimation:Focal loss是通過降低inliers(easy examples)的權值,這樣它們對總的loss的貢獻很小(即使它的值很大)。換句話說,focal loss有robust loss的對立作用,它將訓練集中在hard example的稀疏集合上面。(it focuses training on a sparse set of hard examples)

解釋inliers:

如圖所示,給定一些點(紅+綠+黑)要求用這些數據點擬合橢圓以ransac擬合橢圓為例,可以看出,黃色橢圓為擬合結果,紅色點是由ransac隨機選擇用來擬合的數據點黑色點是除紅色點外距離橢圓距離小於某一閾值的點,而綠色點是距離橢圓距離大於這一閾值的點那麼,紅色+黑色點即為內點,而綠色點為外點。

3. Focal Loss

Focal Loss是被設計來針對one-stage object detection方案的,其中在訓練中有在前景和背景類別之間的完全不平衡存在(1:1000)。先從對於binary classification的交叉熵(CE,cross entropy)損失來介紹Focal Loss。

移除y∈{-1,1}是ground truth class,p∈[0,1]是模型對於標籤y=1的估計概率。

為了方便標記,記Pt:

重寫

當大量的easy examples疊加,這些小的損失值可以主導那些稀少的類。

3.1. Balanced Cross Entropy

針對class imbalance的常用方法是用一個權重參數α∈[0,1]對於類1,1-α對於類-1。實際應用上,α一般被設定為類頻率的逆或者作為超參數,通過交叉驗證設定。為了標記方便,定義αt,相似的定義Pt。α-balanced CE loss:

3.2. Focal Loss Definition

訓練時遇到很大的類別不平衡會主導交叉熵損失。易分負樣本在梯度和損失中佔據主導地位。而α平衡了正負樣本的重要性,它不會區別易分樣本和難分樣本。與之不同,作者將損失函數變形降低易分樣本的權重,專註於訓練難分負樣本。

更加形式化地來說,作者加了(1-Pt)^γ到交叉熵上。γ是可以可以調節的專註參數γ>0。這樣,Focal loss定義為:

γ不同時的圖。

說一下Focal loss的屬性:

(1)當一個樣例被誤分類,那麼Pt很小,那麼調製因子(1-Pt)接近1,損失不被影響;當Pt1,因子(1-Pt)接近0,那麼分的比較好的(well-classified)樣本的權值就被調低了。

(2)專註參數γ平滑地調節了易分樣本調低權值的比例。γ增大能增強調製因子的影響,實驗發現γ取2最好。

直覺上來說,調製因子減少了易分樣本的損失貢獻,拓寬了樣例接收到低損失的範圍。舉例來說,當γ=2時,一個樣本被分類的Pt=0.9的損失比CE小1000多倍。這樣就增加了那些誤分類的重要性(它們損失被縮了4倍多,當Pt<0.5且γ=2)

作者用了α-balanced的Focal Loss的變體。作者發現它能提升一點點精度。

作者也提到,在利用損失層時候,結合sigmoid計算p,然後算損失,能增加數值穩定性。

3.3.Class Imbalance and Model Initialization

Binary分類模型是默認初始化為對於y=-1和y=1有相同的概率的。在這樣的初始化之下,由於類不平衡,出現頻率高的類會主導總的損失,在訓練早期導致不穩定。為了對抗這個,作者提出「優先」的概念,在訓練初期對於模型對於低頻率的類(背景)估計的p給予「優先」。作者把這個「優先」(prior)記做 pi ,設定它,以至於模型對於低頻率類別(rare class)的樣本的估計p很低,比如說0.001。這是模型初始化的改變,而不是損失函數的改變。作者發現這點能改進訓練的穩定性(對於在類極不平衡的情況下的交叉熵和focal loss都有效)。

3.4.Class Imbalance and Two-stage Detectors

Two-stage detectors常用交叉熵損失,而不用 alpha-balancing 或者作者的方法。它們用兩種途徑解決這個問題:

  1. two-stage cascade (雙階段級聯)
  2. biased minibatch sampling(有偏批量採樣)

第一個stage是一個object proposal機理,將幾乎無窮個可能的object locations減少到一兩千個。重要的是,這種方法的選擇不是隨機的,是跟true object locations(標籤的框)相關的,能夠除掉大部分的easy negative。

第二個stage的訓練中,biased sampling是一種典型的構建minibatch的方法,比如說1:3的正負樣本比例。這個比例就像在採樣時使用了 alpha-balancing 項。作者的方法focal loss是用來在one-stage的檢測中通過損失函數來解決這個問題。

4. RetinaNet Detector

RetinaNet是單個、統一化的網路,由backbone網路和task-specific任務相關的子網路組成。Backbone是負責計算卷積的feature map的,是一個現存的卷積網路。第一個子網路是在Backbone輸出上面進行object classification目標分類的;第二個子網路是在產生bounding box regression的。網路結構給出:

Feature Pyramid Network Backbone:

作者用了Feature Pyramid Network,FPN作為Retina的Backbone。FPN提出標準的有top-down pathway上下通道和lateral connections橫向連接的卷積網路,所以網路從單解析度的圖像中構建了一個豐富、多尺度特徵金字塔。從上圖的(a)(b)可以看出來。

作者在ResNet的頂部構建FPN,用P3到P7層構建了金字塔。(第 l 層解析度是第一層的 frac{1}{2^l} )。只用最後一層的特徵的話AP很低。

Anchors:

作者用了translation-invariant anchor boxes 平移不變錨與RPN的變體相似。這個anchor在金字塔層P3到P7有相應的 32^2512^2 的區域。在每個金字塔層,作者用的長寬比是{ 1:2,1:1,2:1 }。在每層,對於三個長寬比的anchor,加了anchor的形狀的{ 2^0,2^{1/3},2^{2/3} }的anchor。這能夠增加AP。對於每層,有A=9個anchor,穿過這些層,它們可以覆蓋32-813個輸入圖片中的像素。每個Anchor都是K個分類目標的one-hot向量(K是目標類別數)和4個box regression目標。作者設定anchor的方式是與ground-truth 的intersection-over-union (IoU) 閾值0.5,與背景IOU [0,0.4) 。所有的anchor都被設定為一個box,在預測向量的對應的類位置設1,其他的設為0。如果沒有被設定,那麼 IoUin[0.4,0.5) ,它是在訓練時候被忽略的。Box regression targets是計算出來的每個anchor和它設定的object box的偏移量,如果沒有設定那麼忽略。

Classification Subnet:

分類子網路在每個空間位置,為A個anchor和K個類別,預測object presence的概率。這個子網路是小的FCN(全卷積網路),與FPN中的每層相接;這個子網路的參數在整個金字塔的層間共享。設計方法是:如果一個從金字塔某個層里來的feature map是C個通道,子網路使用 四個3	imes3 的卷積層,C個濾波器,每個都接著ReLU激活函數;接下來用 3	imes3 的卷積層,有 KA 個濾波器。最後用sigmoid激活函數對於每個空間位置,輸出 KA 個binary預測。作者用實驗中 C=256 A=9

與RPN對比,作者的object classification子網路更深,只用 3	imes3 卷積,且不和box regression子網路共享參數。作者發現這種higer-level設計決定比超參數的特定值要重要。

Box Regression Subnet:

與object classification子網路平行,作者在金字塔每個層都接到一個小的FCN上,意圖回歸每個anchor box對鄰近ground truth object的偏移量。回歸子網路的設計和分類相同,不同的是它為每個空間位置輸出4A個線性輸出。對於每個空間位置的A個anchor,4個輸出預測anchor和ground-truth box的相對偏移。與現在大多數工作不同的是,作者用了一個class-agnostic bounding box regressor,這樣能用更少的參數更高效。Object classification和bounding box regression兩個網路共享一個網路結構,但是分別用不同的參數。

Inference:

RetinaNet的inference涉及把圖片簡單地在網路中前向傳播。為了提升速度,作者只在每個FPN,從1k個top-scoring預測中提取box預測(在置信度閾值0.05處理之後)。多個層來的Top prediction聚在一起然後用NMS(非極大值抑制)以0.5為閾值。

Focal loss:

作者在分類子網路輸出的地方用了focal loss。 發現在 gamma 為2的時候效果比較好。同時RetinaNet在 gammain[0.5,5] 有相對的魯棒性。作者重點指出訓練Retina時候,在每個採樣圖片裡面,focal loss被加到所有的100K個anchor上面的。這與通常的heuristic sampling(RPN)或者 hard example mining(OHEM,SSD)選擇anchor的一小部分集合(對於每個minibatch大概256)不同。作者用了特定的anchor(不是全部的anchor,因為大部分的anchor是easy negative在focal loss中有微小的作用)來歸一化。最後 alpha 是用在設定在出現頻率低的類別,有一個穩定的範圍,它也和 gamma 一起。 這樣能把兩者融合,調兩個參數。一般來說,當 gamma 增大 ,alpha應該稍微減小( gamma=2alpha=0.25 效果最好) 。

Initialization:

作者在ResNet-50-FPN和ResNet-101-FPN的backbone上面做實驗。基礎模型是在ImageNet1K上面預訓練的。除了最後一層,RetinaNet的子網路都是初始化為bias b=0和權值weight用高斯初始化 sigma=0.01 。classification子網路的最後一層的conv層,作者的bias初始化為 b=-log((1-pi)/pi) 其中 pi 表示每個anchor在開始訓練的時候應該被標記為背景的置信度 pi 。作者用 pi=.01 在所有的實驗中。這樣初始化能夠防止大的數量的背景anchor在第一次迭代的時候產生大的不穩定的損失值。

Optimization:

RetinaNet是用SGD訓練的。作者用了同步的SGD在8個GPU上面,每個minibatch16張圖,每個GPU2張圖。所有的模型都是訓練90K迭代的,初始學習率是0.01(會在60k被除以10,以及在80K除以10)。作者只用圖像的橫向翻轉作為唯一的數據增廣方式。權值衰減0.0001以及動量0.9。訓練的損失是focal loss和標準的smooth L1 loss作為box回歸。

5. Experiments

主要說了怎麼訓練Dense Detection,包括initialization,balanced cross entropy,focal loss,分析focal loss,OHEM,Hinge loss,還有Model Architecture Design(模型的設計)。

模型設計主要講了anchor的設定,Speed與Accuracy的平衡和與state-of-the-art的比較。

6. Conclusion

作者將類別不平衡作為阻礙one-stage方法超過top-performing的two-stage方法的主要原因。為了解決這個問題,作者提出了focal loss,在交叉熵裡面用一個調整項,為了將學習專註於hard examples上面,並且降低大量的easy negatives的權值。作者的方法簡單高效。並且設計了一個全卷積的one-stage的方法來驗證它的高效性。在具有挑戰性的COCO數據集上面也達到了state-of-the-art的精度和運行時間。

推薦閱讀:

Focal Loss for Dense Object Detection解讀
計算機視覺常見領域問題概要(深度學習)
《論文研讀系列》SSD-Single Shot Multibox Detector
【小林的OpenCV基礎課 10】Canny邊緣檢測

TAG:深度學習DeepLearning | 計算機視覺 |