文章: Focal Loss for Dense Object Detection
作者: Tsung-Yi Lin, Priya Goyal, Ross Girshick, Kaiming He, Piotr Dollár
核心亮點
(1) 分析并指出了One Stage方法精度不高的原因:
- 極度不平衡的正負(fù)樣本比例: anchor是一種類似sliding windows的選框方式, 這會使得正負(fù)樣本的比例接近1000:1, 而且絕大部分負(fù)樣本都是easy example.
- 梯度優(yōu)化過程被easy example過度影響: 這些easy example的loss雖然不高, 但由于數(shù)量眾多, 最終合起來會對loss有很大的貢獻, 從而導(dǎo)致優(yōu)化的時候過度關(guān)注這些easy example, 這樣會收斂到一個不夠好的結(jié)果.
(2) 提出了解決正負(fù)樣本比例和easy example 問題的Focal loss:
核心思想很簡單, 就是在優(yōu)化過程中逐漸減低那些easy example的權(quán)重, 這樣會使得訓(xùn)練優(yōu)化過程對更有意義的樣本有更高的偏置.
PS:
注一: 為什么Focal Loss沒有用在Two Stage方法上面? 這是因為以RCNN為代表的一系列Two Stage會在區(qū)域候選推薦階段采用兩個問題來降低正負(fù)樣本比例和easy example問題帶來的影響:
- 采用NMS算法將物體位置候選框降低到一到兩千個,更重要的是僻族,這一到兩千個可能位置并不是隨機選取的粘驰,它們移除了大量的易分類負(fù)樣本(背景框)
- 采用了biased-minibatch的采樣策略, 比如,保證正樣本和負(fù)樣本的比例為1:3進行訓(xùn)練(這其實相當(dāng)于起到了
因子的作用
Focal Loss 的兩個重要性質(zhì):
- 當(dāng)一個樣本被分錯的時候,
是很小的, 比如當(dāng)
時,
要小于0.5才算是錯分類, 此時
就比較小, 反之亦然, 因此調(diào)制系數(shù)就會趨近于1, 也就是說相比原來的loss沒有太大的改變, 而當(dāng)
趨近于1的時候, 說明此時分類正確而且是易分類樣本, 調(diào)制系數(shù)就會趨近于0, 也就是該樣本對總的loss的貢獻度很小.
- 當(dāng)
的時候, focal loss就是傳統(tǒng)的交叉熵?fù)p失, 隨著
的增加, 調(diào)制系數(shù)的影響力也會增加
論文細(xì)節(jié)
背景介紹
首先述么,Lin等人回顧了一下目前目標(biāo)檢測的發(fā)展概況蝌数,先進的目標(biāo)檢測算法目前大概分成兩種,一種是one-stage的度秘,一種是two-stage的顶伞。one-stage的代表作YOLO以一種簡單統(tǒng)一的網(wǎng)絡(luò)成功實現(xiàn)了實時檢測的目的,但是它的準(zhǔn)確率并不是best剑梳。相反的唆貌,two-stage的代表作RCNN系列則是在準(zhǔn)確率方面完勝其他模型,但是它的檢測速度真的是慢的有的可憐(相比于YOLO)垢乙。 于是挠锥,Lin他們就開始研究造成這種現(xiàn)象的原因,接著他們就發(fā)現(xiàn)原來是在訓(xùn)練的時候侨赡,后景數(shù)據(jù)相比于前景數(shù)據(jù)較少的緣故蓖租。為了解決這個問題粱侣,Lin等人對標(biāo)準(zhǔn)的交叉熵?fù)p失函數(shù)進行修改,降低那些已經(jīng)分類很好的樣例對loss的影響比重蓖宦,稱之為Focal Loss齐婴,也就是會特別關(guān)注某一些loss的意思。 最后稠茂,Lin等人實現(xiàn)了一個使用Focal Loss的簡單的檢測系統(tǒng)柠偶,最終在速度上幾乎趕上了YOLO,并且在準(zhǔn)確性了超過了現(xiàn)有的所有檢測算法睬关。源碼可以在facebook的Detectron上取得:
https://github.com/facebookresearch/Detectron .
作者介紹了一下two-stage方法的簡單流程以及相關(guān)的論文诱担,然后又介紹了以下YOLO和SSD等one-stage方法的概況,然后电爹,作者指出這one-stage方法精確度低的主要原因是源于訓(xùn)練集數(shù)據(jù)分布的不平衡導(dǎo)致的蔫仙。 由此,作者就引出了自己的Focal Loss損失函數(shù)丐箩,指出Focal Loss函數(shù)在面對具有較高confidence的樣例時摇邦,其影響因子會接近于0,直觀上來說,就說Focal Loss更關(guān)注那些hard examples屎勘。另外施籍,作者還提出,F(xiàn)ocal Loss的形式不是唯一的概漱,很多其他的實現(xiàn)方法也能達到相似的結(jié)果丑慎。(其實我覺得這說明損失函數(shù)這一塊還有很多工作可以往下研究)
為了證明Focal Loss的有效性,作者實現(xiàn)了一個one-stage檢測模型瓤摧,命名為RetinaNet(Retina是視網(wǎng)膜的意思)立哑,基于ResNet-101-FPN實現(xiàn)骑晶,還用到了feature pramid和anchor boxes等思想。
傳統(tǒng)檢測系統(tǒng)
主要是基于sliding-window paradigm的一類方法:HOG各聘, DPMs等等脏毯。雖然滑動窗口類的方法在目標(biāo)檢測領(lǐng)域處于一線地位,但是隨著deep learning的出現(xiàn)和研究郑诺,滑動窗口方法漸漸失去光芒。
Two-stage Detectors
two-stage方法的先驅(qū)是Selective Search work,它會首先提取出一個稀疏的候選框集合(稀疏是指只有很少一部分包含物體)曾沈,然后對這些候選框進行分類,看是否包含物體鸥昏,或包含哪種物體塞俱。
之后,RCNN的誕生標(biāo)志著深度學(xué)習(xí)技術(shù)成功引入目標(biāo)檢測領(lǐng)域吏垮,利用cnn網(wǎng)絡(luò)對特征的高度抽象和提取障涯,rcnn在物體檢測的準(zhǔn)確率上大幅度提高罐旗,后期的RCNN系列又不斷的提出新的方法來提升準(zhǔn)確率和速度,到Faster RCNN時唯蝶,提出了RPN網(wǎng)絡(luò)九秀,將候選框選取階段和分類階段都放在了統(tǒng)一個網(wǎng)絡(luò),使之可以進行端到端訓(xùn)練粘我。后續(xù)還有更多的關(guān)于這一系列的工作繼續(xù)被人們研究著鼓蜒。
One-stage Detectors
OverFeat算是首個現(xiàn)代的基于深度學(xué)習(xí)的one-stage檢測方法,而最近的SSD和YOLO更是激起了人名對one-stage方法的研究熱情征字,但是one-stage方法最令人詬病的地方就在于它們較低的準(zhǔn)確率都弹。
為此,本文的工作就是想要知道是否one-stage檢測算法可以在精確度上匹敵two-stage檢測算法匙姜,同時還要保持一定的檢測速度畅厢。
于是,作者提出了Focal Loss搁料,一種新的損失函數(shù)或详,利用這個損失函數(shù),可以在保持現(xiàn)在模型大框架不變的基礎(chǔ)上郭计,達到最好的檢測水平霸琴!
樣本類別不均衡 Class Imbalance
不管是傳統(tǒng)的one-stage檢測方法如boosted detectors, DMPs昭伸,還是最近的方法SSD梧乘,都會在訓(xùn)練階段面臨 個候選區(qū)域,這其中會包含大量的背景區(qū)域庐杨,也就是負(fù)樣本选调,這種不平衡會造成兩個問題:
- 在訓(xùn)練時,在大多數(shù)位置都是負(fù)樣本灵份,這樣只會貢獻更多無用的信號
- 大量的負(fù)樣本會導(dǎo)致模型在一定程度上的退化
對于此問題仁堪,常用的解決方案是在訓(xùn)練階段設(shè)計更復(fù)雜的樣本抽取策略,但是這樣速度就會受影響填渠。而本文提出的Focal Loss弦聂,不僅解決了樣本不均的問題,而且不需要增加額外的抽取策略氛什,可以更快訓(xùn)練
Robust Estimation
有很多工作樂于設(shè)計健壯的損失函數(shù)莺葫,具體可以看看原文的參考文獻,這里就不說了(主要因為沒有什么好討論的地方枪眉,作者也只是提了一下)
Focal Loss
為了便于理解捺檬,從交叉熵(CE)的二分類問題出發(fā):
當(dāng)二分類問題中的樣本分布不均時,數(shù)量多的樣本的損失值對最終函數(shù)的影響會淹沒數(shù)量少的樣本產(chǎn)生的影響贸铜。多分類問題也是如此堡纬。
為了便于表示聂受,對上面的公式進行改寫: ,于是有:
Balanced Cross Entropy
一個常用的解決辦法就是引入一個權(quán)重因子 隐轩,然后分別令
和
作為兩個類別的權(quán)重饺饭,
的取值可以是根據(jù)類別出現(xiàn)的頻率決定,也可以作為超參數(shù)职车,利用交叉驗證來選取較好的值瘫俊。我們使用這種方法作為baseline來與Focal loss進行比較:
Focal Loss Definition
本文的實驗結(jié)果表明,類別分布不均會對交叉熵?fù)p失函數(shù)帶來很大的影響悴灵。那些很容易被分類的負(fù)樣本(背景等)貢獻了損失函數(shù)及其梯度中的大部分影響力扛芽。盡管baseline方法的 因子可以平衡正負(fù)樣本之間的比例,但它仍然不能把握好簡單樣本和困難樣本的比例(應(yīng)該困難樣本多一些积瞒,簡單樣本少一些川尖,這樣有利于模型的健壯性)。于是茫孔,作者就提出了Focal Loss叮喳,主要引入了一個“調(diào)制因子”
,其中
缰贝,具體的形式化表示如下:
直觀上來講馍悟,這個“調(diào)制因子”可以降低easy example對loss的contribution。同時剩晴,還應(yīng)注意到锣咒,F(xiàn)ocal Loss的形式不是唯一固定的,作者還在使用了其他不同形式的因子赞弥,比如結(jié)合了 因子:
后文的大部分實驗都使用的是上面這個形式的Focal Loss毅整。
Class Imbalance and Model Initialization
二值分類模型在初始的時候,對兩個類別的預(yù)測概率是均等的绽左,在這種初始化條件下悼嫉,如果某一個類別出現(xiàn)的次數(shù)過多,就會對損失函數(shù)產(chǎn)生較大的影響拼窥。為了解決這個問題戏蔑,作者特意提出了“先入為主”的概念,也就是使得模型在開始的時候闯团,對稀有類別(如前景類別)的預(yù)測概率的初始值設(shè)置的低一些,如0.01 仙粱。 經(jīng)過實驗表明房交,這樣的方法可以提升模型訓(xùn)練的穩(wěn)定性。
Class Imbalance and Two-stage Detectors
Two-stage Detector 并沒有使用類似 因此的方法來解決樣本不均的問題伐割。相反的候味,它們通過兩個機制來降低這個問題帶來的影響:(1)two-stage模式和(2)biased minibatch取樣刃唤。首先,two-stage模式會在第一階段就將近乎無限物體位置可能性降低到一到兩千個白群,更重要的是尚胞,這一到兩千個可能位置并不是隨機選取的,它們移除了大量的易分類負(fù)樣本(背景框)帜慢。第二笼裳,這些方法還設(shè)計了biased minibatch的取樣策略,比如粱玲,保證正樣本和負(fù)樣本的比例為1:3進行訓(xùn)練(這其實相當(dāng)于起到了
因子的作用躬柬。
RetinaNet Detector
RetinaNet是一個單一的、統(tǒng)一的網(wǎng)絡(luò)抽减,它由一個backbone網(wǎng)絡(luò)和兩個task-specific子網(wǎng)絡(luò)組成允青。backbone網(wǎng)絡(luò)是現(xiàn)成的,主要負(fù)責(zé)計算卷積特征圖譜卵沉。第一個子網(wǎng)絡(luò)負(fù)責(zé)物體分類任務(wù)颠锉,第二個子網(wǎng)絡(luò)負(fù)責(zé)bounding box回歸任務(wù),它們都是在backbone網(wǎng)絡(luò)輸出的卷積圖譜上進行計算的史汗。
Feature Pyramid Network Backbone:
采用了FPN作為backbone網(wǎng)絡(luò)琼掠。
Anchors:
和FPN一樣,對P3到P7使用了不同大小的anchors
Classification Subnet:
該子網(wǎng)絡(luò)是一個較小的FCN淹办,連接在FPN的每一層眉枕。
值得注意的一點是,該子網(wǎng)絡(luò)并不與Box Regression Subnet共享參數(shù)怜森,二者是互相獨立的速挑。
Box Regresion Subnet:
與分類子網(wǎng)絡(luò)并行,該子網(wǎng)絡(luò)也是一個FCN網(wǎng)絡(luò)副硅,連接在FPN的每一層上姥宝。目標(biāo)是讓anchor通過位移回歸到gt box附近。
Inference and Training
Inference: RetinaNet是有基于FPN和backbone和兩個基于FCN的子網(wǎng)絡(luò)組成的一個統(tǒng)一的單一網(wǎng)絡(luò)恐疲,因此腊满,在inference階段,只需要簡單的通過前向傳播經(jīng)過整個網(wǎng)絡(luò)即可培己。為了提高速度碳蛋,本文在每個FPN層級上,只會處理最多1000個box prediction省咨。
Focal Loss: 使用了上文提到的Focal Loss肃弟。取 。在訓(xùn)練階段,本文強調(diào)將focal loss應(yīng)用到所有100k個anchors上笤受,主要目的是為了與RPN和SSD等模型作對比穷缤。
從實驗結(jié)果上看,當(dāng) 的值取得較大時箩兽,
的值就應(yīng)該取消一些(for
,
works best)津肛。
Initialization: 本文分別實現(xiàn)了ResNet-50-FPN和ResNet-101-FPN。 對其中初始值可參見原文汗贫。
Optimization:
使用了SGD優(yōu)化方法身坐,在8個GPU上訓(xùn)練,每個minibatch有16張圖片(一個GPU包含2張圖片)芳绩。
損失函數(shù)為focal loss和標(biāo)準(zhǔn)smooth L1損失函數(shù)之和掀亥。