Single Shot MultiBox Detector (SSD) 論文閱讀

李謦伊
謦伊的閱讀筆記
11 min readJan 20, 2021

本文要介紹的物件檢測算法為 Single Shot MultiBox Detector (SSD),是 ECCV2016 的文章。由名稱 Single Shot 可以看出 SSD 屬於 One-stage 的物件檢測演算法,而 MultiBox 則是為多框預測。SSD 可以在保持準確率的同時,提高檢測速度,相比 Faster RCNN 與 YOLOV1 來得快速並且更準確

📝 Paper: https://arxiv.org/pdf/1512.02325.pdf

🔖 github: SSD-Tensorflow

🔖 github: ssd_keras

SSD 的做法跟 YOLOV1 有兩項不同的改變,第一就是加入 Pyramidal Feature Hierarchy,採用不同大小的特徵圖來檢測: 在大特徵圖上檢測小物體,在小特徵圖上檢測大物體;第二是參考 Faster R-CNN 中的 Anchors,依據每個特徵圖的大小產生一系列的先驗框 (Prior boxes,SSD 稱為 Default boxes)

網路架構

SSD 的 Backbone 採用 VGG16,將 VGG16 的 pool5 層從 size=2x2, stride=2 更改為 size=3x3, stride=1,以及最後兩個全連接層 FC6、FC7 分別改為 3x3、1x1 卷積層,並且在 3x3 卷積層中使用 Atrous Algorithm (就是指 Dilated Convolution)。然後移除所有 dropout 層與 FC8 層,再增加四個卷積層 Conv8_2、Conv9_2、Conv10_2、Conv11_2

📚 Dilated Convolution 是指在不增加模型與參數複雜度下,擴大卷積的視野,在 pytorch 中可以設定 dilation 值

torch.nn.Conv2d(in_channels, out_channels, kernel_size, stride, padding, dilation)

下圖 (a) 為一般 3x3 的卷積層,感受野為 3x3;圖 (b) 為 2-dilated 卷積層,擴張一格,感受野為 7x7;圖 (c) 為 4-dilated 卷積層,擴張三格,感受野為 15x15

source

下圖卷積運算的 GIF,由圖可以更清楚 Dilated Convolution 運算的過程

一般 3x3 的卷積層,dilation=1
2-dilated 卷積層,dilation=2

SSD 在模型裡新增了以下輔助結構

Multi-scale feature maps for detection

SSD 加入了 Pyramidal Feature Hierarchy,即是在不同大小的特徵圖 (不同的感受野) 中檢測,SSD是首次使用這種架構的網路,在Conv4_3、Conv7、Conv8_2、Conv9_2、Conv10_2、Conv11_2中實現

source

下圖為在不同大小的特徵圖中檢測的過程,可以看到 Conv4_3、Conv7、Conv8_2、Conv9_2、Conv10_2、Conv11_2 的大小分別為 38x38、19x19、10x10、5x5、3x3、1x1,其中在 Conv4_3 後面還加了一層 L2 Normalization

source

❓ 為什麼只在 Conv4_3 做 L2 Normalization?

💬 因為 Conv4_3 特徵圖的尺寸較大 (38x38),為了確保與後面特徵圖的尺寸差異不要太大,因此使用 L2 Normalization 在通道維度做歸一化,將特徵圖中的每個位置的值 norm scale 到 20,並且在反向傳播學習 scale 值

Convolutional predictors for detection

在剛剛的檢測過程圖以及網路架構圖中可以知道SSD 採用卷積層對不同大小的特徵圖進行檢測,與 YOLOV1 採用全連接層預測不同

做法是在不同的特徵圖中分別用兩個 3x3 卷積層進行卷積 (為了保持輸出與輸入的維度不變,卷積採用 stride=1, padding=1),一個輸出分類置信度 (confidence)、另一個輸出位置訊息 (x, y, w, h)

Default boxes and aspect ratios

SSD 參考了 Faster R-CNN 中的 Anchors,在每個特徵圖上設置不同尺寸、長寬比的先驗框 (Prior boxes,SSD 稱為 Default boxes),預測框會以這些先驗框為基準來預測,模型就不用另外去學習框的尺寸大小,可以降低一定程度的訓練難度

接著來講解 SSD 檢測過程的細節部分 — 在各個特徵圖上輸出檢測結果的運算過程

假設輸入為具有 p 通道的 mxn 特徵圖,使用 3x3xp 的卷積核進行卷積運算,會輸出 21 個分類置信度 (confidence)、及 4 個位置訊息 (x, y, w, h),之所以有 21 個分類置信度是因為總共有20個分類 + 1 個背景

設定候選框為 k 個,表示每個特徵點上會產生 k 個預測框,因此輸出會是

m x n x k x (21+4)

然後來看下圖例子會更清楚~~ 下圖是假設候選框為3個,因此每個特徵點上會有 3 個預測框,localization 的通道輸出就會是 3x4 (4 個位置訊息) = 12,confidence 的通道輸出會是 3x21 (21 個類別) = 63

source

了解檢測過程後,要來介紹 SSD 在訓練時還做了哪些策略

Matching strategy

首先,要確定 ground truth 要跟哪些先驗框做匹配,一共有兩個步驟

第一步,先配對與每一個 ground truth 有最大的 jaccard overlap (就是指 IOU) 的 Default boxes,如此一來能保證每一個 ground truth 都有唯一的 Default boxes 對應

