Focal Loss 論文詳解

點擊下方AI算法與圖像處理”,一起進步!

重磅乾貨,第一時間送達

Github:https://github.com/ccc013/AI_algorithm_notes



論文:《Focal Loss for Dense Object Detection》

論文地址:https://arxiv.org/abs/1708.02002

代碼地址:

  • 官方 github:https://github.com/facebookresearch/detectron
  • tensorflow:https://github.com/tensorflow/models
  • https://github.com/fizyr/keras-retinanet
  • https://github.com/yhenon/pytorch-retinanet

目前在目標檢測領域裏二階段的方法精度是優於一階段的,儘管一階段的檢測器處理的是更密集的樣本,應該可以做到更快、更簡單,作者認爲沒有實現這種期望的原因是在於正負樣本的極度不平衡(前景和背景),所以作者提出了一個新的 loss,稱爲 Focal Loss,它通過修改標準的交叉熵函數,比如可以降低對識別很好的樣本的權重,這樣它會專注於訓練少量困難樣本,而不會被大量簡單的樣本所幹擾。

另外,就是基於 FPN 提出了一個新的檢測框架,稱爲 RetinaNet,實驗表明它在精度上優於當前最好的二階段檢測算法,速度上好過一階段的檢測算法。


1. Introduction

當前主流的目標檢測方法是分爲兩階段 two-stage 和 一階段 one-stage:

  • 兩階段的做法是先在第一個階段生成了稀疏的候選 bbox,然後第二階段對這些 bbox 進行分類,判斷是目標物體還是背景,兩階段檢測算法也是當前精度最高的目標檢測算法
  • 一階段的檢測方法是直接處理大量的候選 bbox,檢測和分類同時完成,儘管速度很快,但是其精度相比於兩階段最好的算法還是有 10%-40%的差距;

作者認爲一階段檢測算法的主要問題在於沒有很好處理類別不平衡的問題:

  • 兩階段檢測算法在第一個階段同個如 RPN等方法生成候選 bbox 的時候,就會過濾掉大量的背景樣本,在第二階段進行分類的時候,採樣策略使用瞭如固定的前後景比例(1:3),或者在線困難樣本挖掘( online hard example mining ,OHEM)都可以保持一個合理的類別比例;
  • 一階段檢測算法雖然也採取了同樣的採樣策略,但是由於候選的 bbox 數量太多(超過 100k),這些策略會由於很多容易分類的背景樣本導致非常低效,當然這個也是目標檢測裏的經典問題,也有一些解決辦法,比如 boostrapping,或者困難樣本挖掘;
  • 類別不平衡問題在一階段和兩階段檢測算法中都存在,它會導致兩個問題:
    • 由於大量易分類的負樣本(背景)導致訓練是低效的,因爲這些樣本不能提供有效的信息;
    • 易區分的負樣本也會破壞模型的訓練,導致模型的退化;

作者希望結合一階段和二階段的優點,即做到又快又精準,所以提出了一個新的 loss 函數,稱爲 Focal Loss,其作用是動態調整交叉熵函數的大小,設置的縮放因子會隨着樣本是否容易區分而變化,如下圖所示:

直觀上來說,這個縮放因子會自動降低易區分樣本的權重,讓模型在訓練的時候專注於訓練少量的困難樣本。

爲了驗證這個方法的有效性,作者使用 RPN 作爲骨幹網絡,提出了一個一階段檢測框架,併成爲 RetinaNet,其實驗結果如下圖所示,結果表明 RetinaNet 可以做到速度和精度之間的平衡,速度比二階段檢測算法更快,精度比一階段檢測算法更好。

另外,作者強調了 RetinaNet 取得這樣的成果主要是依賴於 loss 的改進,在網絡結構方面並沒有創新。

2. Focal Loss

Focal Loss 是爲了解決一階段檢測算法中極度類別不平衡的情況(比如正負樣本比 1:1000)所設計的 loss 函數,它是對標準的交叉熵函數的修改。

首先,標準的交叉熵函數公式如下:

其中 y 表示樣本的真實標籤,這裏用二分類舉例,所以 y 的取值就是 1 或者 -1,而 p 是模型預測的概率,取值範圍是 [0,1],然後 是:

在第一節Introduction的 Figure1 裏,最上邊的藍色曲線就是表示交叉熵損失函數面對不同樣本的 loss,可以看到即便是非常容易區分的樣本,即 遠大於 0.5 的樣本,交叉熵計算得到的 loss 依然是非常的大,如果把大量的這種樣本的 loss 進行求和,會破壞少量的困難樣本提供的信息。

