天天看點

目标檢測算法之RetinaNet(引入Focal Loss)

目标檢測算法之RetinaNet(引入Focal Loss)

其實說白了RetinaNet就是resnet-101-fpn + Focal loss。不了解resnet的可以檢視我前面的部落格對resnet講的很詳細。

下面我們着重來介紹一下Focal loss。

在我們的目标檢測中有三類不平衡(我這裡總結的很詳細)問題會導緻我們目标檢測的最終效果不是很理想。

而我們的Focal loss解決的就是前兩類不平衡問題。

第一類就是正負樣本不平衡,也就是目标和背景數量差距太大。

第二類就是easy positive/negative樣本太多,導緻loss函數對hard positive/negative樣本的作用很小。(至于什麼是easy positive/negative 樣本呢,就是在ground_true裡面或者是距離ground_true很遠的樣本。)下圖表示的很好了。(摘自大佬公衆号,見圖檔右下角)

第三類就是樣本種類不平衡問題。

目标檢測算法之RetinaNet(引入Focal Loss)

接下來我們說一下one-Stage檢測算法跟two—stage檢測算法的比較:

先列出兩種不平衡問題的詳細解釋:

(1)針對所有的negtive example,數量過多造成它的loss太大,以至于主導了損失函數,不利于收斂。

(2)針對單個negtive example來說,大多數的negative example不在前景和背景的過渡區域上,分類很明确(這種易分類的negative稱為easy negative),訓練時對應的背景類score會很大,換句話說就是單個example的loss很小,反向計算時梯度小。梯度小造成easy negative example對參數的收斂作用很有限,我們更需要loss大的對參數收斂影響也更大的example,即hard positive/negative example。

目标檢測算法之RetinaNet(引入Focal Loss)

那麼制約one-stage算法檢測精度的問題是什麼呢?其實就是上面提到的三種不平衡問題。下面我們着重講前兩種不平衡問題。

YOLO應對上面的不平衡問題的解決方案就是在loss函數加入權重懲罰。SSD則是利用Hard-Negtive-Mining的方式将正負樣本的比例控制在1:3。可以看得出來它們雖然可以處理第1個問題,但對于第2個問題就無能為力了。

目标檢測算法之RetinaNet(引入Focal Loss)

那麼Faster-rcnn是怎麼做的呢?Faster-RCNN在FPN階段會根據前景分數提出最可能是前景的example(2000個回歸/128個分類),這就會濾除大量背景機率高的easy negtive樣本,這便解決了上面提出的第2個問題。同時,在生成樣本給ROIPooling層的時候,會據IOU的大小來調整positive和negative example的比例,比如設定成1:3,這樣防止了negative過多的情況(同時防止了easy negative和hard negative),就解決了前面的第1個問題。是以,相對于One-Stage檢測器,Faster-RCNN的精度更高。

Focal Loss

Focal loss是基于交叉熵(我這篇文章對交叉熵寫的很詳細,想了解的可以順便看一下)而來的:

目标檢測算法之RetinaNet(引入Focal Loss)

那麼先來解決第一個問題,正負樣本不均勻。這個so easy,加一個權重參數就好了。

目标檢測算法之RetinaNet(引入Focal Loss)

接下來來解決易分樣本對損失函數影響大的問題,直覺的解決方案就是将易分樣本的權重減小不就好了!

目标檢測算法之RetinaNet(引入Focal Loss)

我們取 γ \gamma γ等于2來隻管感受一下,如果p = 0.9,那麼 ( 1 − 0.9 ) 2 = 0.001 (1-0.9)^{2}=0.001 (1−0.9)2=0.001,損失降低了1000倍。最終Focal Loss還結合了公式(2),這很好了解,公式(3)解決了難易樣本的不平衡,公式(2)解決了正負樣本的不平衡,将公式(2)與(3)結合使用,同時解決正負難易2個問題!是以最終Focal Loss的形式如下:

目标檢測算法之RetinaNet(引入Focal Loss)

實驗中證明,當 γ \gamma γ取2,p取0.75的時候效果最好。

目标檢測算法之RetinaNet(引入Focal Loss)

下圖是RetinaNet的網絡結構圖。

目标檢測算法之RetinaNet(引入Focal Loss)

訓練RetinaNet時有幾個值得注意的關鍵點:

1、訓練時FPN每一級的所有example都被用于計算Focal Loss,loss值加到一起用來訓練。

2、測試時FPN每一級隻選取score最大的1000個example來做nms。

3、整個結構不同層的head部分(上圖中的c和d部分)共享參數,但分類和回歸分支間的參數不共享。

4、分類分支的最後一級卷積的bias初始化成前面提到的-log((1-π)/π。

繼續閱讀