【Deep Learning】SSD: Single Shot MultiBox Detector

  本文的主要內容是提出了一種新的既能夠保證一定速度又能保證一定精度的目標檢測演算法,這種演算法成為“SSD”目標檢測模型。


1. 綜述

  這篇論文提出了一種僅適用單一深度神經網路的影象中的目標檢測演算法。這種演算法稱為 SSD,它輸出一系列 離散化 的 bounding boxes,這些 bounding boxes 是在不同的層次(layers)上的 feature maps 上生成的,並且有著不同的 aspect ratio(長寬比)。
  在預測階段的大致流程為:

  • 計算出每一個 default box 中的物體屬於每個類別的可能性,也就是計算出一個 得分(score)
  • 同時,對這些 bounding boxes 的 shape 進行微調,以此來使其符合物體的物體的真實邊框。
  • 此外,為了處理相同物體的不同尺寸的情況,SSD 結合了不同解析度的 feature maps 的 prediction 進行聯合預測。

  與那些需要目標的 region proposal 的方法相比,SSD 是一種比較簡單的方法。因為 SSD 完全去掉了 region proposal 生成,pixel resampling 或是 feature resampling 這些操作。這使得 SSD 更容易進行優化訓練以及更為容易地將檢測模型融合到整個檢測系統中。

  在 PASCAL VOC,COCO, 以及 ILSVRC 資料集上的實驗已經證實了 SSD 在保證檢測精度的同時,它的速度比現有的,使用 region proposal 的方法快得多。

  SSD 相比較於其他的單結構模型(YOLO)能夠取得更高的精度,即使是在輸入影象較小的情況下也能夠得到比較好的效果。


2. 整體框架

  目前的最好的物體檢測演算法都是使用以下方法的變體形式:

假設邊界框位置,為每個框重新取樣畫素或特徵,並在這些邊界框上應用高質量分類器。

根據這種流程已經產生了目前效果最好的目標檢測方法,並且已經在各個資料集上都有著 state-of-art 的效果。在達到高準確率的同時,這些方法同樣擁有高複雜度,這些方法對於嵌入式系統,甚至是高階嵌入硬體來說,對於實時應用都太慢了。

  按照上面這種流程進行目標檢測的速度大多是 幀/秒(SPF)級別的,即使是目前最快的目標檢測方法 Faster-RCNN 也只能達到 7幀/秒。目前已經有許多方法嘗試通過改變這種流程來獲得更快的檢測速度,但是到目前為止,顯著提高的速度僅以代價顯著降低的檢測精度為代價。

  本文提出了第一個基於深度網路的物體檢測器並且它不對邊界框假設的畫素或特徵進行重取樣,並且與之前所做的方法一樣精確。因此可以看出 SSD 在速度方面的提升來自於消除 bounding box proposal 以及 subsequent pixel 或是 feature resampling stage。本文所做的工作不僅僅是取消了這些過程,而且還使用一系列小尺寸的卷積核來預測目標的勒邊以及 bounding box 位置的偏移;使用單獨的預測器(濾波器)來檢測不同寬高比,並將這些濾波器應用於網路後期的多個特徵對映中,以便在多個尺度上執行檢測。通過利用上述方法對網路進行改進後,尤其是利用多尺度檢測資訊,使得本文的結構對於地解析度影象的輸入也能有一個比較好的檢測精度。

  最後對本文的 contributions 進行總結:

  • 介紹了 SSD 這種新的目標檢測方案,比目前已有的 YOLO 檢測演算法更快並且擁有更高的準確率。準確率甚至已經達到了那些 使用 region proposal 的方法(Faster R-CNN)。
  • SSD的核心是使用應用於特徵對映的小卷積濾波器來預測固定的一組預設邊界框的類別分數和框偏移量。
  • 為了實現高檢測精度,我們根據不同尺度的特徵地圖生成不同尺度的預測,並通過縱橫比明確地分開預測。
  • 即使在低解析度的輸入影象上,這些設計功能也可以實現簡單的端到端培訓和高精度,從而進一步提高速度與精度之間的平衡。
  • 實驗包括在 PASCAL VOC,COCO 和 ILSVRC 上評估不同輸入大小的模型的時序和準確性分析,並與最新的一系列最新方法進行比較。

3.The Single Shot Detector(SSD)

  這部分的內容主要是對 SSD 的整體框架以及內部具體實現細節進行說明。下面進行分點介紹。

3.1 Model

  SSD 方法是基於一個前饋卷積網路,該網路可生成固定大小的邊界框集合,並在這些框中預測存在物件的類別,然後進行非最大抑制(NMS)以產生最終檢測結果。早起的網路是基於標準的高質量的分類網路(在分類層之前),將這部分的網路結構稱之為“base network”,也就是 基礎網路。然後再在這個 基礎網路的基礎上增加一些輔助的結構用來進行目標檢測並有以下的特徵:

  • Multi-scale feature maps for detection
  • Convolutional predictors for detection
  • Default boxes and aspect ratios

下面對上面的三點進行分別介紹

3.1.1 Multi-scale feature maps for detection

  為了獲得檢測目標的多尺度特性,作者在得到的 base network 的後面新增了一些卷積特徵層。這些層逐漸減小,並允許在多個尺度上對檢測結果進行預測。預測檢測的卷積模型對於每個特徵層是不同的。

3.1.2 Convolutional predictors for detection

  每個增加的特徵層(或者可選的來自基礎網路的特徵層)可以使用一組卷積濾波器產生一組固定的檢測預測。這些在下圖中的SSD網路架構的頂部表示出來。

這裡寫圖片描述

  對於一個尺寸為 m×nm\times n 並且具有 pp 個通道的特徵圖(feature maps)來說,預測潛在檢測引數的基本元素是一個3×3×p3×3×p 的小核心,可以產生一個類別的分數,或者相對於預設的盒子座標的形狀偏移量。在特徵圖上的 m×nm\times n 每個位置都應用上述這個卷積核,都會產生相應的輸出。Bounding box 的偏移值的輸出是相對於每個邊界框的預設位置而言的(在 YOLO 中使用的是全連線層來代替這裡的卷積層)。

  在這裡需要進行一個簡單的說明,所謂的 邊界框的預設位置,也就是“default box”,需要先明白 feature map cell ,而 feature map cell 就是將 feature map 切分成為 8×88\times 8 或者是 4×44\times 4 大小之後的每個 cell。
  因此,default box 指的是在每個格子上,一系列固定大小的 boxes,也就是下圖中的虛線所形成的一系列的 boxes。

這裡寫圖片描述

3.1.3 Default boxes and aspect ratios

  每一個 box 相對於與其對應的 feature maps cell 的位置是固定的。在每個 feature map cell 中,我們要預測的是 box 與 default box 之間的 offsets(偏移量),以及每一個 box 中包含物體的 score(每個類別的概率都需要計算出來)。
  因此,對於一個位置上的 k 個 boxes 中的每一個 box,需要計算出 cc 個類的 score,以及這個 box 相對於它的 default box 的 4 個偏移值(offsets)。因此,在 feature map 中的每一個 feature map cell 上,就需要有 (c 4)×k(c 4)\times k 個 卷積核,也就是論文中的 filters。對於一張 m×nm\times n 大小的 feature map,就會產生 (c 4)×k×m×n(c 4)\times k\times m \times n 個輸出結果。

  可以看到,SSD 中的 default box 非常類似與 Faster R-CNN 中的 Anchor boxes,但是與 Anchor boxes 最大的不同是,本文中的 default boxes 是用在不同的解析度的 feature maps 上。

3.2 Training

  在訓練時,SSD 的訓練方法與之前那些使用 region proposal pooling 方法的區別是,SSD 訓練影象中的 ground-truth 需要賦予到那些固定輸出的 boxes 上。在上文中也已經提到,SSD 輸出的是實現定義好的,一系列固定大小的 bounding boxes。事實上,這種方法在 YOLO, Faster R-CNN 中的 RPN 階段以及 MultiBox 中都有使用。只要將訓練影象中的 ground truth 與固定輸出的 boxes 對應之後,就可以進行端到端的損失函式計算以及反向傳播的計算更新了。
  至於如何進行對應,論文中用下圖進行介紹:
這裡寫圖片描述

