物體檢測演算法,按演算法結構,可以分為one-stage和two-stage兩類。
two-stage經典演算法主要是R-CNN族,以準確度見長,速度稍慢,一般不如one-stage。
one-stage演算法主要包括YOLO、SSD、CornerNet等,以速度快見長,準確度一般不如two-stage。本文分享的SSD就是經典的one-stage演算法。

上圖是物體檢測演算法整個演化座標軸,可以看出SSD的釋出,是在Faster R-CNN和YOLO v1之後。YOLO v1是one-stage檢測演算法的開山之作,速度碾壓Faster R-CNN,但準確性遠不如Faster R-CNN。SSD沿用了YOLO v1的基本思路,糅合了Faster R-CNN的anchor-box,又開創性的提出了多解析度預測,最終達到了極快又準,如下表。

SSD單一scale的檢測原理
這裡先直接給出具體的模型計算方法,後面再解釋原理,否則原理解釋起來非常晦澀難懂。
1)模型
a) 輸入圖片經過特徵提取器(SSD採用VGG16做特徵提取器),得到H x W x Channel的Extracted Feature Map。

b) 將上述Extracted Feature Map,經過3 x 3 x (25 x num_default_box)的卷積核,卷積成H x W x (25 x num_default_box)的feature map作為物體檢測的predict。如下圖(圖中num_default_box=4):

上述兩步,就已經完成了物體檢測的predict。足夠簡單
2)原理解釋
由卷積的特性可知,從輸入圖片到HxW解析度的預測,相當於將原解析度的輸入圖片進行HxW等分,如下圖(這裡h=2,w=2):

為了更準確的預測物體bounding box,SSD借鑑了faster rcnn中的default box思想。
先假設,每一個cell中已經存在多個default box,default box的長寬固定,位於每一個cell正中。
以下圖為例,每一個cell中有四個固定大小的default box。


-
P_i(i=background, c1, …, c20),代表的是這個default box的物體類別。P_background代表是背景的概率,P_ci代表是類別ci的概率(這裡採用的VOC資料集,共有20個物體類別),所有概率值之和為1,取概率值最大的類作為default box的類別預測值。
-
Δcx, Δcy, Δw, Δh代表default box內的物體目標框與default box的位置之間的偏差。Δcx, Δcy代表中心點的偏差,Δw, Δh代表寬高的偏差。具體的含義可以參考Loss計算章節。
所以一個default box會有25個預測結果,4個default box就有100個。這就是上文模型部分predict中的100的意義。
3)Loss計算
根據上述分析可知,每個cell都有4個default box,HxW的解析度,則會有4HW個預測結果。對於監督學習,需要知道每個default box對應的標籤Ground Truth。SSD對於真實GT物體框的分配策略是,首先將GT分配給IoU最大的default box,然後將GT分配給IoU大於0.5的default box,也即同一個GT會分配給不同的default box,不同的default box對應的GT可能是同一個。

如上圖,紅色框是dog的真實位置,那麼綠色箭指向的兩個default box的GT都是紅色框,其他兩個default box的GT是背景即沒有物體。
對於正例,即default box有GT框的,loss分為類別損失和位置損失。
對於反例,即default box沒有GT框的,loss只有類別損失(類別是背景)。
Loss是confidence loss和location loss加權之和。

location loss計算如下:

其中,y是預測值,y^hat是預測值的label。對於cx,cy,w,h的y^hat採用下式計算:

g是ground truth值,d是default box的先驗值。可以看出,中心點座標就是ground truth值與default box先驗值得相對差,w和h是ground truth值與default box先驗值比值的對數。
其實這樣處理都是儘量減小y^hat值變化幅度,減少學習難度。
confidence loss計算如下:

都是cross entropy loss。
以上就是單一scale的SSD原理。
SSD多scale的檢測原理
SSD的主要貢獻有兩點
1)引入了上文所述的default box
2)多scale預測
上文的單scale預測,是取整個特徵提過程的某一個feature map做預測。多scale預測,就是取整個特徵提取過程中的不同解析度的feature map均做預測。

由上圖可以看出,SSD做了6個scale的預測。
Loss也是每個scale的Loss之和。
Tricks
1)data augmentation
資料增強是模型訓練非常重要的一環,畢竟資料獲取太難了。
SSD每一張訓練圖片由如下方法隨機產生:
原圖片
擷取一部分圖片,保證擷取框與物體框的最小IoU是0.1,03,0.5,0.7,或者0.9
隨機擷取一部分圖片
隨機擷取圖片的大小是[0.1,1]原圖片大小,aspect ratio是0.5~2。
2)default box
default box由scale和aspect ratio控制。
scale最小為0.2,最大0.9。假如總共選取了m個scale,則各個scale的scale值按下式計算:

aspect ratio選取為:

aspect ratio為1時,再增加一個scale,取值為:

3)hard negative mining
因為絕大部分default box都是負樣本,導致正負樣本嚴重失衡,如果計入所有負樣本的損失,訓練非常不穩定,收斂性非常慢,所以負樣本只計入損失最大的幾個負樣本,並且要保持正負樣本比例為1:3。
試驗結果
1)普通技巧的消融試驗結果

2)多scale預測的消融試驗

可以看出多scale可以顯著提高準確性
3)COCO資料集結果對比
