1. 程式人生 > >[論文閱讀]SSD Single Shot Multibox Detector

[論文閱讀]SSD Single Shot Multibox Detector

SSD Single Shot Multibox Detector

Code: https://github.com/balancap/SSD-Tensorflow
  • SSD 是ECCV 2016的文章,文章主要提出了一種新的framework來完成object detection任務。主要的特點是速度快,mAP也比較有競爭力。
  • 文章的主要貢獻
    • 提出了SSD,它比當時最快的YOLO更快,而且相比於YOLO,它對accuracy的改進比較大。
    • SSD的核心是針對固定規模的default bounding boxes (類似於faster RCNN 中的anchor)預測類別的得分和box的偏移量,通過給feature map後接小kernel的convolution layer來實現
    • SSD還實現來不同scale的object的detection, 它通過在不同階段的feature map後接convolution layer來實現
  • 網路結構
    SSD framework
    • 前面的VGG16作為我們的base network,根據需要我們也可以將其更換成其他網路
    • 我們得到VGG16的feature map後,其為conv5_3 layer。feature map的大小為3838。我們針對每個pixel提取4個bounding box,其具有不同的大小和長寬比。比如下圖所示。所以我們的output channel就是4(classes+4), 倍數4是因為有四個bounding box,括號裡面的4是cx, cy, w, h.
      default bounding box
    • 圖中所顯示的8732個bounding box是如何得到的呢?38*38*4 + 19*19*6 + 10*10*6 + 5*5*6 + 3*3*4 + 1*1*4 = 8732。
    • 得到8732個bboxes及其score後,我們再根據NMS演算法進行合併排除,得到最後的預測結果。
  • How to training
    • 在關注如何訓練這個問題的時候,我們最主要是關注怎樣去計算ground truth。首先我們瞭解,我們訓練的物件有兩個:1、每個default bounding box的category;2、每個default bounding box對應的offset。所以,我們計算ground truth的目標也是這兩個。
    • 實現函式介面見下面的函式,在train_ssd_network.py中有呼叫。其中glabels就是一幅圖片中每個bounding box對應的label, gbboxes是每幅圖片中每個bounding box的座標(x_min, y_min, x_max, y_max)。
      code
    • 最後我們在計算交叉熵和smoothed L1 loss,其介面如下,也在train_ssd_network.py中有呼叫:
      loss function