SSD算法結構 SSD算法理論 目標檢測 宗師級全解


SingleShotMultiBoxDetector(SSD,單步多框目標檢測)
————————————————————————————————————————————————
前言:哈哈,有多少人被標題引誘來的?不過我確實把料下足了,想徹底了解SSD理論的朋友,請你沉下心來看,估計底子好的人要看半小時到一小時左右。這篇隨筆,我寫了三個小時多,SSD本身結構不復雜,奈何涉及的細節與知識范圍有些多,這篇隨筆的全部內容對於SSD來說,都缺之不可,耐心通讀本篇,SSD的原理,你就能完全掌握了,寫的我累死了。。。SSD效果與YOLO V3只是略遜一點點,但是結構很簡單明了
 
開篇簡短概括SSD的特點:
•One-Stage
•均勻的密集抽樣
•Priorboxes/Defaultboxes(Anchorboxes)
•不同尺度抽樣•不同scale尺度的特征圖抽樣
•對於小目標檢測效果不錯
•預測速度快
•訓練困難(正負樣本極度不均衡)
下圖為一些 網絡結構的效率對比圖,坦率來說, map達到75%到80%就可以了

來看一下和其他的算法的對比圖

 其主干網絡為做了一些改動的VGG net

下圖為SSD的詳細結構圖:

 

 

 上圖補充說明:第一張特

征圖進行預測后,大小不變還是38*38,深度變成了(4*classes+4),即100,這上面的每一個1*1*100,對應的是一個錨點的預測值。在深度上來說,每25個深度對應的是一個錨點框,繼續分解,那么這25個深度,前20個深度是預測屬於某一個類別的概率,第21個是預測為背景的概率,后面4個深度是其坐標信息和寬高的預測,即xywh。

  然后繼續用3*3*1024的卷積核下采樣得到conv6,原來是fc6層,這一層沒有做預測的操作。

  然后用1*1*1024的卷積核卷了一下,形狀依然是19*19*1024的特征圖,然后現在是19*19個錨點,此時每個點設置的是有6個錨點框

  后面如圖同樣的步驟。箭頭上沒有寫卷積方式的都是同上一條箭頭的卷積方式

如圖,一共有6張不同尺度的特征圖進行預測得到預測值,一共6層,原圖映射到38*38大小,19*19大小.....,然后去跟它們各層的錨框去計算重合不重合(GIOU或者IOU),大於0.5的判斷為正例,小於0.5的判斷為負例。 

上面總結好了,下面來分析一下它的特點:

一,重用了faster rcnn的錨點框機制

在featuremap上提取各種不同尺度大小的defaultbox,也就是類似Anchor的一系列大小固定的框。不同featuremap上尺度是一樣的。
 
 

二,為什么要這樣多尺度特征圖預測?

  因為小物體在感受野小的大特征圖上容易檢測目標,反之,小的特征圖,它的感受野大,檢測大物體有利。

 

上圖舉了個某一層特征圖的例子,該層每個錨點設置4個錨點框,loc為坐標偏移值,conf為類別的置信度,所以針對於每個錨框會得到20+1+4個預測值

三,全卷積網絡結構(Convolutionalpredictorsfordetection)
•結合RFCN網絡的優點,將所有的全連接網絡全部更改為全卷積網絡結構。
•使用卷積來提取候選框特征(offsetbox+score)。
 
特別注意:當你設置的特征圖上的錨點還原到原圖上的時候,要以特征圖上的錨點的坐標*下采樣的倍數+下采樣的倍數/2,這樣是為了防止你的錨點的坐標如果是(0,0),直接*下采樣倍數還是(0,0)
下圖是關於 錨點和錨點框的計算

 

 我把開局第一張圖分成了三部分,如圖

 

 接下來說一說基於VGG網絡做的具體的改動:

1.基礎網絡結構使用VGG,並且將FC6Layer和FC7Layer轉換為卷積層,並將原來的MaxPooling5的大小從2x2-s2變化為3x3-s1(沒有像原來一樣做下采樣,這樣相當於做了一個特征的融合),這樣pooling5操作后featuremap還是保持較大的尺寸,這樣就會導致之后的感受野變小,也就是一個點對應到原始圖形中的區域變小了。
2.為了保障感受野以及利用到原來的FC6和FC7的模型參數,使用atrousalgorithm的方式來增大感受野,也就是膨脹卷積/空洞卷積。(上圖中fc6到fc7做了膨脹卷積)
膨脹卷積:為了增大感受野,但是又不想增加參數量時,在卷積核內部填充0,即可達到目的,如下圖。但是會有一些信息損失。
膨脹卷積核尺寸=膨脹系數*(原始卷積核尺寸-1)+1
•Conv6(fc6)中卷積核kernel為3,pad為6,dilation為6,所以相當於真實的卷積核大小為13,pad為6是為了保障輸出featuremap大小尺度不變,仍為19x19。
•膨脹卷積(DilatedConvolution)的存在是為了解決一下幾個問題的:
•普通的數據上采樣層參數不可學習;
•內部數據結構丟失,空間層級化信息丟失;
•小物體信息無法重建。
•TensorFlow中膨脹卷積/空洞卷積API:•tf.nn.atrous_conv2d(value,filters,rate,padding,name=None)
一些提取框框的解說:
•在基礎網絡之后,使用不同層次卷積的featuremap來分別提取defaultbox,對於每個layer的featuremap使用兩個並行的3x3卷積分別來提取位置信息(offsetbox)和置信度信息;結合Defaultbox和GroundTruthbox構建損失函數。
•對於Con4_3的數據提取的時候,會先對featuremap做一個L2 norm的操作(在進行3*3卷積進行預測前),因為層次比較靠前,防止出現數據值過大的情況。

 

