天天看點

Focal Loss 論文筆記

Focal Loss 論文筆記

論文:《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,實驗表明它在精度上優于目前最好的二階段檢測算法,速度上好過一階段的檢測算法。

聯系方式:

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

知乎專欄:機器學習與計算機視覺,AI 論文筆記

微信公衆号:AI 算法筆記

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,其作用是動态調整交叉熵函數的大小,設定的縮放因子會随着樣本是否容易區分而變化,如下圖所示:

Focal Loss 論文筆記

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

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

Focal Loss 論文筆記

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

2. Focal Loss

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

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

C E ( p , y ) = C E ( p t ) = − l o g ( p t ) CE(p,y)=CE(p_t)=-log(p_t) CE(p,y)=CE(pt​)=−log(pt​)

其中 y 表示樣本的真實标簽,這裡用二分類舉例,是以 y 的取值就是 1 或者 -1,而 p 是模型預測的機率,取值範圍是 [0,1],然後 p t p_t pt​ 是:

Focal Loss 論文筆記

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

2.1 Balanced Cross Entropy

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

Focal Loss 論文筆記

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

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

2.2 Focal Loss

Focal Loss 的計算公式如下:

Focal Loss 論文筆記

這裡增加了一個超參數 γ \gamma γ ,作者稱為聚焦參數(focusing parameter),在本文實驗中 γ = 2 \gamma=2 γ=2 的效果最好,而它為 0 的時候就是标準的交叉熵函數。

對于 Focal loss,有兩個特點:

  1. 當有樣本被誤分類,并且 p t p_t pt​ 很小的時候,調節因子 ( 1 − p t ) γ (1-p_t)^\gamma (1−pt​)γ 是接近于 1,對于 loss 來說是影響不大,但随着 p t p_t pt​ 趨向于 1,這個因子會逐漸趨向于 0,則對于分類很好的樣本的 loss 也會變小進而達到降低權重的效果;
  2. 聚焦參數 γ \gamma γ 會平滑的調節易分類樣本調低權值的比例; γ \gamma γ 增大能增強調節因子的影響,實驗中表明了 γ = 2 \gamma =2 γ=2 是效果最好,直覺上來說,調節因子減少了易分類樣本的損失貢獻,拓寬了樣本接收到低損失的範圍。

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

Focal Loss 論文筆記

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

2.3 Class Imbalance and Model Initialization

在二分類中,預設二分類的輸出機率都是相等的,但這種初始化會導緻數量很多的類别的 loss 在整體 loss 中占據較大的比例,這會影響訓練初期的穩定性。

對于這個問題,作者在初期訓練中為少數類(即前景)的模型評估 p p p 引入了一個

prior

的概念,并用 π \pi π 表示它,然後将其設定為比較小的數值,實驗表明無論是使用交叉熵還是 focal loss,在面對嚴重的類别不平衡的問題時,這個做法都能提高訓練的穩定性。

2.4 Class Imbalance and Two-stage Detectors

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

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

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

3. RetinaNet Detector

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

Focal Loss 論文筆記

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

Feature Pyramid Network 骨幹網絡

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

本文是建構了一個 P3 到 P7的金字塔,其中 l 表示金字塔的級别, P l P_l Pl​ 的分辨率是輸入的分辨率的 1 / 2 l 1/2^l 1/2l ,每個級别的金字塔的通道數量都是 C = 256.

Anchors

本文采用了 translation-invariant anchor boxes,每個 anchor 在金字塔的 P3 到 P7分别擁有 3 2 2 32^2 322 到 51 2 2 512^2 5122 的區域,并且在每個金字塔級别設定的高寬比是 {1:2, 1:1, 2:1} ,對應的設定縮放比例是 { 2 0 , 2 1 / 3 , 2 2 / 3 2^0, 2^{1/3}, 2^{2/3} 20,21/3,22/3} ,最終在每個金字塔層上是産生了 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 個卷積核為 3 × 3 3\times 3 3×3 ,數量是 C 的卷積層,并采用 ReLU 激活函數,接着是一個卷積核同樣是 3 × 3 3\times3 3×3 ,但是數量是 K × A K\times A K×A 的卷積層,然後用 sigmoid 激活函數并對每個空間位置輸出 KA 個二值預測,在本文實驗中,C=256,A=9.

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

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

跟分類子網絡是并行的關系,作者同樣采用一個小型的 FCN 網絡,并且也是和FPN 每層相連接配接,目的是回歸每個 anchor box 對相鄰真實标簽物體的偏移量。

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

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

4. 實驗

實驗結果如下:

Focal Loss 論文筆記

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

b)對比了不同 γ \gamma γ 和 α \alpha α 的實驗結果,随着 γ \gamma γ 的增加,AP提升比較明顯,另外當 γ = 2 \gamma =2 γ=2 的時候是效果最好的時候;

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 的精度和速度。

繼續閱讀