最詳細的SSD論文筆記

 個人博客:http://www.chenjianqu.com/

原文鏈接:http://www.chenjianqu.com/show-90.html

文:Wei Liu, Dragomir Anguelov, Dumitru Erhan, Christian Szegedy,Scott Reed, Cheng-Yang Fu, Alexander C. Berg.SSD: Single Shot MultiBox Detector

 

素質三連

1.論文貢獻

提出SSD目標檢測模型,是一個single-stage目標檢測模型,綜合了YOLO、RPN以及語義分割的思想。

運行速度快,可是實現實時檢測,精度相較於YOLO大幅提高。

關鍵點:使用多尺度/多比例的先驗包圍框,在多個特徵圖上預測,使用卷積核預測包圍框和置信度。

2.實驗結果   

對SSD300,在VOC 2007 test上達到72.1% mAP和58FPS;對SSD500,達到75.1% mAP,超越了Faster R-CNN。

3.存在的問題

對小目標的檢測性能較差。

 

SSD

    SSD(Single Shot MultiBox Detector)和YOLO 的網絡架構對比如下:

1.jpg

    由上圖可知:SSD的輸入分辨率爲300x300,也稱爲SSD300,而YOLO 的輸入分辨率是448x448;SSD使用VGG16作爲backbone,YOLO使用GoogLeNet;SSD使用卷積核預測包圍框(bounding box)和類別置信度,而YOLO使用全連接網絡;SSD使用多個特徵圖進行預測,即多尺度,而YOLO使用單尺度特徵圖。總結SSD的核心要點如下:

  1. 使用多尺度特徵圖進行目標檢測。在backbone後面增加幾層卷積層,特徵圖的分辨率逐層降低。使用這些多個不同分辨率的特徵圖用於目標檢測。低層特徵圖有學習到的是精細的表層特徵,高層特徵圖學習到的是抽象的特徵。換句話說,低層特徵圖有利於檢測小目標,高層特徵圖有利學檢測到大目標。

  2. 使用先驗包圍框。對於用於檢測的特徵圖的每個像素,設置一組不同長寬比例和大小的先驗包圍框。對於每個包圍框,預測相對於先驗包圍框的偏移以及該框對每個類別的置信度,這其實就是RPN

  3. 使用卷積運算進行預測。對於用於檢測的特徵圖,使用卷積運算預測包圍框。比如,對於m×n×p的特徵圖,使用3×3×p的卷積核進行卷積計算,預測每個像素的類別置信度和所有先驗包圍框的偏移。

    具體地說,對於某個位置的k個框,每個框計算c個類別置信度和相對於先驗包圍框的4個偏移,因此每個位置輸出維度是 (c+4)k,這個分辨率爲mxn特徵圖預測結果的維度是(c+4)kmn

    SSD整個流程如下圖:

2.jpg

匹配策略

    訓練時,需要確定gt bbox(ground truth包圍框)對應的先驗包圍框。策略1:找到與gt bbox的IOU最大的先驗包圍框,這樣保證每個gt bbox至少對應一個先驗框。但是一個圖片中gt bbox非常少,而先驗框卻很多,這樣正負樣本極其不平衡。策略2:對於其它的先驗包圍框,若與gt bbox的 IOU 大於某個閾值(一般是0.5),那麼該先驗框也與這個ground truth進行匹配。

 

損失函數

    設xijp=1表示第i個默認框匹配到類別p的第j個gt框,否則xijp=0。根據匹配策略,一個gt框至少對應一個輸出框,即Σi xijp >=1。總損失函數是定位損失(loc)和置信度損失(conf)的加權和,公式如下:

3.jpg

    N是匹配的先驗框(即被預測爲正確的)的數量,l是預測框,g是gt框,α表示定位損失的加權係數,根據交叉驗證,α的取值爲1。

    定位損失Lloc 使用Smooth L1損失,計算公式如下:

4.jpg

    d是先驗框。

    置信度損失Lconf(x,c) 採用的是softmax損失:

5.jpg

    

先驗框尺度和比例的選擇

    爲了利用低層的表層特徵和高層的抽象特徵,SSD使用多個尺度的特徵圖用於預測目標。假設想用m個特徵圖取做預測,那麼每個特徵圖使用的先驗框尺度的計算公式如下:

6.jpg

    smin=0.2,smax=0.95,sk 表示先驗框大小相對於圖片的比例。隨着特徵圖的減小,先驗框大小逐漸增加。最底層的尺度是0.2,最頂層的尺度的0.95。每個位置的先驗框有不同的長寬比例 ar∈{3, 2, 1, 1/2, 1/3}。先驗框的寬度是wka=skar1/2,高度是hka=sk ar1/2。對於比例1,額外增加一個尺度爲sk’ = (sk sk+1)1/2,對於k=m的特徵圖,假設sm+1來設置sm+1。因此每個位置可以有6個不同的先驗框。某些層僅使用4個先驗框,則不使用長寬比3, 1/3。

    設置每個先驗框的中心是((i+0.5) / |fk|, (j+0.5) / |fk|),其中|fk|是特徵圖的邊長,i, j ∈[0, |fk],截斷座標以至於先驗框的邊界總是在[0,1]。

    通過組合來自多個特徵圖的所有位置的具有不同尺度和比例的所有先驗框的預測,可以得到一組覆蓋不同的輸入對象大小和形狀的預測。例如,在 Fig.1 中,狗與4×4特徵圖的先驗框匹配,但不與8×8特徵圖中的任何先驗框匹配,這些不匹配的先驗框則是負樣本。

 

難例挖掘

    難例挖掘的概念在R-CNN博客裏有介紹過,經過gt bbox和先驗框的匹配後,被匹配先驗框是正例,沒有被匹配的先驗框是負例,前面說過,正例和負例的數量非常不平衡,這會導致收斂速度變慢。因此這裏並不使用所有負例,而是從所有負例中挑選出高置信度的負例,使得正負例達到1:3。

 

數據增強

    後面會分析到,數據增強有利於模型學習到平移不變性,對提高精度非常重要。這裏使用隨機水平翻轉,隨機裁剪,隨機採集塊域等技術。

 

訓練和實驗    

數據增強

    使用VGG16,在ILSVRC CLS-LOC數據集上進行預訓練。跟DeepLab-LargeFOV類似,對預訓練的模型修改如下:將fc6和fc7轉換爲1x1卷積層,從fc6和fc7下采樣參數;將pool5的size = 2x2, stride = 2變爲size = 3x3, stride = 1;使用atrous算法填補”holes”;去除fc8。然後對模型進行微調,使用SGD,初始學習率爲0.001,動量係數爲0.9,權重衰減爲0.0005,batch_size=32。

    開源的代碼: https://github.com/weiliu89/caffe/tree/ssd 

VOC2007實驗

    作爲對比,Fast R-CNN,Faster R-CNN,和SSD均使用預訓練的VGG16作爲backbone,在VOC2007 trainval和VOC2012 trainval (16551 images) 進行訓練,在VOC2007 test (4952 images)進行測試。

    下面是SSD300的結構圖:

7.jpg

    使用conv4_3,conv7 (fc7), conv8_2, conv9_2, conv10_2,和pool11的輸出特徵圖預測包圍框和置信度。對於新添加的層,使用xavier初始化參數。因爲conv_4的特徵圖比較大(38x38),故僅放置4個先驗框在上面:比例爲1的且尺度爲1和0.1的先驗框,另外兩個比例爲0.5和2。其它特徵圖每個像素放置6個先驗框。與其他層相比,conv4_3具有不同的特徵尺度,因此使用ParseNet中介紹的L2 normalization技術將特徵圖中每個位置的feature norm縮放到20,並在反向傳播期間學習尺度。

    首先設置學習率爲0.001,迭代40k,然後設置學習率0.0001,然後迭代20k。得到的結果如下:

8.jpg

    上表中的SSD500除了輸入分辨率之外,其它的與SSD300相同。可以看到SSD500的mAP甚至超越了,Faster R-CNN。使用[Diagnosing error in object detectors]的目標檢測分析工具對SSD500的分析如下:

9.jpg

    觀察發現,相比於R-CNN,SSD有更小的定位誤差,表明這種通過迴歸先驗框的定位方法優於迴歸SS生成區域推薦的方法。但是SSD對相似目標的分類錯誤率更高,這大概是因爲多個類別共享定位緣故。

    SSD對包圍框的大小很敏感,即它在較小目標上的性能比較大目標要差得多,這是因爲小目標提供的信息較少,通過增加輸入分辨率可以改善這點,如下圖所示:

10.png

 

模型分析

    通過控制變量法觀察影響SSD性能的因素,結果如下表:

11.jpg

    從上表可以發現,數據增強是關鍵。其次是使用更多的特徵圖,conv4_3可以捕獲到更加精細的特徵,對小目標尤其重要。第三是,越多的先驗框效果越好。最後是使用atrous版本的VGG16更快、而且更好。

 

PASCAL VOC2012實驗

12.jpg

MS COCO實驗

13.jpg

 

推斷 

    在測試時,對預測的包圍框執行NMS。首先使用置信度閾值爲0.01,可以過濾掉大部分預測的包圍框,然後使用Thrust CUDA庫對包圍框的置信度進行排序,使用GPU計算兩兩包圍框的IOU,然後應用閾值爲0.45的NMS,最終每張圖片得到200個包圍框。這一步SSD300在VOC上需要花費2.2ms。

    各個檢測模型的精度和速度對比如下:

14.jpg

 

 

參考文獻

[0]Wei Liu, Dragomir Anguelov, Dumitru Erhan, Christian Szegedy,Scott Reed, Cheng-Yang Fu, Alexander C. Berg.SSD: Single Shot MultiBox Detector

[1]chenghaoy.SSD論文筆記.https://blog.csdn.net/chenghaoy/article/details/85263060 .2019-01-03

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章