SSD學習筆記

目標檢測算法——SSD:Single Shot MultiBox Detector,是一篇很是經典的目標檢測算法,十分值得閱讀和進行代碼復現,其論文地址是:https://arxiv.org/abs/1512.02325git

同時,我使用pytorch對SSD代碼進行了復現:https://github.com/Dengshunge/mySSD_pytorchgithub


 

1、前言

1.1 什麼是SSD

從論文的題目《SSD:Single Shot MultiBox Detector》能夠看出,single shot代表是one_stage檢測算法,即不須要相似faster R-CNN中的RPN等區域推薦算法,一步就能獲得預測座標和類別,實現真正的end-to-end訓練;multibox表示是多框預測,即SSD算法借鑑了faster R-CNN中的錨點框思想,對每一個先驗錨點框進行預測,判斷其類別和目標的預測框。算法

1.2 爲何提出SSD

在SSD算法提出以前,R-CNN系列的目標檢測算法,其準確率很高,可是這些算法須要消耗大量計算資源,特別是對於嵌入式設備或者終端設備,其算力沒法知足此類算法,形成了沒法進行實時目標檢測。網絡

目標檢測的檢測速度一般使用FPS進行衡量,即1秒能處理多少幀。Faster R-CNN的檢測速度只有7FPS,雖然已經比之前的算法快不少了,但遠遠還達不到實時檢測的效果。雖而後續對faster R-CNN作了不少改進來提升FPS,但這些增益都是以犧牲大量精度爲前提。框架

所以,急需一種速度快且精度不低的目標檢測算法。函數

1.3 如何平衡速度與精度

以下圖所示,下圖是R-CNN系列,YOLO和SSD的性能對比圖(Ref.《目標檢測算法之SSD》),能夠看出SSD在速度和mAP上都有較大的提高。性能

那麼,SSD能實現速度與精度的平衡,是經過如下方式來實現的:學習

a) 改變網絡結構,並使用多尺度融合;測試

b) 精心設計先驗錨點框,和錨點框匹配策略;spa

c) 使用多個tricks來提升精度,如用於平衡正負樣本數量的難例挖掘(hard negative mining)和數據加強。


2、網絡結構

如圖1所示,是SSD的網絡結構。在論文中,圖片的輸入尺寸爲300*300*3,使用VGG16做爲主幹網絡,同時,作出瞭如下修改:

  1. 將本來VGG16的FC6和FC7換成卷積層Conv6和Conv7,並依次加入新的層:Conv8_2,Conv9_2,Conv10_2,Conv11_2。具體而言,在Conv7層的特徵圖爲19*19*1024,通過1*1*256和3*3*512-s2的卷積操做後,獲得Conv8_2的特徵圖,其尺寸爲10*10*512,依次類推。
  2. 爲了實現多尺度融合,須要將不一樣層的特徵圖提取出來進行判斷。在論文中,做者使用Conv4_三、Conv七、Conv8_二、Conv9_二、Conv10_2和Conv11_2的特徵圖來進行多尺度融合。如圖2所示,每層特徵圖會分別通過3*3的卷積,獲得2個tensor,分別用於進行座標預測和類別置信度預測。其中,用於座標預測的通道數是(num_anchor*4),num_anchor表示該特徵圖每一個位置對應的錨點框數量,4表示(x_min,y_min,x_max,y_max);用於類別置信度預測的通道數是(num_anchor*num_classes),num_classes表示類別的數量(包含背景),對於VOC來講,num_classes=21,20個類別加上1個背景。另外,論文中會對Conv4_3層的特徵圖使用L2歸一化後,再進行3*3的卷積,這樣作的目的是,防止此層特徵圖的值過大,利於收斂。

