SSD目標檢測

2021-02-23 深度學習衝鴨

關注「深度學習衝鴨」,一起學習一起衝鴨!

設為星標,第一時間獲取更多乾貨

連結:https://zhuanlan.zhihu.com/p/31427288著作權歸作者所有,本文僅作學術分享,若侵權,請聯繫後臺刪文處理

後臺回復西瓜手推獲得西瓜書手推筆記

後臺回復CV入坑必備獲得CV入坑學習資料

SSD,全稱Single Shot MultiBox Detector,是Wei Liu在ECCV 2016上提出的一種目標檢測算法,截至目前是主要的檢測框架之一,相比Faster RCNN有明顯的速度優勢,相比YOLO又有明顯的mAP優勢(不過已經被CVPR 2017的YOLO9000超越)。圖1 速度對比從YOLO中繼承了將detection轉化為regression的思路,一次完成目標定位與分類基於Faster RCNN中的Anchor,提出了相似的Prior box;加入基於特徵金字塔(Pyramidal Feature Hierarchy)的檢測方式,即在不同感受野的feature map上預測目標圖2 SSD300/YOLO網絡結構對比上圖2是原論文中的SSD300與YOLO網絡結構圖。位什麼要把SSD與YOLO對比呢?因為截止到目前目標檢測分為了2種主流框架:Two stages:以Faster RCNN為代表,即RPN網絡先生成proposals目標定位,再對proposals進行classification+bounding box regression完成目標分類。Single shot:以YOLO/SSD為代表,一次性完成classification+bounding box regression。那麼來看同為Single shot方式的SSD/YOLO區別:YOLO在卷積層後接全連接層,即檢測時只利用了最高層Feature maps(包括Faster RCNN也是如此)SSD採用金字塔結構,即利用了conv4-3/conv-7/conv6-2/conv7-2/conv8_2/conv9_2這些大小不同的feature maps,在多個feature maps上同時進行softmax分類和位置回歸圖3 單層feature map預測和特徵金字塔預測對比
在SSD300中引入了Prior Box,實際上與Faster RCNN Anchor非常類似,就是一些目標的預選框,後續通過classification+bounding box regression獲得真實目標的位置。以feature map上每個點的中點為中心,生成一些列同心的prior box每在prototxt設置一個aspect ratio,會生成2個長方形,長寬為:而每個feature map對應prior box的min_size和max_size由以下公式決定:s_k = s_{min} + \frac{s_{max}-s_{min}}{m-1}(k-1), \ \ k\in[1, m]

是指進行預測時使用feature map的數量,如SSD300使用conv4-3等6個feature maps進行預測,所以

顯然可以用上述公式推導出每個feature maps使用的Prior Box size。但是在SSD300中prior box設置並不能完全和上述公式對應:不過依然可以看出:SSD使用感受野小的feature map檢測小目標,使用感受野大的feature map檢測更大目標。更具體一點,來看SSD300在conv4_3層的Prior Box設置conv4_3生成prior box的conv4_3_norm_priorbox層prototxt定義如下,可以清晰的看到

layer {
name: "conv4_3_norm_mbox_priorbox"
type: "PriorBox"
bottom: "conv4_3_norm"
bottom: "data"
top: "conv4_3_norm_mbox_priorbox"
prior_box_param {
min_size: 30.0
max_size: 60.0
aspect_ratio: 2
flip: true
clip: false
variance: 0.1
variance: 0.1
variance: 0.2
variance: 0.2
step: 8
offset: 0.5
}
}

知道了priorbox如何產生,接下來分析prior box如何使用。這裡還是以conv4_3分析。圖5從圖5可以看到,在conv4_3網絡分為了3條線路:經過一次batch norm+一次卷積後,生成了**[1, num_class*num_priorbox, layer_height, layer_width]**大小的feature用於softmax分類目標和非目標(其中num_class是目標類別,SSD300中num_class = 21,即20個類別+1個背景)經過一次batch norm+一次卷積後,生成了**[1, 4*num_priorbox, layer_height, layer_width]**大小的feature用於bounding box regression(即每個點一組[dxmin,dymin,dxmax,dymax],參考Faster R-CNN 2.5節)生成了**[1, 2, 4*num_priorbox*layer_height*layer_width]**大小的prior box blob,其中2個channel分別存儲prior box的4個點坐標(x1, y1, x2, y2)和對應的4個參數variance後續通過softmax分類判定Prior box是否包含目標,然後再通過bounding box regression即可可獲取目標的精確位置,熟悉Faster RCNN的讀者應該對上述過程應該並不陌生。其實pribox box的與Faster RCNN中的anchor非常類似,都是目標的預設框,沒有本質的差異。區別是每個位置的prior box一般是4~6個,少於Faster RCNN默認的9個anchor;同時prior box是設置在不同尺度的feature maps上的,而且大小不同。還有一個細節就是上面prototxt中的4個variance,這實際上是一種bounding regression中的權重。在圖4線路(2)中,網絡輸出[dxmin,dymin,dxmax,dymax],即對應下面代碼中bbox;然後利用如下方法進行針對prior box的位置回歸:
decode_bbox->set_xmin(
prior_bbox.xmin() + prior_variance[0] * bbox.xmin() * prior_width);
decode_bbox->set_ymin(
prior_bbox.ymin() + prior_variance[1] * bbox.ymin() * prior_height);
decode_bbox->set_xmax(
prior_bbox.xmax() + prior_variance[2] * bbox.xmax() * prior_width);
decode_bbox->set_ymax(
prior_bbox.ymax() + prior_variance[3] * bbox.ymax() * prior_height);

上述代碼可以在SSD box_utils.cpp的void DecodeBBox()函數見到。對於新學習SSD的人,肯定有一個很大的困惑,就是這麼多feature maps和Prior Box,如何組合在一起進行forwards/backwards。本節專門介紹SSD的數據流動方式,也許有點難。但是只有了解SSD的數據流動方式才能真的理解。
圖6上一節以conv4_3 feature map分析了如何檢測到目標的真實位置,但是SSD 300是使用包括conv4_3在內的共計6個feature maps一同檢測出最終目標的。在網絡運行的時候顯然不能像圖6一樣:一個feature map單獨計算一次multiclass softmax socre+box regression(雖然原理如此,但是不能如此實現)。那麼多個feature maps如何協同工作?這時候就要用到Permute,Flatten和Concat這3種層了。其中conv4_3_norm_conf_perm的prototxt定義如下:
layer {
name: "conv4_3_norm_mbox_conf_perm"
type: "Permute"
bottom: "conv4_3_norm_mbox_conf"
top: "conv4_3_norm_mbox_conf_perm"
permute_param {
order: 0
order: 2
order: 3
order: 1
}
}