2.1 Balanced Cross Entropy

之前也有人提出了一個平衡的交叉熵函數,如下所示:

這裏引入了一個權重因子 ,它和類別數量成反比,也就是類別數量越少的類別,其 loss 權重會越大。這也是本文方法的 baseline。

不過這個 loss 函數的問題在於增加的權重因子只是區分了正負樣本,但是並不能區分容易分類和很難分類的樣本,因此本文是針對這點進行了改進,提出了 Focal Loss。

2.2 Focal Loss

Focal Loss 的計算公式如下:

這裏增加了一個超參數 ,作者稱爲聚焦參數(focusing parameter),在本文實驗中 的效果最好,而它爲 0 的時候就是標準的交叉熵函數。

對於 Focal loss,有兩個特點:

  1. 當有樣本被誤分類,並且 很小的時候,調節因子 是接近於 1,對於 loss 來說是影響不大,但隨着 趨向於 1,這個因子會逐漸趨向於 0,則對於分類很好的樣本的 loss 也會變小從而達到降低權重的效果;
  2. 聚焦參數 會平滑的調節易分類樣本調低權值的比例; 增大能增強調節因子的影響,實驗中表明瞭 是效果最好,直觀上來說,調節因子減少了易分類樣本的損失貢獻,拓寬了樣本接收到低損失的範圍。

在實際應用中,會結合平衡交叉熵,得到的 focal loss 如下所示,這樣既可以調整正負樣本的權重,又可以控制難易分類樣本的權重:

實驗中表明這個 loss 可以比不加入 的 loss 提升一點精度。

2.3 Class Imbalance and Model Initialization

在二分類中,默認二分類的輸出概率都是相等的,但這種初始化會導致數量很多的類別的 loss 在整體 loss 中佔據較大的比例,這會影響訓練初期的穩定性。

對於這個問題,作者在初期訓練中爲少數類(即前景)的模型評估 引入了一個 prior 的概念,並用 表示它,然後將其設置爲比較小的數值,實驗表明無論是使用交叉熵還是 focal loss,在面對嚴重的類別不平衡的問題時,這個做法都能提高訓練的穩定性。

2.4 Class Imbalance and Two-stage Detectors

兩階段的檢測算法一般都是使用標準的交叉熵函數,很少使用平衡的交叉熵或者 focal loss,它們處理類別不平衡問題主要是依靠兩個機制:

  1. 兩階段的串聯方式;
  2. 有選擇的 mini-batch 的採樣方式

在第一階段就會減少大量的候選 bbox,將數量降低到 1-2k,並且並非隨機刪除,而是可以刪除了大量的負樣本;在第二階段會採用有選擇的採樣方法來構建 mini-batch,比如採用正負樣本比是 1:3 的比例,這個比例的作用等同於平衡的交叉熵中加入的 參數。


3. RetinaNet Detector

RetinaNet 的整體結構如下圖所示:

RetinaNet 是一個一階段檢測框架,它包含了一個骨幹網絡以及兩個特定任務的子網絡,骨幹網絡是對輸入圖片計算其特徵圖,然後兩個子網絡分別骨幹網絡的輸出做分類和候選框迴歸的工作。

Feature Pyramid Network 骨幹網絡

RetinaNet 採用 FPN 作爲骨幹網絡,FPN 的結構如上圖的 a-b,這裏是基於 ResNet 構建的 FPN,它是一個自頂向下,帶有側面連接的卷積神經網絡,在輸入是單種分辨率的情況下,它可以得到多種尺度的特徵。

本文是構建了一個 P3 到 P7的金字塔,其中 l 表示金字塔的級別, 的分辨率是輸入的分辨率的 ,每個級別的金字塔的通道數量都是 C = 256.

Anchors

本文采用了 translation-invariant anchor boxes,每個 anchor 在金字塔的 P3 到 P7分別擁有 的區域,並且在每個金字塔級別設置的高寬比是 {1:2, 1:1, 2:1} ,對應的設置縮放比例是 { } ,最終在每個金字塔層上是產生了 A=9 個 anchors,並且能覆蓋對應網絡輸入圖片上 32~813 像素的區域。

每個 anchor 都是 K 個分類目標的 one-hot 向量(K 表示類別數量)和 4 個 box regression 的目標。作者設定 anchor 的方式是和真實標籤物體檢測框的 IoU(intersection-over-union)的閾值爲 0.5,和背景的 IoU 是 [0, 0.4),而如果是在 [0.4,0.5),訓練的時候將被忽略;