對於須要融合的特徵圖,假設此特徵圖的尺寸是w*h,那麼,對於每一個位置(x,y),會預先生成N個錨點框(具體錨點框的細節,下面會敘述),所以,每張特徵圖會生成w*h*N個錨點框。SSD經過對每一個錨點框進行位置迴歸和類別預測,並經過NMS非極大值抑制獲得最終的檢測結果。

SSD算法會生成一系列預測框(bounding boxes)和每一個預測框的得分,而後經過NMS非極大值抑制獲得最終的檢測結果。以下圖所示,是SSD的網絡結構。

 圖1 SSD的網絡結構

圖2 特徵圖的處理

3、錨點框

SSD的錨點框借鑑了faster R-CNN的錨點框思想,但不一樣的是,在SSD中,每一個特徵圖對應的錨點框均不相同,即錨點框會根據特徵圖的尺寸發生變化。例如,Conv4_3的錨點框和Conv7的錨點框的尺寸是不同的。假定使用m張特徵圖進行預測判斷,每張特徵圖的錨點框大小,能夠經過下式進行計算:

$$s_k=s_{min}+\frac{s_{max}-s_{min}}{m-1}(k-1),k\in [1,m]$$

其中,$s_{min}=0.2$和$s_{max}=0.9$,表示Conv4_3特徵圖的錨點框的尺寸爲0.2,Conv11_2特徵圖的錨點框尺寸爲0.9。既然有了錨點框的大小,能夠理解爲面積,接下來就須要爲錨點框設置不一樣的寬高比。做者設置了5種寬高比,分別是$a_r={1,2,3,1/2,1/3}$,所以,能夠計算獲得寬度$w_k^a=s_k\sqrt{a_r}$,高度爲$h_k^a=s_k/\sqrt{a_r}$。對於寬高比爲1的狀況,額外增長一個錨點框,其尺寸爲${s_k}'=\sqrt{s_ks_{k+1}}$。因此,通常而言,第i層特徵圖的(x,y)位置,具備6個錨點框。而第一層特徵圖和最後兩層層特徵圖,每一個位置只設置4個錨點框。所以,圖1中的8732個錨點框是這樣計算獲得的,$38*38*4+19*19*6+10*10*6+5*5*6+3*3*4+1*1*4=8732$。

經過對不一樣特徵圖設置不一樣的錨點框,有利於檢測不一樣尺寸的物體,大特徵圖可檢測小物體,小特徵圖能夠檢測大物體。如圖3所示,(a)表示帶GT框的圖像;(b)表示在8*8的特徵圖中,每一個位置使用6個不一樣尺寸的錨點框,當某個錨點框與GT框的IOU大於閾值時,將其設置成正樣本,該位置下其餘錨點框爲負樣本;(c)表示4*4特徵圖下,紅色虛線框用於預測狗的狀況,會輸出loc和conf兩個tensor,loc表示相對於錨點框的偏移量,conf表示每一個類別的置信度。

 

圖3 錨點框匹配

當設定了錨點框後,就須要制定其匹配規則,即制定哪些錨點框用於迴歸GT框和預測類別。首先,爲每一個GT框匹配一個與其IOU最高的先驗錨點框,保證了每一個GT框都有對應的錨點框,來預測GT框;其次,當GT框與先驗錨點框的IOU大於閾值(0.5)時,也指定該錨點框用來預測該GT框。固然,若錨點框A與多個GT框的IOU都大於閾值,則該錨點框A選擇與其IOU最大的GT框。

圖4是錨點框與GT框的匹配示意圖,爲了方便理解,將錨點框映射回原圖尺寸,與GT框進行匹配。

 

圖4 錨點框與GT框的匹配

4、其他策略

  • SSD的損失函數繼承了R-CNN系列的損失函數,以下所示,由位置損失和置信度損失組成,位置損失使用了smooth1,置信度損失使用多類別交叉熵:

$$L(x,c,l,g)=\frac{1}{N}(L_{conf}(x,c)+\alpha L_{loc}(x,l,g))$$

  • 此外,SSD能夠理解成對圖片進行密集採樣,獲得8732個patch,而後對這些patch進行預測和迴歸。所以,會發現,大部分錨點框都會匹配上背景,也就是被設置成負樣本。所以,會形成正負樣本之間的不平衡。對於此狀況,SSD使用了hard negative mining策略來緩解這一矛盾。在SSD中,並無使用全部的負樣本,而是將這些匹配上背景的樣本根據置信度損失進行降序排列,取出置信度損失進行排序,將損失較大的樣本認爲是難例(hard negative),須要模型重點學習。選取損失最大的前N個樣本做爲負樣本,正樣本與負樣本的比例控制在1:3左右,對於那些沒有選上的樣本,label設置成-1,不參與訓練當中。
  • 爲了擴大感覺野,加快推理速度,還使用了空洞卷積。
  • SSD中還採用了數據加強的策略,如對原圖進行色域變換、擴增、採樣的操做,具體能夠參考這篇文章。

5、實驗結果

 (1)VOC測試結果

下表是SSD在VOC的實驗結果圖。與Fast R-CNN和Faster R-CNN進行對比,分別使用了300*300和 512*512的圖片做爲輸入。在07+12+COCO數據集上來看,SSD300比Faster R-CNN的mAP提升了0.8%,SSD512提升了2.8%。此外,SSD的定位偏差更小,由於SSD是直接回歸目標的形狀和進行分類,將定位和分類合成了一步。可是,對於類似目標,SSD容易產生混淆,多是由於對不一樣種類的目標共享了位置。SSD還容易預測框尺寸的干擾,即在小目標上其性能比大目標要差。做者認爲這多是因爲在淺層的時候,小目標物體包含的信息很少。當增長了分辨率的時候,這種狀況獲得了較好的改善。

 

(2)模型分析

爲了瞭解SSD中各組成對結果的影響程度,做者使用SSD300進行了控制變量實驗,結果以下圖所示。

 

  • 數據加強:在R-CNN系列中,採用的是原圖或者對原圖進行翻轉等變換。而SSD中,使用了更多的策略,包括擴增、採樣等。能夠看出,使用數據加強的SSD,mAP提升了8.8%。但做者認爲,一樣的數據加強策略,對R-CNN系列可能會失效,由於在進入分類頭的時候,使用了特徵池化。
  • 錨點框的多樣性:在SSD中,對特徵圖的每一個位置使用了6個不一樣形狀的錨點框,每層特徵圖的錨點框也均不一致。當移除錨點框後,mAP都出現了不一樣比例的降低。使用不一樣尺寸的錨點框,使網絡能更加簡單對錨點框進行迴歸。可是不是錨點框越多越好呢?錨點框越多,推理速度也就越慢。這中間應該會有折中。
  • 空洞卷積:在本實驗中,使用的是帶空洞卷積版本的VGG16。若是使用徹底版本的VGG16,即保留pool5和對fc6/fc7不使用下采樣,增長conv5_3進行特徵融合。這樣的話,能獲得相同精度的結果,但速度卻慢了20%。
  • 多尺度融合:SSD的主要貢獻在於在不一樣分辨率的特徵層中使用了不一樣尺寸的錨點框,進行多尺度融合。爲了比較這一作法的影響,做者去除某些用於特徵融合的層,實驗的結果以下表所示。爲了保證一致性,錨點框的數量保持接近8732。能夠看出,當特徵層愈來愈少的時候,mAP也會隨之降低,從74.3降低到62.4。

 

 (3)推理時間

下表是SSD的推理時間對比圖。能夠看出,SSD中精度和速度上作到了比較好的平衡。

 


 

SSD是一種很優秀的one-stage框架,對後面不少目標檢測算法有着深遠的影響。讀完論文,發現仍是對SSD的瞭解不夠深刻,接下來,會對其源碼進行分析。

相關文章
相關標籤/搜索