在CNN網絡中,層次越深,featuremap的尺寸(size)會越來越小,這樣設計主要是為了以下兩個目的:
•減少計算與內存的需求;
•最終提取的featuremap在某種程度上具備平移和尺度不變性,契合分類的業務場景要求。
•在目標檢測場景中,經常需要處理不同尺度的物體,在某些網絡中,會通過將圖像轉換為不同尺度大小的圖像獨立的通過網絡處理,然后將這些不同尺度的圖像結果合並,但是實際上,在同一個網絡中,對不同層次上的featuremaps進行特征的處理實際上效果是一樣的,並且所有尺度的物體處理參數是共享的,計算會更快。
 
一些結構的細節: 
SSD結構中,defaultboxes不需要和每一層layer的receptivefields對應,通過產生不同scale大小的boxes來負責圖像中特定區域以及物體的特定尺寸。
  下面我們來談一談先驗框的大小是如何計算的:
在提取先驗框的時候,主要 通過尺度(大小)和長寬比兩個方面來進行設置,其中在先驗框尺度上遵守一個線性遞增規則: 隨着特征圖大小降低,先驗框尺度線性增加。

 

 對應到我們這里就是下圖,這五層的先驗框的大小相對於原圖的比例是從0.2到0.9不等

 下圖是該網絡計算好的先驗框大小:

 

 計算好大小后還要計算它們的寬高的比例:


在提取先驗框的時候,主要通過尺度(大小)和長寬比兩個方面來進行設置,在長寬比上,論文中建議比率值選擇范圍為:[1,2,3,1/2,1/3]。對於Conv4-3、Conv10-2以及Conv11-2這三層,由於僅使用4個先驗框,不使用1:3和3:1的這個比例值。

 

 除了使用上述5個長寬比外,還引入一個特殊尺度並且長寬比為1的先驗框。引入這個框的主要目的是為了體現最終的候選框中出現兩個長寬比為1但是大小不同的正方形先驗框。

 

 

 最后計算得到所有的先驗框大小:

 來看一下正負樣本的組成:

HardNegativeMining(難負樣本挖掘):

•在生成先驗框后,會產生很多符合GroundTruthBox的先驗框,但是不符合的邊框會更多,也就是negativeboxes的數目遠多於positiveboxes的數目,也就會導致數據之間極度不均衡的情況出現,訓練的時候比較難收斂。故在SSD中,采用R-CNN中介紹的難負樣本挖掘算法對數據進行處理。將每個物體位置上對應的defaultboxes是negative的boxes按照前向loss的大小進行排序,獲取loss比較大的N個negativeboxes參與模型訓練,最終保證正負樣本比例在1:3左右。
然后還做了 數據增強:
•水平翻轉(HorizontalFlip)
•隨機剪裁加顏色扭曲(RandomCrop&ColorDistortion)
•隨機采集塊域(Randomlysampleapath)
訓練數據類別給定標准:
•正樣本:若先驗框和GroundTruth框匹配,那么認為當前先驗框為正樣本;
•負樣本:若先驗框和所有GroundTruth框都不匹配,那么認為當前先驗框為負樣本。
•NOTE:采用hardnegativemining(難負樣本挖掘算法)選擇loss大的樣本作為負樣本,正負樣本比例1:3;
SSD的先驗框與GroundTruth的匹配原則主要有幾點:
•1.對於圖片中每個GroundTruth,找到與其IoU最大的先驗框,該先驗框與其匹配,
•2.對於剩余的未匹配先驗框,若其和某個GroundTruth的IoU大於某個閾值(一般是0.5),那么該先驗框也與這個GroundTruth(選擇最大IoU的GT框)進行匹配。這意味着某個GroundTruth可能與多個先驗框匹配,這是可以的。
•3.如果某個先驗框和多個GroundTruth的IoU值大於閾值或者是最大IoU的先驗框,那么這個先驗框僅和IoU最大的那個GroundTruth匹配。
終於寫到最后了...

 

 最后,是激動人心的損失函數:
在SSD中,損失函數被定義為位置誤差(locatizationloss,loc)與置信度誤差(confidenceloss,conf)的加權和

 

 

 

 

 預測過程比較簡單:

對於每個預測框,首先根據類別置信度確定其類別(置信度最大者)與置信度值,並過濾掉屬於背景的預測框。然后根據置信度閾值(如0.5)過濾掉閾值較低的預測框。對於留下的預測框進行解碼,根據DefaultBox先驗框+offsetbox偏移量預測值做線性轉換得到其真實的位置參數(解碼后一般還需要做clip,防止預測框位置超出圖片)。解碼之后,一般需要根據置信度進行降序排列,然后 僅保留top-k(如400)個預測框。最后就是進行NMS算法,過濾掉那些重疊度較大的預測框。最后剩余的預測框就是檢測結果了。

 最后一張與faster rcnn的效果對比圖結束本場解說:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM