做者|GUEST BLOG
編譯|Flin
來源|analyticsvidhyapython
對象檢測是計算機視覺社區中研究最普遍的主題之一。它已經進入了各個行業,涉及從圖像安全,監視,自動車輛系統到機器檢查的用例。安全
當前,基於深度學習的對象檢測能夠大體分爲兩類:機器學習
兩級檢測器,例如基於區域的CNN(R-CNN)及其後續產品。ide
一級探測器,例如YOLO系列探測器和SSD函數
應用於錨框的常規,密集採樣(可能的物體位置)的一級檢測器可能會更快,更簡單,但因爲在訓練過程當中遇到極端的等級失衡,其精度已經落後於兩級探測器。學習
FAIR在2018年發表了一篇論文,其中他們引入了焦點損失的概念,用他們稱爲RetinaNet的一級探測器來處理此類不平衡問題。ui
在咱們深刻探討焦點丟失的本質以前,讓咱們首先了解這個類不平衡問題是什麼以及它可能引發的問題。.net
爲何須要焦點損失對象
什麼是焦點損失blog
交叉熵損失
平衡交叉熵損失
焦點損失說明
交叉熵損失 vs 焦點損失
最後的想法
兩種經典的一級檢測方法,如加強型檢測器,DPM和最新的方法(如SSD)均可以評估每一個圖像大約10^4 至 10^5個候選位置,但只有少數位置包含對象(即前景),而其他只是背景對象。這致使了類不平衡的問題。
這種不平衡致使兩個問題
訓練效率低下,由於大多數位置都容易被判斷爲負類(這意味着檢測器能夠輕鬆將其歸類爲背景),這對檢測器的學習沒有幫助。
容易產生的負類(機率較高的檢測)佔輸入的很大一部分。雖然單獨計算的梯度和損失較小,但它們可能使損耗和計算出的梯度不堪重負,並可能致使模型退化。
簡而言之,焦點損失(Focal Loss,FL)是交叉熵損失(Cross-Entropy Loss,CE)的改進版本,它經過爲難分類的或容易錯誤分類的示例(即帶有噪聲紋理的背景或部分對象的或咱們感興趣的對象)分配更多的權重來處理類不平衡問題,並對簡單示例(即背景對象)下降權重。
所以,焦點損失減小了簡單示例的損失貢獻,並增強了對糾正錯誤分類的示例的重視。
所以,讓咱們首先了解二進制分類的交叉熵損失。
交叉熵損失背後的思想是懲罰錯誤的預測,而不是獎勵正確的預測。
二進制分類的交叉熵損失以下:
其中:
Yact = Y的實際值
Ypred = Y的預測值
爲了標記方便,咱們記 Yact = Y 且 Ypred = p 。
Y∈{0,1},這是正確標註
p∈[0,1],是模型對Y = 1的類別的估計機率。
爲了符號上的方便,咱們能夠將上述方程式改寫爲:
pt = {-ln(p) ,當Y=1 -ln(1-p) ,當 Y=}
CE(p,y)= CE(pt)=-ln(pt)
如你所見,下圖中的藍線表示當p很是接近0(當Y = 0時)或1時,容易分類的pt > 0.5的示例可能會產生不小的幅度的損失。
讓咱們用下面的例子來理解它。
假設,前景(咱們稱其爲類1)正確分類爲p = 0.95 ——
CE(FG)= -ln(0.95)= 0.05
而且背景(咱們稱其爲類0)正確分類爲p = 0.05 ——
CE(BG)=-ln(1- 0.05)= 0.05
問題是,對於類不平衡的數據集,當這些小的損失在整個圖像上相加時,可能會使總體損失(總損失)不堪重負。所以,將致使模型退化。
解決類別不平衡問題的一種常見方法是爲類別引入權重因子∝[0,1]
爲了標記方便,咱們能夠在損失函數中定義 ∝t 以下:
CE(pt)= -∝t ln ln(pt)
如你所見,這只是交叉熵的擴展。
咱們的實驗將代表,在密集檢測器訓練過程當中遇到的大類不平衡壓倒了交叉熵損失。
容易分類的負類佔損耗的大部分,並主導梯度。雖然平衡了正例/負例的重要性,但它並無區分簡單/困難的示例。
讓咱們經過一個例子來理解這一點
假設,前景(咱們稱其爲類1)正確分類爲p = 0.95 ——
CE(FG)= -0.25 * ln(0.95)= 0.0128
正確分類爲p = 0.05的背景(咱們稱之爲類0)——
CE(BG)=-(1-0.25)* ln(1- 0.05)= 0.038
雖然能夠很好地正確區分正類和負類,但仍然不能區分簡單/困難的例子。
這就是焦點損失(擴展到交叉熵)起做用的地方。
焦點損失只是交叉熵損失函數的擴展,它將下降簡單示例的權重,並將訓練重點放在困難的負樣本上。
爲此,研究人員提出:
(1- pt)γ 爲交叉熵損失,且可調聚焦參數γ≥0。
RetinaNet物體檢測方法使用焦點損失的α平衡變體,其中α = 0.25,γ= 2效果最佳。
所以,焦點損失能夠定義爲——
FL (pt) = -αt(1- pt)γ log log(pt).
對於γ∈[0,5]的幾個值,能夠看到焦點損失,請參見圖1。
咱們將注意到焦點損失的如下特性:
隨着增長,調製因數的做用一樣增長。(通過大量實驗和試驗,研究人員發現γ = 2效果最佳)
注意:當γ= 0時,FL等效於CE。參考圖中藍色曲線。
直觀上,調製因數減小了簡單示例的損耗貢獻,並擴展了示例接收低損耗的範圍。
讓咱們經過一個例子來了解上述焦點損失的特性。
前景正確分類,預測機率p=0.99,背景正確分類,預測機率p=0.01。
pt = {0.99,當Yact = 1 時 1-0.01,當Y act = 0時}調製因數(FG)=(1-0.99)2 = 0.0001
調製因數(BG)=(1-(1-0.01))2 = 0.0001,如你所見,調製因數接近於0,所以損耗將被權重下降。
前景被錯誤分類,預測機率p = 0.01,背景對象被錯誤分類,預測機率p = 0.99。
pt = {0.01,當Yact = 1 時 1-0.99,當Y act = 0時}調製因數(FG)=(1-0.01)2 = 0.9801
調製因數(BG)=(1-(1-0.99))2 = 0.9801如你所見,調製因數接近於1,所以損耗不受影響。
如今,讓咱們使用一些示例比較交叉熵和焦點損失,並查看焦點損失在訓練過程當中的影響。
讓咱們經過考慮如下幾種狀況來進行比較。
假設前景正確分類的預測機率爲p = 0.95,背景正確分類的背景爲預測機率p = 0.05。
pt = {0.95, 當 Yact=1時 1-0.05 ,當 Yact = 0時} CE(FG)= -ln (0.95) = 0.0512932943875505
讓咱們考慮在∝ = 0.25和γ= 2時的焦點損失。
FL(FG)= -0.25 * (1-0.95)2 * ln (0.95) = 3.2058308992219E-5
FL(BG)= -0.75 * (1-(1-0.05))2 * ln (1-0.05) = 9.61E-5
假設預測機率p=0.05的前景被分類爲預測機率p=0.05的背景對象。
pt = {0.95,當Y act = 1 1-0.05時,當Y act = 0時}
CE(FG)= -ln(0.05)= 2.995732273553991
CE(BG)= -ln(1-0.95)= 2.995732273553992
讓咱們考慮相同的場景,即∞=0.25和γ=2。
FL(FG)= -0.25 * (1-0.05)2 * ln(0.05)= 0.675912094220619
FL(BG)= -0.75 * (1-(1-0.95))2 * ln(1-0.95)= 2.027736282661858
假設對預測機率p=0.01的背景對象,用預測機率p=0.99對前景進行分類。
pt = {0.99, 當 Yact=1時 1-0.01 ,當 Yact = 0時}CE(FG)= -ln (0.99) = 0.0100503358535014
CE(BG)= -ln(1-0.01)= 0.0100503358535014
讓咱們考慮相同的場景,即∞=0.25和γ=2。
FL(FG)= -0.25 * (1-0.01)2 * ln(0.99)= 2.51 * 10 -7
FL(BG)= -0.75 * (1-(1-0.01))2 * ln(1-0.01) = 7.5377518901261E-7
方案1:0.05129 / 3.2058 * 10 -7 =小1600倍
方案2:2.3 / 0.667 =小4.5倍
方案3:0.01 / 0.00000025 =小40,000倍。
這三個案例清楚地說明了焦點損失如何減少分類良好的記錄的權重,另外一方面又爲錯誤分類或較難分類的記錄賦予較大的權重。
通過大量的試驗和實驗,研究人員發現 ∝ = 0.25和 γ = 2 效果最佳。
在對象檢測中,咱們經歷了從交叉熵損失到焦點損失的整個進化過程。我已經盡力解釋了目標檢測中的焦點損失。
感謝閱讀!
https://medium.com/@14prakash/the-intuition-behind-retinanet-eb636755607d
https://developers.arcgis.com/python / guide / how-retinanet-works /
原文連接:https://www.analyticsvidhya.com/blog/2020/08/a-beginners-guide-to-focal-loss-in-object-detection/
歡迎關注磐創AI博客站:
http://panchuang.net/
sklearn機器學習中文官方文檔:
http://sklearn123.com/
歡迎關注磐創博客資源彙總站:
http://docs.panchuang.net/