讀論文系列:Object Detection ECCV2016 SSD

讀論文系列:Object Detection ECCV2016 SSD

來自專欄 夢裡茶

轉載請註明作者:夢裡茶

Single Shot MultiBox Detector

Introduction

一句話概括:SSD就是關於類別的多尺度RPN網路

基本思路:

  • 基礎網路後接多層feature map
  • 多層feature map分別對應不同尺度的固定anchor
  • 回歸所有anchor對應的class和bounding box

Model

  • 輸入:300x300
  • 經過VGG-16(只到conv4_3這一層)
  • 經過幾層卷積,得到多層尺寸逐漸減小的feature map
  • 每層feature map分別做3x3卷積,每個feature map cell(又稱slide window)對應k個類別和4個bounding box offset,同時對應原圖中6(或4)個anchor(又稱default box)
    • 38x38, 最後3x3, 1x1三個feature map的每個feature map cell只對應4個anchor,分別為寬高比: 1:1兩種,1:2, 2:1兩種,因此總共有 38*38*4+19*19*6+10*10*6+5*5*6+3*3*4+1*1*4=8732 個anchor
    • 其他feature map的feature map cell對應6個anchor,分別為寬高比: 1:1兩種,1:2, 2:1兩種,1:3, 3:1兩種
    • 每層的feature map cell對應的anchor計算方法如下
    • 位置:假設當前feature map cell是位於第i行,第j列,則anchor的中心為 (frac{i+0.5}{|fk|},frac{j+0.5}{|fk|}) , fk是第k層feature map的size(比如38)
    • 縮放因子: s_k = frac{s_{min} + s_{max}-s_{min}}{m-1}(k-1), kin[1, m]

其中 s_{min} 為0.2, s_{max} 為0.9,m為添加的feature map的層數,縮放因子就是為不同feature map選擇不同的大小的anchor,要求小的feature map對應的anchor盡量大,因為越小的feature map,其feature map cell的感受野就越大

    • anchor寬高:
      • w_k^a=s_k sqrt{a_r}
      • h_k^a=s_k/ sqrt{a_r}

其中, a_r∈{1,2,3,1/2,1/3} ,可以理解為在縮放因子選擇好anchor尺寸後,用ar來控制anchor形狀,從而得到多尺度的各種anchor,當 a_r=1 時,增加一種 s_k = sqrt{s_{k-1}{s_{k+1}}} ,於是每個feature map cell通常對應6種anchor。

  • 網路的訓練目標就是,回歸各個anchor對應的類別和位置

Training

樣本

  • 正樣本

    選擇與bounding box jaccard overlap(兩張圖的交集/並集)大於0.5的anchor作為正樣本
  • 樣本比例

    Hard negative mining:由於負樣本很多,需要去掉一部分負樣本,先整圖經過網路,根據每個anchor的最高類置信度進行排序,選擇置信度靠前的樣本,這樣篩選出來的負樣本也會更難識別,並且最終正負樣本比例大概是1:3

Loss

還是一如既往的location loss + classification loss,並為location loss添加了係數α(然而實際上α=1)進行平衡,並在batch維度進行平均

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

  • x是 x_{ij}^p 的集合 x_{ij}^p={1,0} ,用於判斷第i個anchor是否是第j個bounding box上的p類樣本
  • c是cip的集合,cip是第i個anchor預測為第p類的概率
  • l是預測的bounding box集合
  • g是ground true bounding box集合

其中定位loss與faster rcnn相同

L_{loc}(x,l,g)=sum_{iin Pos}^N sum_{m in {cx,cy,w,h}}x_{ij}^k smooth_{L1}(l_i^m-hat{g}_j^m)

其中 hat{g}_j^m 對中心坐標,寬高分別做修正

hat{g}_j^{cx}=(g_j^{cx}-d_i^{cx})/d_i^w hat{g}_j^{cy}=(g_j^{cy}-d_i^{cy})/d_i^h

hat{g}_j^{w}=log(frac{g_j^w}{d_i^w}) hat{g}_j^{h}=log(frac{g_j^h}{d_i^h})

這個式子里的k不是很明確,其實想表達不算背景0類的意思,且前景類只為match的類算location loss

分類loss就是很常用的softmax交叉熵了

L_{conf}(x,c) = - sum_{iin Pos}^N x_{ij}^p log(hat{c}_i^p) - sum_{iin Neg} log(hat{c}_i^0) where hat{c}_i^p=frac{exp^{c_i^p}}{sum_p exp(c_i^p)}

核心的內容到這裡就講完了,其實跟YOLO和faster rcnn也很像,是一個用anchor box充當固定的proposal的rpn,並且用多尺度的anchor來適應多種尺度和形狀的目標對象。

Detail

在訓練中還用到了data augmentation(數據增強/擴充),每張圖片多是由下列三種方法之一隨機採樣而來

  • 使用整圖
  • crop圖片上的一部分,crop出來的min面積為0.1,0.3,0.5,0.7,0.9
  • 完全隨機地crop

然後這些圖片會被resize到固定的大小,隨機水平翻轉,加入一些圖像上的雜訊,詳情可以參考另一篇論文:

Some improvements on deep convolutional neural network based image classification

從切除實驗中,可以看到data augmentaion是很重要的(從65.6到71.6)

這個表中還提到了atrous,指的是空洞卷積,是圖像分割(deeplab)領域首先提出的一個卷積層改進,基於相鄰像素冗餘的假設,跳過相鄰像素進行卷積,感受野更大,測試速度也更快。

  • 標準卷積:

  • 空洞卷積:

具體可以參考ICLR2015 Deeplab

從這個表中也可以看出多種形狀的anchor可以提升準確率

Result

輸入尺寸為300x300,batch size為8的SSD300可以做到實時(59FPS)且準確(74.3% mAP)的測試

Summary

SSD算是一個改進性的東西,是一個用anchor box充當固定的proposal的rpn,並且用多尺度的anchor來適應多種尺度和形狀的目標對象。站在Faster RCNN的肩膀上達到了實時且準確的檢測


推薦閱讀:

關於CV、ML、DL、RL的一些資料
【重磅】基於深度學習的目標檢測演算法綜述
運用機器視覺實現鑄造模具的智能化檢測
車輛識別(特徵提取+svm分類器)
Caffe2教程--2.圖像載入與預處理

TAG:目標檢測 | 計算機視覺 | 深度學習DeepLearning |