Permute是SSD中自帶的層,上面conv4_3_norm_mbox_conf_perm的的定義。Permute相當於交換caffe blob中的數據維度。在正常情況下caffe blob的順序為:bottom blob = [batch_num, channel, height, width]經過conv4_3_norm_mbox_conf_perm後的caffe blob為:top blob = [batch_num, height, width, channel]而Flattlen和Concat層都是caffe自帶層。圖7 SSD中部分層caffe blob shape變化那麼接下來以conv4_3和fc7為例分析SSD是如何將不同size的feature map組合在一起進行prediction。圖7展示了conv4_3和fc7合併在一起的過程中caffe blob shape變化(其他層類似,考慮到圖片大小沒有畫出來,請腦補)。對於conv4_3 feature map,conv4_3_norm_priorbox(priorbox層)設置了每個點共有4個prior box。由於SSD 300共有21個分類,所以conv4_3_norm_mbox_conf的channel值為num_priorbox * num_class = 4 * 21 = 84;而每個prior box都要回歸出4個位置變換量,所以conv4_3_norm_mbox_loc的caffe blob channel值為4 * 4 = 16。fc7每個點有6個prior box,其他feature map同理。經過一系列圖7展示的caffe blob shape變化後,最後拼接成mbox_conf和mbox_loc。而mbox_conf後接reshape,再進行softmax(為何在softmax前進行reshape,Faster RCNN有提及)。最後這些值輸出detection_out_layer,獲得檢測結果可以看到,SSD一次判斷priorbox到底是背景 or 是20種目標類別之一,相當於將Faster R-CNN的RPN與後續proposal再分類進行了整合。圖8 SSD300
SSD算法的優點應該很明顯:運行速度可以和YOLO媲美,檢測精度可以和Faster RCNN媲美。除此之外,還有一些雞毛蒜皮的優點,不解釋了。這裡談談缺點:需要人工設置prior box的min_size,max_size和aspect_ratio值。網絡中prior box的基礎大小和形狀不能直接通過學習獲得,而是需要手工設置。而網絡中每一層feature使用的prior box大小和形狀恰好都不一樣,導致調試過程非常依賴經驗。雖然採用了pyramdial feature hierarchy的思路,但是對小目標的recall依然一般,並沒有達到碾壓Faster RCNN的級別。作者認為,這是由於SSD使用conv4_3低級feature去檢測小目標,而低級特徵卷積層數少,存在特徵提取不充分的問題。對於SSD,雖然paper中指出採用了所謂的「multibox loss」,但是依然可以清晰看到SSD loss分為了confidence loss和location loss(bouding box regression loss)兩部分,其中N是match到GT(Ground Truth)的prior box數量;而α參數用於調整confidence loss和location loss之間的比例,默認α=1。SSD中的confidence loss是典型的softmax loss:代表第i個prior box匹配到了第j個class為p類別的GT box;而location loss是典型的smooth L1 loss:在訓練時,groundtruth boxes 與 default boxes(就是prior boxes) 按照如下方式進行配對:首先,尋找與每一個ground truth box有最大的jaccard overlap的default box,這樣就能保證每一個groundtruth box與唯一的一個default box對應起來(所謂的jaccard overlap就是IoU,如圖9)。SSD之後又將剩餘還沒有配對的default box與任意一個groundtruth box嘗試配對,只要兩者之間的jaccard overlap大於閾值,就認為match(SSD 300 閾值為0.5)。顯然配對到GT的default box就是positive,沒有配對到GT的default box就是negative。值得注意的是,一般情況下negative default boxes數量>>positive default boxes數量,直接訓練會導致網絡過於重視負樣本,從而loss不穩定。所以需要採取:所以SSD在訓練時會依據confidience score排序default box,挑選其中confidence高的box進行訓練,控制數據增廣。即對每一張image進行如下之一變換獲取一個patch進行訓練:採樣一個patch,保證與GT之間最小的IoU為:0.1,0.3,0.5,0.7 或 0.9圖10 Random crop採樣的patch佔原始圖像大小比例在之間採樣的patch的長寬比在之間當 Ground truth box中心恰好在採樣的patch中時,保留整個GT box最後每個patch被resize到固定大小,並且以0.5的概率隨機的水平翻轉其實Matching strategy,Hard negative mining,Data augmentation,都是為了加快網絡收斂而設計的。尤其是Data augmentation,翻來覆去的randomly crop,保證每一個prior box都獲得充分訓練而已。後續有Focal loss解決這個問題。SSD github :https://github.com/weiliu89/caffe/tree/ssd
SSD paper : https://arxiv.org/abs/1512.02325


!重磅!【深度學習衝鴨技術交流二群】微信交流群已成立

額外贈送福利資源!南京大學《模式識別》PPT,2020最新版《神經網絡與深度學習》中文版pdf,李航老師《統計學習方法》(第2版)課件分享,周志華《機器學習》西瓜書手推筆記(V2.8)

獲取方式:進入群後點開群公告即可領取下載連結