第二步,將剩餘的 Default boxes 與任一 ground truth 做匹配,若兩者的 jaccard overlap 大於閾值 (通常設定為 0.5),則將兩者配對

由這兩步驟所配對到的 Default boxes 就是正樣本,反之為負樣本

Training objective

SSD 的損失函數為分類置信度損失 (confidence loss) 和位置損失 (localization loss) 的總和,其中 N 為匹配的 Default boxes 總數、α 為調整權重的參數

localization loss 為預測框 l 與真實框 g 的 smooth L1 loss,其中要先對真實框 g 做轉換

confidence loss 則是對多類別置信度做 softmax

Choosing scales and aspect ratios for default boxes

剛剛有說到匹配 ground truth 與 Default boxes 的步驟,現在要來說明各個特徵圖中 Default boxes 的尺寸大小設置

SSD 利用不同層的特徵圖來檢測不同尺度的物體: 在大特徵圖上檢測小物體,在小特徵圖上檢測大物體。假設有 m 個特徵圖用於檢測,則特徵圖的 scale 會由下列公式計算得到,其中論文設定 smin=0.2 表示最底層的特徵圖的 scale 值、smax=0.9 表示最高層的特徵圖的 scale 值

接著使用不同 ratios 計算 Default boxes 的長寬比,其中若 α=1 將會額外增加一個長寬比為1 的 Default boxes,因此每個特徵點共有六個 Default boxes (但是 Conv4_3、Conv10_2、Conv11_2 僅使用 4 個Default boxes,不使用 α=3, 1/3)

再來是 Default boxes 中心點計算

來算一下 Default boxes 的總數有多少~

前面有提到 Conv4_3、Conv7、Conv8_2、Conv9_2、Conv10_2、Conv11_2 的大小分別為 38x38、19x19、10x10、5x5、3x3、1x1,因此總共會有 38x38x4 + 19x19x6 + 10x10x6 + 5x5x6 + 3x3x4 + 1x1x4 = 8732 個框,跟 SSD 的網路架構圖上寫的框框總數一樣

Hard negative mining

因為在 Default boxes 匹配步驟後大多都是負樣本,導致正負樣本數量差距太大,訓練不穩定。因此作者將負樣本進行抽樣後,再將置信度由高至低排序,選取最高的一些 Default boxes 作為最後的負樣本,使正負樣本的比值最多為 1:3,如此一來模型可以快速優化、訓練也更穩定

Data augmentation

為了使模型對於各種大小的輸入預測更好,將每個訓練數據隨機經由下列選項其一變換

  1. 直接使用原始影像
  2. 採樣一個片段 (patch) 且物體與 ground truth 最小的 jaccard overlap 為 0.1, 0.3, 0.5, 0.7, 0.9
  3. 隨機採樣一個片段

其中取樣的片段大小為原尺寸的 [0.1, 1]、長寬比為 1/2~2 之間,並且如果 ground truth 中心點在採樣的片段內,則保留與 ground truth 重疊的區域

訓練數據經過 Data augmentation 後,將每個採樣片段 resize 至固定大小,再以 0.5 的概率隨機進行水平翻轉

📌 若想更了解 SSD 使用了哪些 Data augmentation 可以看此文章: SSD 中的數據增強

這些就是訓練時所使用的一些方法,那講完了訓練過程,就來看看實驗結果吧~~

實驗結果

  • 比較使用各種 trick

由數據可以看出使用 Data augmentation、更多 Default boxes、Atrous Algorithm 會提升 mAP

  • 在 PASCAL VOC2012 test 進行檢測比較

由結果可以知道 SSD 比 Fast/Faster RCNN、YOLOV1 還要更準確

  • COCO test dataset

為了驗證 SSD 模型,更進一步將 SSD300、SSD500 於 MS COCO dataset 進行訓練。因為 COCO 檢測數據集的物體更小,因此在每一層 layer 採用更小的 Default boxes

由下表中看到 SSD300 在 mAP0.75 時與 Faster R-CNN 差不多,但在 mAP0.5時略輸 Faster R-CNN。藉由將輸入尺寸放大為 512x512,SSD512 的 mAP 就比 Faster R-CNN 還要來的高了!

  • 各個模型在 PASCAL VOC2007 test 中進行檢測的準確率與速度比較

SSD300 比其他物件偵測模型的 mAP 要來得高且速度更快,增加輸入尺寸之後 (輸入尺寸從300 -> 512),SSD512 的準確率更高了,但是速度會慢一些

  • SSD 缺點

由上面的實驗結果得出 SSD 的偵測效果很優秀,並且能做到即時偵測。但是即使如此 SSD 還是有些缺點的,以下來說明 SSD 的缺點

🔹 需要人工設定 Default boxes 的 scales, aspect ratios 值,而且每一層特徵圖所使用的框尺寸大小不一,設置非常依賴經驗

🔹 SSD 雖然採用不同大小的特徵圖來檢測,但在小物體檢測方面效果較差,這是因為小物體的輸入在經過多層卷積之後,訊息變得更小,甚至沒剩多少訊息

下圖是 SSD 對於物體偵測的敏感程度。由圖中會發現 SSD 對物體大小非常敏感 (左圖),在小物體的檢測效果較差。提高輸入尺寸 (如左圖下 SSD512) 可以幫助提高檢測效果,但是效果有限

不過在右圖中可以看到 SSD 使用不同 aspect ratios 的 Default boxes 檢測效果還滿好的

--

--