版權聲明:轉載時,請務必注明文章出處網址,謝謝! https://blog.csdn.net/Gentleman_Qin/article/details/84403313 </div>
<link rel="stylesheet" href="https://csdnimg.cn/release/phoenix/template/css/ck_htmledit_views-3019150162.css">
<link rel="stylesheet" href="https://csdnimg.cn/release/phoenix/template/css/ck_htmledit_views-3019150162.css">
<div class="htmledit_views" id="content_views">
<p>論文名稱:《 SSD: Single Shot MultiBox Detector 》</p>
論文下載:https://arxiv.org/pdf/1512.02325.pdf
論文代碼:https://github.com/weiliu89/caffe/tree/ssd
SSD 的思想:
圖片被送進網絡之后先生成一系列 feature map,傳統一點的one-stage框架會在 feature map(或者原圖)上進行 region proposal 提取出可能有物體的部分然后進行分類,這一步可能非常費時,所以 SSD 就放棄了 region proposal,而選擇直接生成一系列 defaul box(篩選出prior boxes投入訓練),然后以prior box 為初始bbox,將bboxes回歸到正確的GT位置上去,預測出的定位信息實際上是回歸后的bboxes和回歸前的(prior box)的相對坐標。整個過程通過網絡的一次前向傳播就可以完成。

1. 網絡結構
1、SSD 同時使用多個卷積層的輸出來做分類和位置回歸:
SSD 采用不用卷積層的 feature map 進行綜合,將 VGG16 的最后兩層全連接改為卷積層並額外增加四個卷積層來達到構造網絡。對於這 5 個不同尺度的卷積層輸出的 feature map,作者分別采用不同的 3x3 的卷積核進行卷積,一個輸出分類的置信度(condfidence),一個輸出回歸的 localization。

從圖中可以看到 SSD 將 conv4_3、conv7、conv8_2、conv9_2、conv10_2、conv11_2 都連接到了最后的檢測、分類層做回歸。
先回顧下 YOLO 的結構,YOLO 在訓練時 ground truth 和 bbox 是一一對應的關系(ground truth 對應到其中心位置所在區域中 IOU 最大的那個 bbox 來計算 loss),如果有兩個 ground truth 的尺寸和位置都比較相近,就很有可能對應到同一個區域的同一個 bbox,這種場景下必然會有一個目標無法識別。為了解決這個問題 SSD 的作者把 YOLO 的結構做了如下優化:

a、重新啟用了 Faster R-CNN 中 anchor 的結構
在 SSD 中如果有多個 ground truth,每個 anchor(原文中稱作 default box,取名不同而已)會選擇對應到 IOU 最大的那個 ground truth。一個 anchor 只會對應一個 ground truth,但一個 ground truth 都可以對應到大量 anchor,這樣無論兩個 ground truth 靠的有多近,都不會出現 YOLO 中 bbox 沖突的情況。
b、同時使用多個層級上的 anchor 來進行回歸
作者認為僅僅靠同一層上的多個 anchor 來回歸,還遠遠不夠。因為有很大可能這層上所有 anchor 的 IOU 都比較小,就是說所有 anchor 離 ground truth 都比較遠,用這種 anchor 來訓練誤差會很大。例如圖 2 中,左邊較低的層級因為 feature map 尺寸比較大,anchor 覆蓋的范圍就比較小,遠小於 ground truth 的尺寸,所以這層上所有 anchor 對應的 IOU 都比較小;右邊較高的層級因為 feature map 尺寸比較小,anchor 覆蓋的范圍就比較大,遠超過 ground truth 的尺寸,所以 IOU 也同樣比較小;只有圖 2 中間的 anchor 才有較大的 IOU。通過同時對多個層級上的 anchor 計算 IOU,就能找到與 ground truth 的尺寸、位置最接近(即 IOU 最大)的一批 anchor,在訓練時也就能達到最好的准確度。

SSD算法直接預測目標的坐標和類別,沒有生成候選框的過程。網絡直接在VGG16網絡的基礎上進行修改。
SSD網絡=基礎網絡+輔助結構
基礎網絡:VGG16(階段1~階段5)
輔助結構:fc6,fc7 àconv6,conv7
添加4個卷積層(conv6_2,conv7_2,conv8_2,conv9_2)
2.1用於檢測的多尺度特征圖
(1)這些層逐漸減小尺寸
(2)允許預測多個尺度的檢測
(3)每個特征層用於預測檢測的卷積模型是不同的
2.2 用於檢測的卷積預測器
(1)使用一組卷積濾波器生成一組固定的檢測預測
(2)3×3×p小卷積核
►物體類別得分
►相對於默認框的坐標偏移
2.3 Default boxes
其實作用就是為了獲取網格對應的訓練真值。可能是因為人工標注的真值沒辦法與上面的 k 個 bbox 對應,所以作者新建 k 個 default box 作為訓練時的真值。每個 default box 的長寬比例保持固定。SSD 訓練圖像中的 groundtruth 需要賦予到那些固定輸出的 boxes 上。
default box 在不同的 feature 層有不同的 scale,在同一個 feature 層又有不同的 aspect ratio,因此基本上可以覆蓋輸入圖像中的各種形狀和大小的 object
每個Default boxes預測C個類別得分和4個offset
▪ m×n feature map + (c+4)×k濾波器 à (c+4)×k×m×n 輸出
▪ 類似 Faster R-CNN 中的anchor boxes
論文中使用了幾種不同分辨率的feature map。
▪Feature map cell是Feature map分成的每個小格(例如上圖b的8*8)。
▪Default box 是每個小格上對應的一系列box。
▪Prior box是指實際中選取的default。

Default boxes 與 Prior box:
每個輸入檢測器的feature map 的每個像素生成 4或6 個框,這些框就是default box,不同的特征圖生成的default boxes的大小不同,各有對應的計算公式,每個default box 相對於其對應的 feature map cell (特征圖對應像素點)的位置是固定的。 在每一個 feature map cell 中,我們要 predict 得到的 box 與 部分精選(1:3)出的default box 之間的 offsets(在原始輸入圖片上的相對位移),以及每一個 box 中包含物體的 score(每一個類別概率都要計算出)。
對於一個位置上的 k 個 boxes 中的每一個 box,我們需要計算出 c 個類中每一個類的 score,還有這個 box 相對於與它匹配的default box 的 4 個偏移值(offsets)。於是,在 feature map 中的每一個 feature map cell 上,就需要有(c+4)×k 個 filters得到對應數量的值。對於一張m×n 大小的 feature map,即會產生 (c+4)×k×m×n 個輸出結果。所以理論上會生成(38*38*4 + 19*19*6 + 10*10*6 + 5*5*6 + 3*3*4 + 1*1*4)= 8732 個 default boxes。
prior box是指實際中選擇的要投入訓練過程的 default box(每一個 feature map cell 不是 k 個 default box 都取)。 default box 是一種概念,prior box 則是實際的選取。訓練中一張完整的圖片送進網絡獲得各個 feature map,總共生成8732 個 default boxes,而后開始確定正負樣本以投入訓練。
將 default box 與本張圖像中任一 groundtruth box 配對,找到最大的IOU,只要兩者之間的 jaccard overlap 大於一個閾值(論文中閾值為 0.5),便設為候選正樣本,其他為候選負樣本。候選正樣本和候選負樣本經過篩選后投入訓練。
- 匹配策略: 訓練階段建立GT和default對應關系,開始先匹配每個GT框與default框最大jaccard 重疊的那個default,確保每個GT框有一個匹配的default框,然后匹配default框與GT框 jaccard 重疊高於閾值 0.5 的default框。這樣就允許網絡對多個重疊的default框預測獲得高置信度,而不是只選擇最大重疊的一個。候選正樣本的數量也由此提升。
舉個列子:假設一個訓練圖片中有 2 個 ground truth box,從輸入所有的檢測器 feature map 中獲取的 default boxes 一共有 8732 個,可能分別有 10、20 個 default box 能分別與這 2 個 ground truth box 匹配上。
正負樣本區分:(通過定位信息(iou)初步划分,而后通過loss把hard example留下,loss越大越hard)
1. 正樣本獲得
已經確定 default box,結合 ground truth,下一步要將 default box 匹配到 ground truth 上,從 groudtruth box 出發給每個 groudtruth box 找到了最近(IOU最大)的 default box 放入 候選正樣本集。然后再從 default box 出發為 default box 集中尋找與 groundtruth box 滿足 IOU>0.5 的的default box放入候選正樣本集。
2. 負樣本獲得(這是一個難例挖掘的過程)
在生成 prior boxes 之后,會產生很多個符合 ground truth box 的 positive boxes(候選正樣本集),但同時,不符合 ground truth boxes 也很多,而且這個 negative boxes(候選負樣本集),遠多於 positive boxes。這會造成 negative boxes、positive boxes 之間的不均衡。訓練時難以收斂。
將每一個GT上對應prior boxes的分類loss 進行排序。
對於候選正樣本集:選擇loss最高的m個 prior box 與候選正樣本集匹配 (box 索引同時存在於這兩個集合里則匹配成功),匹配不成功則刪除這個正樣本(因為這個正樣本loss太低,易被識別,所以不在難例里,已經很接近 ground truth box 了,不需要再訓練);
對於候選負樣本集:選擇最高的m個 prior box 與候選負樣本集匹配,匹配成功的則留下來作為最后的負樣本,不成功剔除出候選負樣本,因為他們loss不夠大,易被識別為背景,訓練起來沒難度沒提升空間。
3. 舉例:假設在這 8732 個 default box 里,經過 FindMatches 后得到候選正樣本 P 個,候選負樣本那就有 8732−P個。將 prior box 的 prediction loss 按照從大到小順序排列后選擇最高的 M個 prior box。如果這 P 個候選正樣本里有 a 個 box 不在這 M 個 prior box 里,將這 a個 box 從候選正樣本集中踢出去。如果這 8732−P個候選負樣本集中有 b個在這 M 個 prior box,則將這b個候選負樣本作為正式負樣本。即刪除易識別的正樣本,同時留下典型的負樣本,組成1:3的prior boxes樣本集合。SSD 算法中通過這種方式來保證 positives、negatives 的比例。
2.4 Hard example mining
example mining 是選擇出特定樣本來計算損失函數;從實際問題出發 hard example 應該就是指定位較困難或分類較困難或者兩者都困難的候選框。SSD 的 caffe 中支持 negative mining 和 hard example mining,當 share_location 參數為 true 時,只支持 negative mining。
Hard negative example 或 Hard positive example 的定義需要首先確定某個候選框是 negative example 還是 positive example。比如 SSD 中將與任意 gt_bbox 的 IOU 超過給定閾值 overlap_threshold(multibox_loss_param 中的一個字段,SSD 默認為 0.5)的當作正樣本,即前景類別為正樣本,背景類別為負樣本。比如,極端的例子,當圖像中沒有 gt_bbox 時,那么所有的 default bboxes 都是 negative example。
SSD 中 negative mining 只計算分類損失而不計算定位損失,而 hard example mining 對分類損失和定位損失都進行計算。
SSD 的 negative mining 的過程為:
0) 生成default bboxes,每個檢測器對應特征圖生成的default boxes數目為n*n*6或n*n*4;
1)匹配default boxes,將每個 default box 與 ground truth 匹配,保證每個ground truth 都能對應多個default boxes,避免漏檢;
2)衡量default boxes,當第 i 個 default box 被匹配到第 j 個 gt_bbox,那么計算其屬於背景類別的 softmax loss 或 cross entropy loss 值;

3) 篩選default boxes, 計算完所有default boxes 的分類 loss后,按照 loss 排序,選擇 loss 較大且與任意 gt_bbox 之間的 iou 小於 閾值neg_overlap 的樣本中的前 3*num_positive 個負樣本(保證留下的負樣本“夠壞”,同時保證1:3的正負比例)。
而后,這正負比為1:3的部分default boxes就是篩選全體default box后剩下的prior boxes,用這些prior box作為參考,對所有預測框其進行分類和回歸,進行反向傳播更新網絡參數,即訓練。
2. 訓練過程

(1)每一個 prior box 經過Jaccard系數計算和真實框的相似度。
(2)閾值只有大於 0.5 的才可以列為候選名單;假設選擇出來的是N個匹配度高於百分之五十的框。
(3)我們令 i 表示第 i 個默認框,j 表示第 j 個真實框,p表示第p個類。那么xi,jp 表示 第 i 個 prior box 與 類別 p 的 第 j 個 ground truth box 相匹配的Jaccard系數,若不匹配的話,則xi,jp=0 。
(4)總的目標損失函數(objective loss function)為 localization loss(loc) 與 confidence loss(conf) 的加權求和。



3. 創新點
(1)使用多尺度特征maps進行目標檢測。
(2)小卷積濾波器來預測固定的一組默認邊界框的類別得分和框偏移。
(3)為了實現高檢測精度,我們從不同尺度的特征圖產生不同尺度的預測,並通過縱橫比明確地分開預測。
(4)即使在低分辨率輸入圖像上,這些設計特征也可實現簡單的端到端訓練和高精度,從而進一步提高速度與精度之間的權衡。
4. 存在問題
SSD的缺點是對小尺寸的目標識別仍比較差,還達不到Faster R-CNN的水准。這主要是因為小尺寸的目標多用較低層級的anchor來訓練(因為小尺寸目標在較低層級IOU較大),較低層級的特征非線性程度不夠,無法訓練到足夠的精確度。