相關焦點

  • 目標檢測|SSD原理與實現
    前言目標檢測近年來已經取得了很重要的進展,主流的算法主要分為兩個類型(參考RefineDet):(1)two-stage方法,如R-CNN系算法,其主要思路是先通過啟發式方法(selective search)或者CNN網絡(RPN)產生一系列稀疏的候選框,然後對這些候選框進行分類與回歸,two-stage
  • 目標檢測算法之SSD
    前言昨天介紹了特徵金字塔網絡用於目標檢測,提升了多尺度目標檢測的魯棒性,今天開始講講One-Stage目標檢測算法中SSD算法。這個算法是我平時做工程中最常用到的,嚴格來說平時最常用的是Mobilenet做Backbone的SSD算法,因為要考慮到實際部署的時候的速度要求,不過原理都一樣。
  • SSD目標檢測算法精講
    年,Wei Liu等人提出了SSD算法,它是繼YOLOv1算法提出後的又一單階段目標檢測算法。為了提高檢測的精度,SSD創造性地提出了多尺度預測的目標檢測算法,使得網絡更容易適應對不同大小物體的檢測。開原始碼: https://github.com/weiliu89/caffe/tree/ssd實驗表明,SSD在VOC2007數據集上的表現,比當時一流的Faster R-CNN算法更佳。
  • SSD多盒實時目標檢測教程
    端到端目標檢測(來源:Microsoft)本文的目的是構建一個SSD多盒目標檢測技術的直觀解釋。我嘗試儘可能少地使用數學,相反,緩慢地引導你了解整個架構的原則,包括解釋多盒算法的作用。閱讀本文之後,我希望你更好地理解了SSD,並可以自行嘗試使用這一模型。
  • 目標檢測第3步-模型訓練
    1 前言開發環境:python3.6Windows10tensorflow_gpu1.10跟隨本篇文章實踐之前,需要先閱讀前置文章《目標檢測第2步-數據準備》,連結:https://www.jianshu.com/p/3d9436b4cb66現在桌面的目標檢測文件夾中需要有object_detection工程文件夾和training
  • 從RCNN到SSD,深度學習目標檢測算法盤點
    基於候選區域的目標檢測器滑動窗口檢測器自從 AlexNet 獲得 ILSVRC 2012 挑戰賽冠軍後,用 CNN 進行分類成為主流。一種用於目標檢測的暴力方法是從左到右、從上到下滑動窗口,利用分類識別目標。
  • 小白解讀SSD目標檢測(一)
    最近,一直在研究關於SSD目標檢測的論文和代碼,我想著從基礎層面去理解它,作為研究小白的我(關於這方面沒有任何專業背景,完全靠自己推),我需要儘量使用通俗的理解,於是,我決定寫一個全面細緻的解析,不僅可以加深我對SSD的理解,也希望能幫助更多的人去理解。
  • 目標檢測算法SSD結構詳解
    今天我們學習一種新的目標檢測算法SSD(Single Shot MultiBox Detector),該算法屬於One-Stage類算法範疇。首先我們先看一下One-Stage和Two-Stage類算法到底有哪些區別。
  • 基於深度學習的目標檢測算法綜述
    本文針對目前主流的目標檢測方法進行簡單的介紹,文章分為兩個部分:第一部分介紹R Girshick提出的以R-CNN為代表的結合region proposal和CNN分類的目標檢測框架(R-CNN, SPP-NET, Fast R-CNN, Faster R-CNN); 第二部分介紹以YOLO為代表的將目標檢測轉換為回歸問題的目標檢測框架(YOLO, SSD); 第三部分介紹一些最新的目標檢測算法的進展
  • 一文詳解YOLO 2與YOLO 9000目標檢測系統 | 分享總結
    目標檢測首先是目標檢測,目標檢測和圖像分類的不同是圖像分類只需要識別出圖中的物體,而目標檢測需要在圖片中精確找到物體所在位置
  • 有限數量的感受野空間會導致目標檢測的誤差減少
    有限數量的感受野空間會導致目標檢測的誤差減少。我們可以通過設計進一步的性能減少策略來減少focalloss下降的幅度,比如adam,momentum或adjustedrelu方法。有限的relu的特徵提取的能力使得層級神經網絡在現有的框架下有能力在預測下降方面取得很大的進步。相比於平均卷積,較小的類平面層擁有更小的特徵維度,以減少噪聲因素造成的影響。
  • 入門指南:用Python實現實時目標檢測(內附代碼)
    目標檢測 (ObjectDetection) 也是計算機視覺最酷的應用之一,這是不容置疑的事實。現在的CV工具能夠輕鬆地將目標檢測應用於圖片甚至是直播視頻。本文將簡單地展示如何用TensorFlow創建實時目標檢測器。
  • 目標檢測 | 清晰易懂的SSD算法原理綜述
    SSD(Single Shot Detection)是一個流行且強大的目標檢測網絡,網絡結構包含了基礎網絡(Base Network),輔助卷積層
  • 【項目實踐】從零開始學習SSD目標檢測算法訓練自己的數據集(附註釋項目代碼)
    1、SSD的知識思維腦圖2、簡介2.1、SSD出現的背景針對YOLO V1對於小目標檢測的缺陷一個死板的邊框定製,導致如果出現過於密集檢測物體時,效果就會比較差,而對於多階段檢測的方法,諸如,RCNN,Fast RCNN,Faster RCNN雖然對於小目標有比較好的檢測效果,但是由於其自身會產生很多的冗餘邊界框導致基於分類的檢測方法的檢測時間比較久
  • 「深度學習基礎」SSD之二:網絡結構及代碼實現
    01SSD結構論文:通過wx搜索「AI算法面試分享」回復「ssd」獲取輸入:300x300(512x512)Backbone:VGG16>顯著特點:利用多尺度特徵圖做檢測。圖一 ssd結構02VGG16基礎上做的修改採用VGG16做基礎模型,首先VGG16是在ILSVRC
  • 見證奇蹟 三星Magician讓SSD更加出色
    用戶可自由調整固態硬碟的op空間,並可查看smart信息、完成健康度檢查、trim優化、rapid高速模式、性能優化、固件更新、硬體信息檢索等功能,它可以提前檢測出問題,並提示用戶進行必要的操作。Magician Software既然被成為三星SSD固態硬碟優化神器,那自然會有檢測SSD寫入讀取的功能。打開Magician之後,點擊左側的Performance Benchmark,然後點擊「重新開始」即可,你的SSD寫入讀取速度一目了然。而且這一功能不僅僅針對三星SSD,對其他硬碟同樣可以進行速度測試。
  • 從零開始碼一個皮卡丘檢測器-CNN目標檢測入門教程(下)
    算法和數據集參見《從零開始碼一個皮卡丘檢測器-CNN目標檢測入門教程(上)》訓練 Train損失函數 Losses通過定義損失函數,我們可以讓網絡收斂到我們希望得到的目標檢測功能,也就是說,我們希望網絡能正確預測物體的類別,同時能預測出準確的預設框偏移量,以正確地顯示物體的真正大小和位置
  • 從RCNN到SSD,這應該是最全的一份目標檢測算法盤點
    目標檢測是很多計算機視覺任務的基礎,不論我們需要實現圖像與文字的交互還是需要識別精細類別,它都提供了可靠的信息。本文對目標檢測進行了整體回顧,第一部分從RCNN開始介紹基於候選區域的目標檢測器,包括Fast R-CNN、Faster R-CNN 和 FPN等。
  • 如何利用樹莓派實現基於深度學習的目標檢測(入門)
    今天將通過工作室陳成琳學姐的實驗,從實驗目的、實驗步驟、實驗總結為大家介紹如何利用樹莓派實現基於深度學習的目標檢測。也可以使用tensorflow object detection API實現實時目標檢測。這個api的使用網上太多教程。·使用opencv-dnn模塊一定要確保前面的opencv安裝成功,它可以直接調用tensorflow、pytorch、caffle等模型。對於初學比較友好。
  • SSD網絡tensorflow版本源碼深入分析
    anchor_steps表示的每個grid的大小,或者是感受野的大小,grid越小的感受野越大,對應只能檢測更大的對象,比如最後卷積層11層,只能檢測比較大的對象。二:生成默認框與中心位置方法ssd_anchors_all_layers生成所有層所有的默認框,代碼實現如下:def ssd_anchors_all_layers(img_shape,                           layers_shape,                           anchor_sizes,