目標檢測之SSD

提示:文章寫完後,目錄可以自動生成,如何生成可參考右邊的幫助文檔


一、前言

目標檢測近年來已經取得了很重要的進展,主流的算法主要分爲兩個類型(參考RefineDet):
(1)two-stage方法
如R-CNN系算法,其主要思路是先通過啓發式方法(selective search)或者CNN網絡(RPN)產生一系列稀疏的候選框,然後對這些候選框進行分類與迴歸,two-stage方法的優勢是準確度高;
(2)one-stage方法
如Yolo和SSD,其主要思路是均勻地在圖片的不同位置進行密集抽樣,抽樣時可以採用不同尺度和長寬比,然後利用CNN提取特徵後直接進行分類與迴歸,整個過程只需要一步,所以其優勢是速度快,但是均勻的密集採樣的一個重要缺點是訓練比較困難,這主要是因爲正樣本與負樣本(背景)極其不均衡(參見Focal Loss),導致模型準確度稍低。不同算法的性能如下圖所示,可以看到兩類方法在準確度和速度上的差異。

在這裏插入圖片描述


二、SSD(Single Shot MultiBox Detector)

SSD相對於YOLO的優勢:

一、是SSD提取了不同尺度的特徵圖來做檢測,大尺度特徵圖(較靠前的特徵圖)可以用來檢測小物體,而小尺度特徵圖(較靠後的特徵圖)用來檢測大物體;
二、是SSD採用了不同尺度和長寬比的先驗框(Prior boxes, Default boxes,在Faster R-CNN中叫做錨,Anchors)。Yolo算法缺點是難以檢測小目標,而且定位不準,但是這幾點重要改進使得SSD在一定程度上克服這些缺點。
基本架構如下:
在這裏插入圖片描述
在Yolo中,每個單元預測多個邊界框,但是其都是相對這個單元本身(正方塊),但是真實目標的形狀是多變的,Yolo需要在訓練過程中自適應目標的形狀。而SSD借鑑了Faster R-CNN中anchor的理念,每個單元設置尺度或者長寬比不同的先驗框,預測的邊界框(bounding boxes)是以這些先驗框爲基準的,在一定程度上減少訓練難度。一般情況下,每個單元會設置多個先驗框,其尺度和長寬比存在差異,如下圖所示,可以看到每個單元使用了4個不同的先驗框,圖片中貓和狗分別採用最適合它們形狀的先驗框來進行訓練,後面會詳細講解訓練過程中的先驗框匹配原則。

在這裏插入圖片描述

對於每個單元的每個先驗框,其都輸出一套獨立的檢測值,對應一個邊界框,主要分爲兩個部分。
第一部分是各個類別的置信度或者評分,值得注意的是SSD將背景也當做了一個特殊的類別,如果檢測目標共有 c 個類別,SSD其實需要預測 c+1 個置信度值,其中第一個置信度指的是不含目標或者屬於背景的評分。後面當我們說 c 個類別置信度時,請記住裏面包含背景那個特殊的類別,即真實的檢測類別只有 c-1 個。在預測過程中,置信度最高的那個類別就是邊界框所屬的類別,特別地,當第一個置信度值最高時,表示邊界框中並不包含目標。
第二部分就是邊界框的location,包含4個值 (cx, cy, w, h) ,分別表示邊界框的中心座標以及寬高。但是真實預測值其實只是邊界框相對於先驗框的轉換值:
先驗框位置用 d=(d cx , d cy , d w ,d h ) 表示,其對應邊界框用 b=(b cx , b cy , b w ,b h ) 表示,那麼邊界框的預測值 l 其實是 b 相對於 d 的轉換值
在這裏插入圖片描述
習慣上,我們稱上面這個過程爲邊界框的編碼(encode),預測時,你需要反向這個過程,即進行解碼(decode),從預測值 l 中得到邊界框的真實位置 b :
在這裏插入圖片描述
綜上所述,對於一個大小 m×n×c 的特徵圖m×n×c 分別寬高通道數,每個像素生成先驗框數目記爲 k×anchor,需要 k×4個3×3×c 的 卷積核來預測每個先驗框的座標;需要 k*(C+1)個33c的卷積核來預測每個先驗框的類別。


三、SSD訓練過程

膨脹卷積:

在上面的SSD基本結構圖中可以看出,SSD採用VGG16做基礎模型,首先VGG16是在ILSVRC CLS-LOC數據集預訓練。將VGG16的
全連接層fc6和fc7轉換成 33 卷積層 conv6和 11 卷積層conv7,同時將池化層pool5由原來的變成(猜想是不想reduce特徵圖大小),爲了配合這種變化,採用了一種膨脹卷積神經網絡,其實就是conv6採用擴展卷積或帶孔卷積(Dilation Conv),其在不增加參數與模型複雜度的條件下指數級擴大卷積的視野,其使用擴張率(dilation rate)參數,來表示擴張的大小,如下圖所示,(a)是普通的 3 3卷積,其視野就是 3 3 ,(b)是擴張率爲1,此時視野變成 77 ,©擴張率爲3時,視野擴大爲 1515 ,但是視野的特徵更稀疏了。Conv6採用 3 *3大小但dilation rate=6的擴展卷積。然後移除dropout層和fc8層,並新增一系列卷積層,在檢測數據集上做finetuing。
在這裏插入圖片描述
訓練過程

(1)先驗框匹配

第一個原則:一個先驗框只能匹配一個ground truth,如果多個ground truth與某個先驗框 IOU大於閾值,那麼先驗框只與IOU最大的那個先驗框進行匹配。
第二個原則一定在第一個原則之後進行,仔細考慮一下這種情況,如果某個ground truth所對應最大 IOU小於閾值,並且所匹配的先驗框卻與外一個ground truth的 IOU 大於閾值,那麼該先驗框應該匹配誰,答案應該是前者,首先要確保某個ground truth一定有一個先驗框與之匹配。但是,這種情況我覺得基本上是不存在的。由於先驗框很多,某個ground truth的最大 IOU}肯定大於閾值,所以可能只實施第二個原則既可以了,TensorFlow版本就是隻實施了第二個原則。下圖爲一個匹配示意圖,其中綠色的GT是ground truth,紅色爲先驗框,FP表示負樣本,TP表示正樣本。
在這裏插入圖片描述
儘管一個ground truth可以與多個先驗框匹配,但是ground truth相對先驗框還是太少了,所以負樣本相對正樣本會很多。爲了保證正負樣本儘量平衡,SSD採用了hard negative mining,就是對負樣本進行抽樣,抽樣時按照置信度誤差(預測背景的置信度越小,誤差越大)進行降序排列,選取誤差的較大的top-k作爲訓練的負樣本,以保證正負樣本比例接近1:3。

(2)損失函數

訓練樣本確定了,然後就是損失函數了。損失函數定義爲位置誤差(locatization loss, loc)與置信度誤差(confidence loss, conf)的加權和:
在這裏插入圖片描述
在這裏插入圖片描述
(3)數據擴增

採用數據擴增(Data Augmentation)可以提升SSD的性能,主要採用的技術有水平翻轉(horizontal flip),隨機裁剪加顏色扭曲(random crop & color distortion),隨機採集塊域(Randomly sample a patch)(獲取小目標訓練樣本),如下圖所示:
在這裏插入圖片描述


四、SSD預測過程

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

性能評估
SSD與其它檢測算法的對比結果(在VOC2007數據集)如表所示,基本可以看到,SSD與Faster R-CNN有同樣的準確度,並且與Yolo具有同樣較快地檢測速度。
在這裏插入圖片描述