版權聲明:本文為部落客原創文章,遵循 CC 4.0 by-sa 版權協定,轉載請附上原文出處連結和本聲明。
原文連結:https://blog.csdn.net/jy001227801/article/details/80388192
參考連結:https://blog.csdn.net/a8039974/article/details/77592395
論文題目:SSD: Single Shot MultiBox Detector
論文位址:http://arxiv.org/abs/1512.02325
代碼位址:https://github.com/balancap/SSD-Tensorflow
SSD提供了一種多尺度特征圖預測分類和回歸的思想,精确度和速度都很高。
SSD架構如下:
一、論文解讀
1、多尺度特征(最大貢獻)
YOLO在卷積層後接全連接配接層,即檢測時隻利用了最高層feature maps(包括Faster RCNN也是如此);而SSD采用了特征金字塔結構進行檢測,即檢測時利用了conv4-3,conv-7(FC7),conv6-2,conv7-2,conv8_2,conv9_2這些大小不同的feature maps,在多個feature maps上同時進行softmax分類和位置回歸。也就是說,SSD就是Faster-RCNN和YOLO中做了一次的分類和檢測過程放在不同的圖像大小上做了多次。
2、先驗框個數計算
一共有8732個boxes,和 Faster-RCNN一樣,SSD也是特征圖上的每一個點對應一組預選框。然後每一層中每一個點對應的prior box的個數,是由PriorBox這一層的配置檔案決定的。
3、生成先驗框
在SSD中引入了Prior Box,實際上與anchor非常類似,就是一些目标的預選框,後續通過softmax分類+bounding box regression獲得真實目标的位置。差別是SSD每個位置的prior box一般是4~6個,少于Faster RCNN預設的9個anchor;同時prior box是設定在不同尺度的feature maps上的,而且大小不同。
SSD按照如下規則生成prior box:
(1)以feature map上每個點的中點為中心,生成一些列同心的prior box,然後中心點的坐标會乘以step,相當于從feature map位置映射回原圖位置。
(2)正方形prior box最小邊長為
,最大邊長為:
(3)每在prototxt設定一個aspect ratio,會生成2個長方形,長:
寬:
(4)而每個feature map對應prior box的min_size和max_size由以下公式決定,m是使用feature map的數量(SSD 300中m=6):
第一層feature map對應的min_size=S1,max_size=S2;第二層min_size=S2,max_size=S3;其他類推。在原文中,Smin=0.2,Smax=0.9,但是在SSD 300中prior box設定并不能和paper中上述公式對應:
4、step參數選擇
中心點的坐标會乘以step,相當于從feature map位置映射回原圖位置。Cal_scale = 300/out_size,實際就是 原圖與特征圖 大小的比值,比如conv4-3 width = 38 ,輸入的大小為300,那麼scale=7.8,是以這裡設定的step=8。
5、先驗框的使用
以conv4_3為例,在conv4_3 feature map網絡pipeline分為了3條線路:
(1)分類:經過一次batch norm+一次卷積後,生成了[1, num_class*num_priorbox, layer_height, layer_width]大小的feature用于softmax分類目标和非目标(其中num_class是目标類别,SSD 300中num_class = 21)
(2)框回歸:經過一次batch norm+一次卷積後,生成了[1, 4*num_priorbox, layer_height, layer_width]大小的feature用于bounding box regression(即每個點一組[dxmin,dymin,dxmax,dymax])
(3)先驗框:生成了[1, 2, 4*num_priorbox]大小的prior box blob,其中2個channel分别存儲prior box的4個點坐标和對應的4個variance(bounding regression中的權重)
6、SSD優缺點
優點:運作速度可以和YOLO媲美,檢測精度可以和Faster RCNN媲美
缺點:
(1)需要人工設定prior box的min_size,max_size和aspect_ratio值。網絡中prior box的基礎大小和形狀不能直接通過學習獲得,而是需要手工設定。而網絡中每一層feature使用的prior box大小和形狀恰好都不一樣,導緻調試過程非常依賴經驗。
(2)雖然采用了pyramdial feature hierarchy的思路,但是對小目标的recall依然一般,并沒有達到碾壓Faster RCNN的級别。作者認為,這是由于SSD使用conv4_3低級feature去檢測小目标,而低級特征卷積層數少,存在特征提取不充分的問題。
7、損失函數
(1)整體損失函數是定位損失和置信損失(類條件機率:類别機率*置信度)的權重和:
其中n是比對的預設框數,如果n=0,将損失設定為0。α參數用于調整confidence loss和location loss之間的比例,預設α=1。
(2)其中confidence loss是典型的softmax loss:
其中,
表示第i個預設框和第j個p類真值框比對。
(3)其中location loss是典型的smooth L1 loss:
8、比對政策
在訓練時,groundtruth boxes 與 default boxes(就是prior boxes) 按照如下方式進行配對:
(1)首先,尋找與每一個ground truth box有最大的jaccard overlap的default box,這樣就能保證每一個groundtruth box與唯一的一個default box對應起來(所謂的jaccard overlap就是IoU)。
(2)SSD之後又将剩餘還沒有配對的default box與任意一個groundtruth box嘗試配對,隻要兩者之間的jaccard overlap大于門檻值,就認為match(SSD 300 門檻值為0.5)。
(3)配對到GT的default box就是positive,沒有配對到GT的default box就是negative。
9、硬負樣本挖掘
一般情況下negative default boxes數量 >> positive default boxes數量,直接訓練會導緻網絡過于重視負樣本,進而loss不穩定。是以SSD在訓練時會依據confidience score排序default box,挑選其中confidience高的box進行訓練,控制positive:negative=1:3
10、資料增強
随機的進行如下幾種選擇:
(1)使用原始的圖像
(2)采樣一個 patch,與物體之間最小的 jaccard overlap 為:0.1,0.3,0.5,0.7 或 0.9
(3)随機的采樣一個 patch,采樣的 patch 是原始圖像大小比例是[0.1,1],aspect ratio在1/2與2之間。
11、思考:SSD多尺度得到的預測結果如何綜合考慮?
每個尺度結果互不影響,得到的預測結果個數是各層的總和,然後進行NMS,得到最終預測結果。也就是說,SSD就是(把Faster-RCNN和YOLO中做了一次的)分類和檢測過程放在不同的圖像大小上做了多次。
二、代碼解讀
1、SSDNet網絡結構
在vgg16的基礎上(前5個block),新增一些卷積層,分别提取block4,block7,block8,block9,block10,block11層的不同大小特征圖,在多個feature maps上同時進行softmax分類和位置回歸。
block1~5代碼如下:
block6~11代碼如下:
對這些層:block4,block7,block8,block9,block10,block11都做softmax分類和位置回歸。
其中ssd_multibox_layer函數如下:
2、SSD loss
硬負樣本挖掘、分類用交叉熵損失函數、框位置回歸用smooth L1