1. 程式人生 > >SSD:(Single Shot MultiBox Detector)

SSD:(Single Shot MultiBox Detector)

這兩天把SSD論文讀了一下,SSD也是一個端到端的目標檢測模型,SSD在檢測的準確率和速度上相對於YOLO有了很大的提高,並且在檢測小目標上也有不俗的效果。

特點

1. 使用多尺度特徵圖進行預測
    大多數目標檢測演算法都是使用最後一層特徵圖進行目標位置和類別的確定,但是這樣有個缺點就是高層次的特徵圖對小物體的特徵資訊丟失嚴重,導致對小目標檢測效果不好,這也時YOLO對小目標檢測不好的原因之一。所以,SSD不僅使用高層的特徵圖進行預測,還是用了低層的特徵圖進行預測。高層的特徵圖主要負責大目標,底層的特徵圖負責小目標。

    SSD網路結構如圖1所示:可以看到新增加的特徵圖大小逐漸減小,而且每個特徵圖的每個卷積核是相互獨立的。


2. 使用卷積進行預測;
    SSD直接在特徵圖上使用卷積進行目標位置和類別的預測。對於一個形狀為(m×n×p)(m\times n \times p)的特徵圖來說,只需要(3×3×p)(3 \times 3 \times p)的小卷積核進行分類和位置的計算。

    卷積核在特徵圖(m×n)(m\times n)的每一個位置上都會產生(c+1+4)(c+1+4)個輸出值,其中c是類別的個數,加1是因為背景算一個類別,4是位置資訊;位置資訊包含(cx,cy,dw,dh)(cx,cy,dw,dh),前兩個表示框的中心點座標,後兩個表示框的長和寬,但是這裡的預測值是相對於先驗框的轉換值。

    假設先驗框的位置用d=(dx,dy,dw,dh)d=(d^{x},d^{y},d^{w},d^{h})表示,邊界框的位置用b=(bx,by,bw,bh)b=(b^{x},b^{y},b^{w},b^{h})表示,則該邊界框的預測值用l=(lx,ly,lw,lh)l=(l^{x},l^{y},l^{w},l^{h})表示。轉換關係為:
lx=(bxdx)÷dwl^{x}=(b^{x}-d^{x})\div d^{w} ly=(bydy)÷dhl^{y}=(b^{y}-d^{y})\div d^{h}

lw=log(bw/dw)l^{w}=\log(b^{w}/d^{w})lh=log(bh/dh)l^{h}=\log(b^{h}/d^{h})
    從邊界框的真實值到轉換值的過程常稱為編碼;從轉換值到真實值是解碼的過程;解碼關係:
bx=lx×dw+dxb^{x}=l^{x}\times d^{w} +d^{x} by=ly×dh+dyb^{y}=l^{y}\times d^{h} +d^{y} bw=exp(lw)dwb^{w}=\exp(l^{w})d^{w}bh=exp(lh)dhb^{h}=\exp(l^{h})d^{h}
3. 先驗框和寬高比
    SSD的先驗框和FasterRCNN的anchor box相似,不同的是在不同的特徵圖上應用不同大小的預設框,這樣做的目的是有效的離散化輸出框的形狀,以滿足真實目標形狀多變的情況。
在這裡插入圖片描述
    對於一個大小為m×nm\times n的特徵圖來說,特徵圖的每個單元需要kk個先驗框,則該特徵圖需要mnk(c+4)mnk(c+4)個卷積核。

訓練過程

1. 網路結構
    SSD使用VGG16網路結構,並且在ILSVRC CLS-LOC訓練集上進行預訓練,但是將fc6和fc7換成了卷積層,從網路結構圖中可以看到conv_6的卷積核大小為3×33\times 3,conv_7的卷積核大小為1×11\times 1。並且將pool5的核大小由stride=2,2×22\times 2改為stride=1,3×33\times 3,同時在預訓練過程中使用多孔卷積(atrous algorithm),以增加感受野的大小。除此之外,移除了所有的drop_out。至於超引數的設定,詳見論文。

2. 先驗框的匹配策略
    在訓練之前,需要確定圖片中GT Box(ground truth)與哪個先驗框匹配,與之匹配的先驗框所對應的邊界框負責去計算和GTBox的位置損失,邊界框(說白了就是預測框)以先驗框為基準,降低了訓練難度;在YOLO中,由於沒有先驗框,單元框直接預測K個邊界框去擬合真實框,並選擇與真實框IOU最大的邊界框進行預測,使得YOLO模型在訓練中需要自擬合不同物體的多種形狀,提高了訓練的難度。

    先驗框的大小隨著不同的位置(此位置我理解的是不同的特徵圖)、長寬比和尺度而不斷變化。
    匹配的策略:首先選擇與GT Box具有最大IOU的先驗框作為正樣本;其次,若某個先驗框的的IOU>0.5,也認為是正樣本。這樣使得網路可以對多個先驗框進行預測,可以預測目標的多種形狀。

    當先驗框個數很多時,正負樣本之間的數量可能非常不平衡,SSD使用Hard Negative Mining方法將一些負樣本改為正樣本,使正負樣本比例在1:3左右。

    Hard Negative Mining方法:首先計算所有先驗框的loss,然後從負樣本中對分類loss降序排列,因為負樣本不計算位置Loss;選擇前m個負樣本,使得正負樣本比例在1:3;將m個負樣本設為正樣本,即計算它的位置Loss,然後進行反向傳播。(這塊我有點疑問,負樣本轉為正樣本後,位置Loss怎麼計算,因為此時沒有對應的GT Box,回去看看原始碼再說)

3.先驗框尺度和長寬比的選擇
    為了處理不同物體大小的尺度問題,一些方法是用不同的尺寸的影象進行訓練,然後將結果結合起來。但是SSD將不同層的特徵圖整合起來以達到同樣的效果。

    假設使用m個特徵圖進行預測,則每個特徵圖先驗框的尺度大小為:
sk=smin+smaxsminm1(k1),k[1,m]s_k=s_{min}+{s_{max}-s_{min}\over {m-1}}(k-1),k\in [1,m]
    可以看到隨著特徵圖大小的減小,先驗框尺度線性增加,m是指特徵圖的個數,smin,smaxs_{min},s_{max}表示比例的最小值和最大值。SSD中smin=0.2,smax=0.9s_{min}=0.2,s_{max}=0.9,在實際計算中,先求尺度增長的步長,[[smax×100][smin×100]m1{[s_{max}\times 100]}-[s_{min}\times 100]\over {m-1}],[]代表結果向下取整。[[0.9×100][0.2×100]51{[0.9\times 100]}-[0.2\times 100]\over {5-1}]=17,s1=0.2100=20s_1=0.2*100=20,即sk=20,37,54,71,88s_k=20,37,54,71,88。將這些比例除以100,然後再乘以圖片大小,可以得到各個特徵圖的尺度為,sk=60,111,162,213,264s_k=60,111, 162,213,264,根據SSD的caffe原始碼,conv4_3比較特殊s=smin×300/2/100=30s=s_{min}\times 300/2/100=30。所以,SSD中每個特徵圖的先驗框實際尺度是30,60,111, 162,213,264。

    對於長寬比的設定,ar{1,2,3,12,13}a_r\in \{ 1,2,3,{1\over2},{1\over3}\},然後可以計算出相應的長和寬,wk=skarw_k=s_k\sqrt{a_r}hk=skarh_k={s_k\over\sqrt{a_r}}。除此之外,還會設定一個尺度為sm=smsm+1s^*_m=\sqrt{s_ms_{m+1}}ar=1a_r=1