# Focal Loss for Desnse Object Detection *Tsung-Yi Lin Priya Goyal Ross Girshick Kaiming He Piotr Dollar´ Facebook AI Research (FAIR)* [[paper link]](<https://arxiv.org/pdf/1708.02002.pdf>) 重點整理 - Focal Loss主要目的在於解決資料不平衡的情形,但資料是指什麼資料?誰跟誰不平衡? - 本篇提出的架構RetinaNet的來由及架構淵源 - 單就Focal Loss的技巧就讓One-Stage表現與Two-Stage旗鼓相當,另外模型的架構也是提升準確率的一大原因 - <font color=fee0000>作者自己強調,效果好不是架構的功勞,是那個厲害的Loss</font> ## 背景介紹 本篇任務為Object Detection,談到物件偵測,就要先聊聊常見的兩大架構。 ### One-Stage vs Two-Stage 首先介紹Object Detection任務中常見的兩種架構 - Two-Stage: (1)提出候選區域 (2)對候選區域分類。R-CNN、Fast R-CNN、Faster R-CNN都屬於此類。 - One-Stage: (1)直接預測特徵圖每個grid屬於什麼類別的機率以及(x, y, w, h)。YOLO系列、SSD(Single Shot Detector)屬於此類。 在當時,Two-Stage的雖然速度較慢但有較好的表現。另外,有人提出降低input的解析度,或是減少候選區域的數目,這些策略讓Two-Stage獲得更快的計算速度,漸漸取得優勢。 為此,本篇論文希望為One-Stage的架構爭一口氣,更快的速度且有更好的表現。 ## 本文貢獻 ### Focal Loss 在當時One-Stage表現大多不如Two-Stage,原因是如果整個畫面大多為背景,model只要傾向判斷為背景,就能得到不錯的結果。相較之下,Two-Stage在第一步驟就已經濾除大部分背景了,因此有較好的表現。 #### <font color=#ee0000>為了解決資料不平衡(Class Imbalance)的問題 --> 提出**Focal Loss**</font> ![image](https://hackmd.io/_uploads/ryMoqQzpa.png =60%x) 對比上圖的兩個公式,不難發現與CE Loss相比,FL Loss多了一項$(1-p_t)^\gamma$,其中$p_t$代表label類別的信心分數,$\gamma$ 是一個可調的參數,用於影響曲線的位置。 - 當 $\gamma=0$ 時,CE Loss等同於FL Loss,<font color=#0071a1>藍線所示</font> - 當 $\gamma$ 漸漸變大時,FL Loss的曲線越來越靠近綠色 - 以 $\gamma=5$ 的綠線為例,在$p_t$(橫軸)越大時,整體loss值越小。代表了當預測越有自信時,此樣本越不影響模型訓練。 - 透過策略壓制**容易預測**的樣本,提升**難判斷樣本**的影響力,變向達到平衡數量的目的。 事實上,Focal Loss完整定義如下,包括了接下來提到的BCE Loss的概念 $$ FC(p_t)=-\alpha_t(1-p_t)^\gamma\log(p_t) $$ #### Balanced Cross Entropy 平衡樣本不平均的基本想法,在原始CE上加上一平衡係數,對應不同類別係數 $\alpha_t$ 也會變動,通常是類別數量的反比。 $$ CE(p_t)=-\alpha_t\log(p_t) $$ #### Focal Loss vs. Huber Loss 概略上而言,HL對於信心分數低的樣本加強Loss。相反的FL對於信心分數高的樣本降低Loss,即使 數量多也不影響整體表現。 ### RetinaNet ![image](https://hackmd.io/_uploads/HkInOIf6a.png) 架構簡介: - Feature Pyramid Network : 圖中間部分,對原始圖片做上下採樣的捲積,獲得不同尺度大小的特徵圖,概念來自於FPN、SSD論文。 - 對每一層特徵圖都做雙流的預測 : 圖右的上半部為分類任務用來預測BBOX的分類(K類別 * A種Anchor),圖右的下半部分為regression任務用來預測BBOX的與最鄰近gt的offset。 - 模型的輸出 : 三層特徵圖的預測結果合併。 下面列出實驗結果,論文中還有對不同參數的消融實驗。 ![image](https://hackmd.io/_uploads/r1MQM1Qpp.png) 順帶一提,資料不平衡時對model訓練時的初始化策略也有一套 ### 模型驗證 作者對訓練完畢的模型,重新輸入資料並紀錄輸出的Loss,對Loss排序後的結果累加,得到下圖的曲線。可以驗證**Focal Loss確實有關注少數樣本的能力** ![image](https://hackmd.io/_uploads/SJmqBJXap.png) ## 補充 ### Focal Loss參考程式碼 ``` import torch import torch.nn as nn class FocalLoss(nn.Module): def __init__(self, loss_fn, alpha=1, gamma=2, reduction='mean'): super(FocalLoss, self).__init__() self.loss_fn = loss_fn self.alpha = alpha self.gamma = gamma self.reduction = reduction def forward(self, inputs, targets): loss = self.loss_fn(inputs, targets) pt = torch.exp(-loss) # 還原pt值,loss_fn包含log性質才可以這樣還原 focal_loss = self.alpha * (1.00001 - pt) ** self.gamma * loss if self.reduction == 'mean': return focal_loss.mean() elif self.reduction == 'sum': return focal_loss.sum() else: return focal_loss ``` ### 名詞 - Easy Example : 預測一個類別**信心分數很高**時,這個樣本就稱為Easy Example。反之是Hard Example。 - Hard Negative Mining : 將難以分類的樣本挑出來加強學習,可以加強模型的表現,也對樣本不平衡時有幫助。 - Inlier : Easy Example的別稱。 - Outlier : Hard Example的別稱。 - Anchors : 來自Faster R-CNN論文中的RPN(Rigion Proposal Network),預測BBOX時會事先定義幾種不同比例、大小的方框,幫助模型的預測。 ### 延伸 - [ ] SPP(Spatial Pyramid Pooling),讓模型可以處理不同輸入大小的圖像,**尺度不變性**。不同於crop、wrap,尤其wrap等會破壞長寬比 - [ ] ROI Pooling,都能使不同尺度的輸入特徵有效轉換為相同大小的輸出 - [ ] SSD(Single Shot Detector),屬於FPN(Feature Pyramid Network)的一種 - [ ] RPN(Rigion Proposal Network)在Faster R-CNN中被提出 - [ ] [OHEM(online hard example mining) vs. heuristic sampling](<https://arxiv.org/pdf/1604.03540.pdf>) - [ ] [FPN論文](<https://arxiv.org/pdf/1612.03144.pdf>) - [ ] Huber Loss也是為了解決樣本不均發展出來的Loss