目標檢測算法——SSD:Single Shot MultiBox Detector,是一篇很是經典的目標檢測算法,十分值得閱讀和進行代碼復現,其論文地址是:https://arxiv.org/abs/1512.02325。git
同時,我使用pytorch對SSD代碼進行了復現:https://github.com/Dengshunge/mySSD_pytorchgithub
從論文的題目《SSD:Single Shot MultiBox Detector》能夠看出,single shot代表是one_stage檢測算法,即不須要相似faster R-CNN中的RPN等區域推薦算法,一步就能獲得預測座標和類別,實現真正的end-to-end訓練;multibox表示是多框預測,即SSD算法借鑑了faster R-CNN中的錨點框思想,對每一個先驗錨點框進行預測,判斷其類別和目標的預測框。算法
在SSD算法提出以前,R-CNN系列的目標檢測算法,其準確率很高,可是這些算法須要消耗大量計算資源,特別是對於嵌入式設備或者終端設備,其算力沒法知足此類算法,形成了沒法進行實時目標檢測。網絡
目標檢測的檢測速度一般使用FPS進行衡量,即1秒能處理多少幀。Faster R-CNN的檢測速度只有7FPS,雖然已經比之前的算法快不少了,但遠遠還達不到實時檢測的效果。雖而後續對faster R-CNN作了不少改進來提升FPS,但這些增益都是以犧牲大量精度爲前提。框架
所以,急需一種速度快且精度不低的目標檢測算法。函數
以下圖所示,下圖是R-CNN系列,YOLO和SSD的性能對比圖(Ref.《目標檢測算法之SSD》),能夠看出SSD在速度和mAP上都有較大的提高。性能
那麼,SSD能實現速度與精度的平衡,是經過如下方式來實現的:學習
a) 改變網絡結構,並使用多尺度融合;測試
b) 精心設計先驗錨點框,和錨點框匹配策略;spa
c) 使用多個tricks來提升精度,如用於平衡正負樣本數量的難例挖掘(hard negative mining)和數據加強。
如圖1所示,是SSD的網絡結構。在論文中,圖片的輸入尺寸爲300*300*3,使用VGG16做爲主幹網絡,同時,作出瞭如下修改:
對於須要融合的特徵圖,假設此特徵圖的尺寸是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框的匹配
$$L(x,c,l,g)=\frac{1}{N}(L_{conf}(x,c)+\alpha L_{loc}(x,l,g))$$
(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進行了控制變量實驗,結果以下圖所示。
(3)推理時間
下表是SSD的推理時間對比圖。能夠看出,SSD中精度和速度上作到了比較好的平衡。
SSD是一種很優秀的one-stage框架,對後面不少目標檢測算法有着深遠的影響。讀完論文,發現仍是對SSD的瞭解不夠深刻,接下來,會對其源碼進行分析。