SSD學習筆記


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

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


 

一、前言

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) 精心設計先驗錨點框,和錨點框匹配策略;

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


二、網絡結構

如圖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_3、Conv7、Conv8_2、Conv9_2、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 特征圖的處理

三、錨點框

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框的匹配

四、其余策略

  • 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中還采用了數據增強的策略,如對原圖進行色域變換、擴增、采樣的操作,具體可以參考這篇文章。

五、實驗結果

 (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的了解不夠深入,接下來,會對其源碼進行分析。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM