前言
上一篇我們說到YOLO将候選框提取與分類統一為一個回歸問題,相對于R-CNN系列的"看兩眼",YOLO隻需要Look Once。
YOLO簡潔且速度快,但是YOLO難以檢測小目标,而且定位不準。相比YOLO,SSD采用CNN來直接進行檢測,而不是像YOLO那樣在全連接配接層之後做檢測。另外SSD提取了不同尺度的特征圖來做檢測,大尺度特征圖可以用來檢測小物體,而小尺度特征圖用來檢測大物體;再由SSD采用了不同尺度和長寬比的先驗框Prior boxes,在Faster R-CNN中叫做錨Anchors。這幾點重要改進使得SSD在一定程度上克服這些缺點。
論文名稱:
SSD: Single Shot MultiBox Detector論文下載下傳:
https://arxiv.org/pdf/1611.10012.pdfarxiv.org
論文解讀:
SSD網絡結構
SSD和YOLO都是采用一個CNN網絡來進行檢測,但是卻采用了多尺度的特征圖,其基本架構如上圖所示。下面将SSD核心設計理念總結為以下三點:
1 采用多尺度特征圖用于檢測不同尺度的特征圖
所謂多尺度采用大小不同的特征圖,CNN網絡一般前面的特征圖比較大,後面會逐漸采用stride=2的卷積或者pool來降低特征圖大小。如上圖所示,一個比較大的特征圖和一個比較小的特征圖,它們都用來做檢測。這樣做的好處是比較大的特征圖來用來檢測相對較小的目标,而小的特征圖負責檢測大目标,8x8的特征圖可以劃分更多的單元,但是其每個單元的先驗框尺度比較小。
2 采用卷積進行檢測與YOLO最後采用全連接配接層不同,SSD直接采用卷積對不同的特征圖來進行提取檢測結果。對于形狀為m×n×p的特征圖,隻需要采用3×3×p這樣比較小的卷積核得到檢測值。
3 設定先驗框在YOLO中,每個單元預測多個邊界框,但是其都是相對這個單元本身,然而真實目标的形狀是多變的,YOLO需要在訓練過程中自适應目标的形狀。而SSD借鑒了Faster R-CNN中anchor的理念,每個單元設定尺度或者長寬比不同的先驗框,預測的邊界框bounding boxes是以這些先驗框為基準的,在一定程度上減少訓練難度。一般情況下,每個單元會設定多個先驗框,其尺度和長寬比存在差異,如下圖所示,可以看到每個單元使用了4個不同的先驗框,圖檔中貓和狗分别采用最适合它們形狀的先驗框來進行訓練。
SSD的先驗框
網絡結構
SSD采用VGG16作為基礎模型,然後在VGG16的基礎上新增了卷積層來獲得更多的特征圖以用于檢測。SSD的網絡結構如下圖所示。上面是SSD模型,下面是Yolo模型,可以明顯看到SSD利用了多尺度的特征圖做檢測。模型的輸入圖檔大小是300×300。
SSD網絡結構
采用VGG16做基礎模型,首先VGG16是在ILSVRC CLS-LOC資料集預訓練。然後借鑒了DeepLab-LargeFOV,分别将VGG16的全連接配接層fc6和fc7轉換成3×3卷積層 conv6和1×1卷積層conv7,同時将池化層pool5由原來的stride=2的2×2變成stride=1的3×3。為了配合這種變化,采用了一種Atrous Algorithm,其實就是conv6采用擴充卷積或帶孔卷積Dilation Conv,其在不增加參數與模型複雜度的條件下指數級擴大卷積的視野,其使用擴張率dilation rate參數,來表示擴張的大小,如下圖所示,(a)是普通的3×3卷積,其視野就是3×3,(b)是擴張率為2,此時視野變成7×7,(c)擴張率為4時,視野擴大為15×15,但是視野的特征更稀疏了。Conv6采用3×3大小但dilation rate=6的擴充卷積。
然後移除dropout層和fc8層,并新增一系列卷積層,在檢測資料集上做finetuing。
訓練過程
1 先驗框比對在訓練過程中,首先要确定訓練圖檔中的ground truth與哪個先驗框來進行比對,與之比對的先驗框所對應的邊界框将負責預測它。在YOLO中,ground truth的中心落在哪個單元格,該單元格中與其IOU最大的邊界框負責預測它。但是在SSD中卻完全不一樣,SSD的先驗框與ground truth的比對原則主要有兩點:
- 首先,對于圖檔中每個ground truth,找到與其IOU最大的先驗框,該先驗框與其比對,這樣,可以保證每個ground truth一定與某個先驗框比對。通常稱與ground truth比對的先驗框為正樣本,反之,若一個先驗框沒有與任何ground truth進行比對,那麼該先驗框隻能與背景比對,就是負樣本。
- 其次,對于剩餘的未比對先驗框,若某個ground truth的IOU大于某個門檻值,那麼該先驗框也與這個ground truth進行比對。這意味着某個ground truth可能與多個先驗框比對,這是可以的。但是反過來卻不可以,因為一個先驗框隻能比對一個ground truth,如果多個ground truth與某個先驗框IOU大于門檻值,那麼先驗框隻與IOU最大的那個ground truth進行比對。
下圖為一個比對示意圖,其中綠色的GT是ground truth,紅色為先驗框,FP表示負樣本,TP表示正樣本。
先驗框比對示意圖
盡管一個ground truth可以與多個先驗框比對,但是ground truth相對先驗框還是太少了,是以負樣本相對正樣本會很多。為了保證正負樣本盡量平衡,SSD采用了hard negative mining,就是對負樣本進行抽樣,抽樣時按照置信度誤差(預測背景的置信度越小,誤差越大)進行降序排列,選取誤差的較大的top-k作為訓練的負樣本,以保證正負樣本比例接近1:3。
2 損失函數損失函數定義為位置誤差locatization loss與置信度誤差confidence loss的權重和:
其中
是先驗框的正樣本數量。這裡
為一個訓示參數,當
時表示第
個先驗框與第
個ground truth比對,并且ground truth的類别為
。
為類别置信度預測值。
為先驗框的所對應邊界框的位置預測值,而
是ground truth的位置參數。對于位置誤差,其采用Smooth L1 loss,定義如下:
由于
的存在,是以位置誤差僅針對正樣本進行計算。值得注意的是,要先對ground truth的
進行編碼得到
,因為預測值
也是編碼值,若設定variance_encoded_in_target=True,編碼時要加上variance:
對于置信度誤差,其采用softmax loss:
權重系數
通過交叉驗證設定為1。
3 資料增強采用資料增強Data Augmentation可以提升SSD的性能,主要采用的技術有水準翻轉(horizontal flip),随機裁剪加顔色扭曲(random crop & color distortion),随機采集塊域(Randomly sample a patch)(擷取小目标訓練樣本),如下圖所示:
資料擴增方案
預測過程
預測過程比較簡單,對于每個預測框,首先根據類别置信度确定其類别(置信度最大者)與置信度值,并過濾掉屬于背景的預測框。然後根據置信度門檻值(如0.5)過濾掉門檻值較低的預測框。對于留下的預測框進行解碼,根據先驗框得到其真實的位置參數(解碼後一般還需要做clip,防止預測框位置超出圖檔)。解碼之後,一般需要根據置信度進行降序排列,然後僅保留top-k(如400)個預測框。最後就是進行NMS算法,過濾掉那些重疊度較大的預測框。最後剩餘的預測框就是檢測結果了。
優缺點
SSD在Yolo的基礎上主要改進了三點:多尺度特征圖,利用卷積進行檢測,設定先驗框。這使得SSD在準确度上比YOLO更好,而且對于小目标檢測效果也相對好一點。
小目标往往更依賴淺層特征,因為淺層特征有更高的分辨率,然而對語義區分較差。SSD檢測和分類一起做,會把一些檢測到但是分類模糊,分數不高的結果過濾掉。是以對于小目标檢測效果雖然比YOLO好,但是還是有缺陷。
參考
小小将:目标檢測|SSD原理與實作zhuanlan.zhihu.com
為什麼SSD(Single Shot MultiBox Detector)對小目标的檢測效果不好?www.zhihu.com