迴歸檢測框(Box regression)目標是計算每個 anchor 和其分配的物體框的偏移量,如果沒有設定則是忽略。

分類子網絡(Classification Subnet)

分類子網絡的作用是預測在每個空間位置上,A 個 anchor 和 K 個類別物體出現的概率。這個子網絡是一個小型的 FCN,並且和 FPN 每層都連接,然後子網絡的參數是在所有金字塔層中都共享的。

這個子網絡的設計比較簡單,給定某個金字塔層的通道數量是 C的輸入特徵圖,然後會先通過 4 個卷積核爲 ,數量是 C 的卷積層,並採用 ReLU 激活函數,接着是一個卷積核同樣是 ,但是數量是 的卷積層,然後用 sigmoid 激活函數並對每個空間位置輸出 KA 個二值預測,在本文實驗中,C=256,A=9.

這裏對比 RPN 網絡,本文采用的分類子網絡是層數更多,並且僅採用 的卷積核,同時並沒有和下面介紹的 box regression 子網絡共享參數,這是因爲作者發現更高層的設計決定會比特定值的超參數更加重要

迴歸檢測框子網絡(Box Regression Subnet)

跟分類子網絡是並行的關係,作者同樣採用一個小型的 FCN 網絡,並且也是和FPN 每層相連接,目的是迴歸每個 anchor box 對相鄰真實標籤物體的偏移量。

在網絡設計方面和分類子網絡是類似的,不相同的是輸出的是4A 個線性輸出。對於每個空間位置上的 A 個 anchor,這 4 個輸出預測的是 anchor 和真實標籤檢測框的偏移量,另外和現在大部分工作不同的是,作者採用了一個 class-agnostic bounding box regressor,即可以用更少的參數但更加高效。

分類子網絡和迴歸檢測框子網絡是共享相同的網絡結構,但是分別採用不同的參數。

4. 實驗

實驗結果如下:

a)在標準交叉熵 loss 基礎上增加了參數 的結果,其中 就是傳統的交叉熵,表格中可以看出在 0.75 的時候效果最好,AP 提升了 0.9;

b)對比了不同 的實驗結果,隨着 的增加,AP提升比較明顯,另外當 的時候是效果最好的時候;

c)對比了 anchor 的大小 scale 和長寬比 aspect ratio 對於效果的影響,最好的結果是分別選擇 2 和 3 的時候;

d)和採用 OHEM 方法的對比,這裏看到最好的 OHEM 效果是 AP=32.8,而 Focal Loss 是 AP=36,提升了 3.2,另外這裏 OHEM1:3 表示通過 OHEM 得到的 minibatch 中正負樣本比是 1:3,但是這個做法並沒有提升 AP;

e)對比了在不同網絡模型深度和輸入圖像大小下的AP 和速度。

5. 結論

本文作者認爲一階段檢測算法不能在性能上超過二階段檢測算法的根本原因是類別的極度不平衡問題,爲了解決這個問題,提出了一個 focal loss,它對標準的交叉熵 loss 進行修改從而可以實現讓網絡模型更專注學習困難的負樣本。本文的方法是簡單但高效的,並且設計了一個全卷積的一階段檢測框架來驗證其高效性,實驗結果也表明了其可以達到 state-of-art 的精度和速度。


努力分享優質的計算機視覺相關內容,歡迎關注:

  
     
     
     
個人微信(如果沒有備註不拉羣!
請註明: 地區+學校/企業+研究方向+暱稱



下載1:何愷明頂會分享


AI算法與圖像處理」公衆號後臺回覆:何愷明,即可下載。總共有6份PDF,涉及 ResNet、Mask RCNN等經典工作的總結分析


下載2:終身受益的編程指南:Google編程風格指南


AI算法與圖像處理」公衆號後臺回覆:c++,即可下載。歷經十年考驗,最權威的編程規範!




   
   
   
下載3 CVPR2021

AI算法與圖像處公衆號後臺回覆: CVPR 即可下載1467篇CVPR 2020論文 和 CVPR 2021 最新論文

點亮 ,告訴大家你也在看



本文分享自微信公衆號 - AI算法與圖像處理(AI_study)。
如有侵權,請聯繫 [email protected] 刪除。
本文參與“OSC源創計劃”,歡迎正在閱讀的你也加入,一起分享。

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