在上圖中,右邊狗狗的 ground truth 是紅色的 bounding box,但是在進行 label 標註的時候,要將紅色的 ground truth 賦予上圖(c) 中一系列固定輸出的 boxes 中的一個,也就是圖(c)中的紅色虛線框。而至於為什麼選擇這個虛線框而非其餘的虛線框,是因為這個虛線框的與 ground truth 的 IoU 最大。

  在訓練過程中同樣會引入一些其他的問題。大致如下所示:

  • Matching stategy -> 也就是如何選擇一系列的 default boxes
  • Training objective -> 目標損失函式的選擇
  • Choosing scales and aspect ratios for default boxes -> 選擇 default boxes 的尺度問題
  • hard negative mining -> 負樣本問題
  • Data augmentation -> 資料增強問題

下面進行分別介紹:

3.2.1 Matching strategy

   在訓練過程中,首先需要確定的一個問題是:如何將 ground truth boxes 與 default 進行匹配,以此組成 label ?
  對於每個 ground truth box,我們都從預設的框中進行選擇,這些框根據位置,長寬比和比例而變化。在開始的時候,使用 MultiBox 中的 best jaccard overlap(也就是 IoU)來匹配每一個 ground truth box 與 default box,這樣就能保證每一個 ground truth box 與唯一一個 default box 對應起來。但是又不同於 MultiBox,SSD 在進行這步之後又將 default box 與任意的 ground truth box 進行匹配,只要兩者之間的 jaccard overlap 大於一個閾值即可,本文中的閾值取的是 0.5.
  像上面這樣操作簡化了學習問題,使網路可以預測多個重疊預設框的高分,而不是隻挑選最大重疊的框。

3.2.2 Training objective

  SSD 的訓練時的目標函式源自於 MultiBox 的目標函式,但是 SSD 的目標函式又將其進行拓展,使其能夠處理多個目標類別。這裡使用 xpij=1x_{ij}^p=1 表示 第 ii 個 default box 與 類別 p 的 第 jj 個 ground truth box 相匹配,否則如果不匹配的話,則有 xpij=0x_{ij}^p=0。
  根據上面這種匹配策略,我們會得到 ∑ixpi,j≥1\sum_{i}x_{i,j}^p\geq 1。最後總的目標函式(objective loss function)就是由 localization loss (loc)與 confidence loss(conf)的加權求和

L(x,c,l,g)=1N(Lconf(x,c) αLloc(x,l,g))

L(x,c,l,g)=\frac{1}{N}(L_{conf}(x,c) \alpha L_{loc}(x,l,g))

  上面公式中:

  • NN 是與 ground truth box 相匹配的 default boxes 的個數。特別的,當 N=0N=0 時,這是我們令總損失 loss=0loss = 0 。
  • LlocL_{loc} 就是 Fast R-CNN 中的 Smooth L1 Loss,具體的形式在之前的 部落格 中已經有詳細介紹,這裡不再贅述。只需要知道,我們迴歸的是default boxes 的中心點相對於真實的偏移以及寬度和高度。
  • confidence loss(conf)是 Softmax Loss,其中輸入為每一類的置信度 cc。具體表達還如下所示:
    Lconf(x,c)=−∑i∈PosNxpijlog(c^pi)−∑i∈Neglog(c^0i)          where     c^pi=exp(cpi)∑pexp(cpi)

    L_{conf}(x,c)=-\sum_{i\in Pos}^Nx_{ij}^plog(\hat {c}_{i}^p)-\sum_{i\in Neg}log(\hat c_i^0) \ \ \ \ \ \ \ \ \ \ where \ \ \ \ \ \hat{c}_{i}^p = \frac{exp(c_i^p)}{\sum_pexp(c_i^p)}

  • 權重項為 α\alpha,實驗中設定為 1。

3.2.3 Choosng scales and aspect ratios for default boxes

  為了處理對不同尺度物體的檢測,之前的一些方法(OverfeatSPP-Net 等)將影象本身轉換成為不同尺度,然後將這些影象獨立的通過 CNN 網路進行處理,再將這些不同尺度的影象進行結合以適應於不同尺度影象的檢測。

  但是,通過使用一個網路結構中的不同層次的特徵(feature map)我們同樣可以得到相同的效果。而且 此時在所有物體尺度中共享引數
  之前的論文(FCN 等)就是使用了 CNN 前面的 層,以此來提高影象的分割的效果,因為越是底層的 layers,越是能夠儲存影象的底層特徵,也就是能夠更多的保留影象的細節資訊。

  受到上面方法的啟示,在 SSD 中同時使用 “lower feature maps”以及“upper feature maps”進行檢測的預測,也就是說,在 SSD 中同時利用底層特徵和高層特徵進行目標檢測。在下圖中展示了在 本文中使用的兩種尺度 feature map,分別是 8×88\times 8 和 4×44\times 4 的feature map:

這裡寫圖片描述

在實際的使用中,我們可以使用不同的或是更多的 feature maps 用以目標檢測。

  因為來自不同層的 feature maps 有著不同的感受野(receptive field)。這裡的感受野,指的是輸出的 feature map 上的一個點,對應輸入影象上尺寸的大小。感受野的計算,可以參考:CNN中感受野的計算
  但是幸運的是,在 SSD 中,default boxes 不需要與每一層 layer 的 receptive fields 相對應。在本文中,所使用的方法是

在 feature map 中的特定的位置,來負責影象中特定的區域,以及物體的特定尺寸。

  也就是說,假如我們使用 mm 個 feature maps 來進行 預測(predictions),每一個 feature map 中 default box 的 尺寸大小計算方法如下所示:

sk=smin smax−sminm−1(k−1),     k∈[1,m]

s_k=s_{min} \frac{s_{max}-s_{min}}{m-1}(k-1),\ \ \ \ \ k\in [1,m]
其中:

  • smin=0.2s_{min} = 0.2,表示最底層的尺度為 0.2。
  • smax=0.9s_{max} = 0.9,表示最頂層的尺度為 0.9。
  • 可以看出從最底層到頂層是所使用的尺度是逐漸變化的。

  由上面的公式可以計算出每層的 default box 的尺寸,然後再使用不同的 aspect ratio (寬高比)的 default boxes,這裡使用 ara_r 表示:ar={1,2,3,1213}a_r=\{1,2,3,\frac{1}{2}\frac{1}{3}\},則每個 default box 的 寬高都可以使用下面的公式計算出來:

wak=skar−−√

w_k^a=s_k\sqrt{a_r}

hak=sk/ar−−√

h_k^a=s_k/\sqrt{a_r}
  對於 ratio = 1(也就是寬高相等)時,文中還增加了一個 default box,這個 box 的 scale 為:s′k=sksk 1−−−−−√s’k=\sqrt{s_ks_{k 1}}。所以在最終每個 feature map location 上,一共有 6 個 default boxes。
  對於每一個 default box 的中心設定為:(i 0.5|fk|,j 0.5|fk|)(\frac{i 0.5}{|f_k|},\frac{j 0.5}{|f_k|}),其中 |fk||f_k| 是第 kk 個 feature map 的大小,且有 i,j∈[0,|fk|)i,j \in [0,|f_k|)。在這部分的最後,作者有提到,可以設計不同的 default boxes 的尺度的分佈以此來適應各種不同的資料集

  通過對來自許多 feature map 的所有位置的具有不同尺度和高寬比的所有 default boxes 進行預測,我們有多種預測,涵蓋各種輸入物件大小和形狀。

這裡寫圖片描述

在上圖中,狗狗的 ground truth box 與 4×44\times 4 feature map 中的紅色 box 溫和,所以其餘的 boxes 都看做是負樣本。

3.2.4 Hard negative mining

  在進行匹配之後,大多數的 default boxes 都會被判定為是負樣本(negatives),尤其是當 default boxes 的數量很大的時候。因此這會造成正負樣本之間的不平衡。因此這裡並不適用全部的負樣本,而是對 default boxes 按照置信度最高進行排序,再挑選前面最高的 default boxes,使得負樣本與正樣本之間的比例大致為 3:1。使用這種方法可以加快優化速度以及使訓練過程更加穩定。

3.2.5 Data augmentation

  為了使整個模型對不同尺寸和形狀的目標更具魯棒性,作者對訓練資料進行了資料增強,也就是對每張訓練的圖片都使用下面的方法隨機剪裁:

  • 使用原始影象
  • 在原始影象上取樣一個 patch,使得最小的 overlap 為 0.1,0.3,0.5,0.7 或 0.9
  • 隨機的取樣,取得一個 patch

  取樣的 patch 與原影象大小比例為 [0.1,1][0.1,1],aspect ratio 在 12\frac{1}{2} 與 22 之間。當 ground truth box 的中心在取樣得到的 patch 中時,我們保留重疊部分。
  在這些取樣步驟之後,每一個取樣得到的 patch 都被 resize 到固定的大小,並且以 0.5 的概率進行隨機 水平翻轉(horizontally flipped)。

4. Experimental Result

  在論文中這部分主要講的是提出的 SSD 模型在不同的檢測資料集上的實際效果,以及與當前流行的其餘的目標檢測模型的對比情況。
  這裡我主要對 文中 在這部分一開始講解的一個演算法進行介紹,雖然文中沒有細講,因為這個演算法來自於其他的論文,目前還沒有看到這篇論文,因此直接將這種演算法寫到這裡。

4.1 a` trous\grave{a}\ trous algorithm

  這個演算法的主要文獻來自於谷歌的這篇論文 DeepLab,主要是介紹一種影象的語義分割演算法。

  本文的 Base Network 是基於 ICLR 2015,VGG16 來完成的,並且在 ILSVRC CLS-LOC 資料集上進行了預訓練。與 DeepLab 工作類似,本文將 VGG 中的 FC6 layer、FC7 layer 轉成為 卷積層,並對模型的 FC6、FC7 上的引數進行下采樣從而得到這兩個卷積層。並且將 Pool5 的 2×2−s22\times 2 – s2 變為 3×3−s13\times 3 -s1,然後使用 a` trous\grave{a}\ trous algorithm 來填充“holes”。
如下圖所示:圖片來自於 論文閱讀:SSD: Single Shot MultiBox Detector
這裡寫圖片描述

  但是在對 Pool5 做這樣的變化後,會改變生成的 feature map 的感受野(receptive field)的大小,因此,才會採用 a` trous\grave{a}\ trous algorithm 演算法,以此用來填充 “hole”,使得改變 Pool5 前後生成的 feature map 每個點對應的感受野大小保持不變,只有這樣,才能依然使用原來的網路引數對整個模型進行 fine tune(微調)。
  這裡的矛盾是“既想利用已經訓練好的模型進行 微調,又想改變網路結構從而得到更加 dense 的 score map
這裡寫圖片描述

  在上圖(a) (b)中,在以往的卷積或者是 池化過程中,一個 卷積核中相鄰的權重作用在 feature map 上的位置都市物理上連續的。但是為了保證感受野不發生變化,在某一層的 stride 由 2 變成 1 後,後面的層就需要採用 hole 演算法,具體來說就是即將連續的連線關係根據 hole size 的大小變成 skip 連線的。(圖(c)為了顯示方便直接畫在本層上了)。pool4的stride由2變為1,則緊接著的 conv5_1, conv5_2 和conv5_3 中 hole size為2 。接著 pool5 由 2 變為 1 , 則後面的 fc6 中 hole size 為 4 。

  下面給出 DeepLab 中的圖:DeepLab

這裡寫圖片描述

deeplab hole algorithm
  最早用的就是 deeplab 的文章了,這篇文章和 fcn 不同的是,在最後產生 score map 時,不是進行 upsampling,而是採用了 hole algorithm,就是在 pool4 和 pool5 層,步長由2變成1,必然輸出的 score map 變大了,但是 receptive field 也變小了,為了不降低 receptive field,怎麼做呢?利用 hole algorithm,將卷積 weights 膨脹擴大,即原來卷積核是3×3,膨脹後,可能變成 7×7 了,這樣receptive field變大了,而 score map 也很大,即輸出變成dense的了。
  這麼做的好處是,輸出的 score map 變大了,即是 dense 的輸出了,而且 receptive field 不會變小,而且可以變大。這對做分割、檢測等工作非常重要。

  最後在 SSD 所使用的模型中,還將 fully convolutional reduced (atrous) VGGNet 中的所有的 dropout layers、fc8 layer 移除了。

4.參考文獻

  1. SSD: Single Shot MultiBox Detector
  2. Fully Convolutional Networks for Semantic Segmentation
  3. DeepLab: Semantic Image Segmentation with Deep Convolutional Nets, Atrous Convolution, and Fully Connected CRFs
  4. 論文閱讀:SSD: Single Shot MultiBox Detector
  5. deeplab hole algorithm
  6. SSD 裡的 atrous