<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          目標檢測ssd--2016

          共 6834字,需瀏覽 14分鐘

           ·

          2021-04-06 15:57

          SSD,全稱Single Shot MultiBox Detector,是Wei Liu在ECCV 2016上提出的一種目標檢測算法,截至目前是主要的檢測框架之一,相比Faster RCNN有明顯的速度優(yōu)勢,相比YOLO又有明顯的mAP優(yōu)勢(不過已經(jīng)被CVPR 2017的YOLO9000超越)。

          圖1 速度對比

          SSD具有如下主要特點:

          • 從YOLO中繼承了將detection轉化為regression的思路,一次完成目標定位與分類

          • 基于Faster RCNN中的Anchor,提出了相似的Prior box;

          • 加入基于特征金字塔(Pyramidal Feature Hierarchy)的檢測方式,即在不同感受野的feature map上預測目標

          本文接下來都以SSD 300為例進行分析。

          1 SSD300網(wǎng)絡結構

          圖2 SSD300/YOLO網(wǎng)絡結構對比

          上圖2是原論文中的SSD300與YOLO網(wǎng)絡結構圖。位什么要把SSD與YOLO對比呢?因為截止到目前目標檢測分為了2種主流框架:

          • Two stages:以Faster RCNN為代表,即RPN網(wǎng)絡先生成proposals目標定位,再對proposals進行classification+bounding box regression完成目標分類。

          • Single shot:以YOLO/SSD為代表,一次性完成classification+bounding box regression。

          那么來看同為Single shot方式的SSD/YOLO區(qū)別:

          • YOLO在卷積層后接全連接層,即檢測時只利用了最高層Feature maps(包括Faster RCNN也是如此)

          • SSD采用金字塔結構,即利用了conv4-3/conv-7/conv6-2/conv7-2/conv8_2/conv9_2這些大小不同的feature maps,在多個feature maps上同時進行softmax分類和位置回歸

          • SSD還加入了Prior box

          對比如圖3。

          圖3 單層feature map預測和特征金字塔預測對比

          2 Prior Box

          在SSD300中引入了Prior Box,實際上與Faster RCNN Anchor非常類似,就是一些目標的預選框,后續(xù)通過classification+bounding box regression獲得真實目標的位置。

          SSD按照如下規(guī)則生成prior box:

          • 以feature map上每個點的中點為中心,生成一些列同心的prior box

          • 正方形prior box最小邊長為和最大邊長為:

          • 每在prototxt設置一個aspect ratio,會生成2個長方形,長寬為:

          圖4 prior box
          • 而每個feature map對應prior box的min_size和max_size由以下公式?jīng)Q定:

          公式中的  是指進行預測時使用feature map的數(shù)量,如SSD300使用conv4-3等6個feature maps進行預測,所以  。同時原文設定 , 。

          那么:

          • 對于conv4-3:  ,  , 

          • 對于conv-7: ,  , 

          • ....

          顯然可以用上述公式推導出每個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如何產(chǎn)生,接下來分析prior box如何使用。這里還是以conv4_3分析。

          圖5

          從圖5可以看到,在conv4_3網(wǎng)絡分為了3條線路:

          1. 經(jīng)過一次batch norm+一次卷積后,生成了[1, num_class*num_priorbox, layer_height, layer_width]大小的feature用于softmax分類目標和非目標(其中num_class是目標類別,SSD300中num_class = 21,即20個類別+1個背景)

          2. 經(jīng)過一次batch norm+一次卷積后,生成了[1, 4*num_priorbox, layer_height, layer_width]大小的feature用于bounding box regression(即每個點一組[dxmin,dymin,dxmax,dymax],參考Faster R-CNN 2.5節(jié))

          3. 生成了[1, 2, 4*num_priorbox*layer_height*layer_width]大小的prior box blob,其中2個channel分別存儲prior box的4個點坐標(x1, y1, x2, y2)和對應的4個參數(shù)variance

          后續(xù)通過softmax分類判定Prior box是否包含目標,然后再通過bounding box regression即可可獲取目標的精確位置,熟悉Faster RCNN的讀者應該對上述過程應該并不陌生。其實pribox box的與Faster RCNN中的anchor非常類似,都是目標的預設框,沒有本質的差異。區(qū)別是每個位置的prior box一般是4~6個,少于Faster RCNN默認的9個anchor;同時prior box是設置在不同尺度的feature maps上的,而且大小不同。

          還有一個細節(jié)就是上面prototxt中的4個variance,這實際上是一種bounding regression中的權重。在圖4線路(2)中,網(wǎng)絡輸出[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()函數(shù)見到。

          3 SSD的數(shù)據(jù)流

          對于新學習SSD的人,肯定有一個很大的困惑,就是這么多feature maps和Prior Box,如何組合在一起進行forwards/backwards。本節(jié)專門介紹SSD的數(shù)據(jù)流動方式,也許有點難。但是只有了解SSD的數(shù)據(jù)流動方式才能真的理解。

          圖6

          上一節(jié)以conv4_3 feature map分析了如何檢測到目標的真實位置,但是SSD 300是使用包括conv4_3在內的共計6個feature maps一同檢測出最終目標的。在網(wǎng)絡運行的時候顯然不能像圖6一樣:一個feature map單獨計算一次multiclass softmax socre+box regression(雖然原理如此,但是不能如此實現(xiàn))。

          那么多個feature maps如何協(xié)同工作?這時候就要用到Permute,F(xiàn)latten和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中的數(shù)據(jù)維度。在正常情況下caffe blob的順序為:

          bottom blob = [batch_num, channel, height, width]

          經(jīng)過conv4_3_norm_mbox_conf_perm后的caffe blob為:

          top blob = [batch_num, height, width, channel]

          而Flattlen和Concat層都是caffe自帶層,請參照caffe official documentation理解。

          圖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同理。

          • 經(jīng)過一系列圖7展示的caffe blob shape變化后,最后拼接成mbox_conf和mbox_loc。而mbox_conf后接reshape,再進行softmax(為何在softmax前進行reshape,F(xiàn)aster RCNN有提及)。

          • 最后這些值輸出detection_out_layer,獲得檢測結果

          可以看到,SSD一次判斷priorbox到底是背景 or 是20種目標類別之一,相當于將Faster R-CNN的RPN與后續(xù)proposal再分類進行了整合。

          圖8 SSD300


          4 SSD網(wǎng)絡結構優(yōu)劣分析

          SSD算法的優(yōu)點應該很明顯:運行速度可以和YOLO媲美,檢測精度可以和Faster RCNN媲美。除此之外,還有一些雞毛蒜皮的優(yōu)點,不解釋了。這里談談缺點:

          1. 需要人工設置prior box的min_size,max_size和aspect_ratio值。網(wǎng)絡中prior box的基礎大小和形狀不能直接通過學習獲得,而是需要手工設置。而網(wǎng)絡中每一層feature使用的prior box大小和形狀恰好都不一樣,導致調試過程非常依賴經(jīng)驗。

          2. 雖然采用了pyramdial feature hierarchy的思路,但是對小目標的recall依然一般,并沒有達到碾壓Faster RCNN的級別。作者認為,這是由于SSD使用conv4_3低級feature去檢測小目標,而低級特征卷積層數(shù)少,存在特征提取不充分的問題。

          5 SSD訓練過程

          對于SSD,雖然paper中指出采用了所謂的“multibox loss”,但是依然可以清晰看到SSD loss分為了confidence loss和location loss(bouding box regression loss)兩部分,其中N是match到GT(Ground Truth)的prior box數(shù)量;而α參數(shù)用于調整confidence loss和location loss之間的比例,默認α=1。SSD中的confidence loss是典型的softmax loss:

          其中

          代表第i個prior box匹配到了第j個class為p類別的GT box;而location loss是典型的smooth L1 loss:

          Matching strategy:

          在訓練時,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。

          圖9 jaccard overlap

          Hard negative mining:

          值得注意的是,一般情況下negative default boxes數(shù)量>>positive default boxes數(shù)量,直接訓練會導致網(wǎng)絡過于重視負樣本,從而loss不穩(wěn)定。所以需要采取:

          • 所以SSD在訓練時會依據(jù)confidience score排序default box,挑選其中confidence高的box進行訓練,控制 

          Data augmentation:

          數(shù)據(jù)增廣。即對每一張image進行如下之一變換獲取一個patch進行訓練:

          • 直接使用原始的圖像(即不進行變換)

          • 采樣一個patch,保證與GT之間最小的IoU為:0.1,0.3,0.5,0.7 或 0.9

          • 完全隨機的采樣一個patch

          圖10 Random crop

          同時在原文中還提到:

          • 采樣的patch占原始圖像大小比例在  之間

          • 采樣的patch的長寬比在  之間

          • 當 Ground truth box中心恰好在采樣的patch中時,保留整個GT box

          • 最后每個patch被resize到固定大小,并且以0.5的概率隨機的水平翻轉

          最終以這些處理好的patches進行訓練。

          其實Matching strategy,Hard negative mining,Data augmentation,都是為了加快網(wǎng)絡收斂而設計的。尤其是Data augmentation,翻來覆去的randomly crop,保證每一個prior box都獲得充分訓練而已。后續(xù)有Focal loss解決這個問題。


          瀏覽 53
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  韩国在线不卡 | 91吴梦梦 | 无码日韩中文字幕豆花 | 精品久久久久久久久久久久 | 日本素人在线影视 |