天天看點

Object Detection:One-stage Detector SSD

繼上一篇文章Object Detection: One-stage Detector DenseBox,我們了解到一種類似于分割的訓練風格(segmentation-like training procedure),通過真值生成(Ground Truth Generation),來引導模型對人臉、汽車等目标的檢測。單階段模型常常遇到的一個問題就是樣本平衡(Sample Balance),DenseBox給出了相應的解決思路,如設定忽視區域(Ignoring Grey zone),難例挖掘(Hard negative mining),随機截取(Random Crop)等方式。當然,該模型還有一個亮點在于采用多任務訓練的方式,不僅包括檢測框分類與定位分支,還加入了關鍵點定位分支(Landmark localization)來顯式(explicit)、隐式(implicit)地調整(refine)模型的檢測結果。下面,要給大家帶來的是極具裡程碑意義的單階段目标檢測器系列的第三篇,SSD。

YOLO -> DenseBox -> SSD -> YOLO v2 -> Retina -> YOLO v3 -> CornerNet -> CenterNet -> AlignDet

SSD: Single Shot MultiBox Detector

論文位址:1512.0232

1. 背景介紹

從解耦(disentangle)的角度,兩階段檢測器在解決目标檢測問題上有了較好的诠釋。以Faster-RCNN為例,首先使用區域提議生成網絡(Region Proposal Network, RPN)生成可能包含目标的區域,這一過程包括區域提議的生成(hypothesize bounding boxes),特征/像素重采樣(feature/pixel resample),檢測框回歸(bounding box regression);接着選用高品質的分類器(high quality classification)對生成的區域提議(proposals)進行分類,同時進行二次檢測框回歸,得到最終的檢測結果。得益于其較好的性能表現,遵循這種模式(pipeline)的檢測器在當時目标檢測的基準資料集(benchmarks)上非常火熱,如PASCAL VOC,COCO,和 ILSVRC detection。然而,由于兩階段模型存在大量計算(computationally intensive),在實時應用(real-time application)上的速度可能達不到預期。

雖然有許多工作緻力于提升兩階段模型的檢測速度,但是最終的結果是通過犧牲精度的方式,沒有很好的做到速度與精度的權衡(trade-off)。是以作者提出SSD(single shot detector),通過撤去(eliminate)區域提議生成與特征重采樣,來提升模型的檢測速度,同時通過其它手段,例如使用更小的卷積核,使用不同尺度的特征分别預測不同尺寸的目标,來確定模型的檢測性能。(原文連結1)

原文連結1: Our improvement include using a small convolutional filter to predict object categories and offsets in bounding box locations, using separate predictors (filters) for different aspect ratio detections, and applying these filters to multiple feature maps from the later stages of a network in order to perform detection at multiple scales.With these modifications — especially using multiple layers for prediction at different scales — we can achieve high-accuracy using relative low resolution input, further increasing detection speed.

最終,論文的貢獻如下:

  • 達到單階段檢測模型最佳性能(state-of-the-art,SOTA),同時也不弱于耗時較大但準确率較高的兩階段檢測模型
  • SSD的核心是使用小卷積核去預測預設設定好的檢測框(a fixed set of default bounding boxes)的類别分數及檢測框偏移(offset)
  • 使用多個尺度的特征圖去檢測多個尺度的目标,如使用淺層的特征圖去檢測小尺度目标,用深層的特征圖去檢測大尺度目标
  • SSD的這種設計不僅能夠端到端訓練(end-to-end),尤其輸入低分辨率圖檔,還能保持較高的性能表現,進一步改善了速度與準确度之間的權衡
  • 通過大量實驗對輸入不同大小圖檔的預測時間(timing)和準确率(accuracy)進行分析,并與過去SOTA方法進行對比。

(補充:這篇論文的第四部分Related Work 總結的不錯,有興趣的可以看看,有助于了解當時SSD提出時的背景~)

2. 模型介紹

作者在論文的摘要中,非常簡練的概括了SSD的思想:SSD通過給不同層的特征圖的每個位置設定不同尺寸(scale),不同長寬比(ratio)的固定檢測框(用Faster-RCNN的說法就是anchor),以将輸出空間(output space)進行離散化(discretize)。在預測階段,SSD為每個固定檢測框生成對應的類别分數,并生成檢測框偏移(offset)使得檢測框能夠更好的比對(match)目标。不僅如此,SSD還為不同尺寸的目标訓練不同的檢測器,使得模型能夠充分利用各層的特征。(原文連結2)

原文連結2: Our approach, named SSD, discretizes the output space of per feature map location. At prediction time, the network generates scores for the presence of each object category in each default box and produces adjustments to the box to better match the object shape. Additionally, the network combines predictions from multiple feature maps with different resolutions to naturally handle objects of various sizes.

下面我們來詳細介紹SSD模型。

2.1 SSD的核心思想

Object Detection:One-stage Detector SSD

上圖便是SSD的核心思想:圖a展示了訓練SSD所需要的輸入:輸入的圖像以及目标的标注(ground truth boxes)。圖b、c 展示了SSD為不同尺寸的特征圖的每一個位置設定不同尺寸與長寬比的先驗框(anchors)。圖c展示了SSD為每個先驗框作出的預測:所有類别的置信度(confidence) ( c 1 , c 2 , . . . , c p ) (c_1, c_2, ..., c_p) (c1​,c2​,...,cp​),邊框偏移(shape offset) △ ( c x , c y , w , h ) \triangle(cx, cy, w, h) △(cx,cy,w,h)。在訓練的過程中,首先需要将這些先驗框與标注的檢測框進行比對:圖b的兩個藍色先驗框與圖a藍色标注的檢測框比對,圖c的紅色先驗框與圖a紅色标注的檢測框比對。比對的先驗框定義為正樣本(positive),對于沒有比對成功的檢測框,則定義為負樣本(negative)。在預測過程中,需要采取非極大值抑制(non-maximum suppression, NMS)篩選得到最後的結果。整個模型的損失(loss)是定位損失(Smooth L1)與置信度損失(Softmax)的權重和。

2.2 網絡設計

模型可大緻分為:骨幹網絡(backbone/base network),輔助結構(auxiliary)。

Object Detection:One-stage Detector SSD
  • 基準/骨幹網絡 (base Network / backbone)

    基于VGG-16,在ILSVRC CLS-LOC 資料集上預訓練,作者将VGG-16的全連接配接層FC_6 (FC-4096) 和 FC_7 (FC-4096) 轉化成3x3的卷積層Conv_6 和 1x1的Conv_7,同時将Pool_5 (FC_6前的maxpool) 從原來2x2-s2變成3x3-s1 (核的大小由2變3,步長由2變1)。為了保持特征圖不變小的情況下仍能有下采樣後的感受野,Conv_6采用了一種Atrous Algorithm,簡單來說就是采用了空洞卷積 (Dilation Conv),在不增加參數與模型複雜度的條件下指數級擴大卷積的視野。空洞卷積使用擴張率(dilation rate)參數來表示擴張的大小,如下圖所示(圖自小小将)。最後再移除dropout層和全連接配接層FC_8,構成基準網絡。模型使用初始學習率為 1 0 − 3 10^{-3} 10−3進行随機梯度下降(SGD),動量(momentum)為0.9, 權重衰減系數(weight decay)是0.0005,批大小(batch-size)是32。不同資料集使用的學習率衰減不一樣,詳見實驗部分。

Object Detection:One-stage Detector SSD

下面來看輔助結構,也就是下圖中Extra Feature Layers部分:

Object Detection:One-stage Detector SSD
  • 新添加的卷積層采用xavier的方式進行初始化 。Conv4_3作為用于檢測的第一個特征圖,由于該層靠前,特征圖上特征值的範圍與其它檢測層的差異較大,是以在後面添加了一個L2 歸一化層(Normalization Layer)對每個像素點在channel次元做歸一化,以確定該層和後面層的差異不會太大。歸一化後一般設定一個可訓練的放縮變量gamma(l2_norm*gamma)。
  • 使用了多個尺度的特征圖進行預測:從上圖可以得知,SSD300(輸入圖檔大小為300x300) 使用了Conv4_3 (38x38)、Conv7 (19x19)、Conv8_2 (10x10)、Conv9_2 (5x5)、Conv10_2 (3x3)、Conv11_2 (1x1)的特征圖對不同長寬比和尺寸的目标分别預測,即相當于訓練了多個檢測器。SSD512(輸入圖檔大小為512x512)在上圖的基礎上額外增加了Conv12_2進行預測。
  • 使用小卷積核生成每個位置的預測結果(置信度與偏移):假設特征圖的尺寸為 m ∗ n ∗ p m*n*p m∗n∗p,則卷積核的尺寸為 3 ∗ 3 ∗ p 3*3*p 3∗3∗p,每個卷積核分别負責輸出一個置信度或者一個邊框偏移變量。正是因為這種卷積預測的方式,卷積核在每個位置上的輸出都是與該位置的先驗框相關的(原文連結3),是以可以輸出各個先驗框對應的置信度以及邊框偏移。下圖可視化了該過程(圖來自小小将)。
    Object Detection:One-stage Detector SSD
  • 先驗框的設定:SSD為Conv4_3、Conv7、Conv8_2、Conv9_2、Conv10_2、Conv11_2這些層的特征圖的每一個位置(cell)設定了一組先驗框,這組框可由尺寸(scale)與長寬比(ratio)計算出來,而不同層的尺寸範圍是不一樣的。假設為特征圖每個單元設定 k k k個先驗框,則每個單元需要 ( c + 4 ) k (c+4)k (c+4)k個卷積核,則 m ∗ n m*n m∗n的特征圖的輸出為 m ∗ n ∗ ( c + 4 ) k m*n*(c+4)k m∗n∗(c+4)k。這些先驗框與Faster-RCNN中的anchor非常相似,隻不過在SSD中用到了多個尺度的特征圖上。正因為有了在多尺度特征圖上設定不同尺度的先驗框,使得SSD可以高效的将模型的輸出空間離散化成經過修正的先驗框。
原文連結3: The default boxes tile the feature map in a convolutional manner, so that the position of each box relative to its corresponding cell is fixed.

2.3 模型訓練

為了端到端(end-to-end)的前傳與後傳,需要将标注資訊轉化(assign)成與模型輸出相比對的形式,以訓練SSD多個尺度的檢測器。不僅如此,訓練過程還涉及先驗框比對、難例挖掘和資料增強政策。

(1)先驗框的比對政策(Matching strategy)。SSD選擇與标注框交并比超過0.5的先驗框(the best jaccard overlap, 其實就是IoU)作為正樣本。論文提到之是以不隻選擇交并比最大的先驗框,是因為這樣在一定程度上能簡化學習問題,即允許模型對多個重合的先驗框進行預測 (原文連結4)。對于這個解釋,我是這麼了解的:與标注框交并比最大的先驗框不一定就是最合适的框,或許小一點的交并比的先驗框會更合适,如果隻保留交并比最大的先驗框,相當于剔除了更為合适的先驗框,使得模型被迫去接受一個不是最合适的先驗框,這一定程度上增加了模型的學習難度。也就是說,如果使用門檻值的方式,可以給模型更多選擇,模型的學習難度就會大大降低。

原文連結4: Unlike MultiBox, we then match default boxes to any ground truth with jaccard overlap higher than a threshold (0.5). This simplifies the learning problem, allowing the network to predict high scores for multiple overlapping default boxes rather than requiring it to pick only the one with maximum overlap.

(2)是定義模型的損失函數。定義先驗框與标注框的比對辨別 x i j p x_{ij}^p xijp​,表示第i個先驗框與第j個标注為類别p的真值框比對。根據上文的比對規則,一個标注框可以比對多個先驗框,可以歸納成 ∑ i x i j p ≥ 1 \sum_ix_{ij}^p\geq1 ∑i​xijp​≥1。将定位損失與置信度損失的權重和(weighted sum)定義為模型損失,則模型總體損失函數如下:

L ( x , c , l , g ) = 1 N ( L c o n f ( x , c ) + a L l o c ( x , l , g ) ) L(x, c, l, g) = \frac{1}{N}(L_{conf}(x, c)+aL_{loc}(x, l, g)) L(x,c,l,g)=N1​(Lconf​(x,c)+aLloc​(x,l,g))

其中,N表示比對的先驗框個數,如果N為0,則将損失L定義為0。在目标檢測中,定位損失常用Smooth L1 Loss,用于衡量預測框(predicted box) l 與标注框(ground truth) g之間的差距(distance),即回歸得到邊框中心(cx, cy), 以及邊框的寬w和高h四個參數相對于先驗框d的偏移(offset)。 a a a根據交叉驗證(cross validation)設定為1。

Object Detection:One-stage Detector SSD

使用Smooth L1 Loss,簡單來說就是起到限制梯度的作用:當l與g差别很大時,梯度不至于過大,這能確定訓練初期的穩定性;當l與g差别很小時,梯度能夠足夠小,確定在訓練後期模型能夠繼續收斂以達到更高的精度。(參考連結:尹相楠的回答)

Object Detection:One-stage Detector SSD

PS:這裡簡單提一下,在代碼實作中用到了variance超參數來調整檢測值,SSD是沿用之前别人工作的設定。

weiliu89: It is used to encode the ground truth box w.r.t. the prior box. You can check this function. Note that it is used in the original MultiBox paper by Erhan etal. It is also used in Faster R-CNN as well. I think the major goal of including the variance is to scale the gradient. Of course you can also think of it as approximate a gaussian distribution with variance of 0.1 around the box coordinates.

分類損失使用的是Softmax Loss,用于衡量預測類别的置信度c與類别标注x間的差距。分類損失包含兩個部分,一部分是正樣本損失,一部分是負樣本損失。 c ^ i p \hat{c}_i^p c^ip​是指來自正樣本的第i個先驗框是類别p的softmax機率, c ^ i 0 \hat{c}_i^0 c^i0​是指來自負樣本的第i個先驗框是背景的softmax機率。

Object Detection:One-stage Detector SSD

(3)為先驗框選擇尺度與長寬比。為了解決目标尺度問題,之前的工作從圖檔層面的角度,提出輸入圖像金字塔的方式,将不同尺度圖檔的網絡輸出進行合并(有點類似後融合late-fusion)。受前人的工作啟發(原文連結5),SSD則是從特征層面的角度,通過充分利用不同層的特征圖做預測以達到同樣的效果,而且這種方式使得不同尺度的目标檢測器可以共享參數(share parameters),一定程度上減少了預測的時間及模型的參數量。

原文連結5: Previous works have shown that using feature maps from the lower layers can improve semantic segmentation quality because the lower layers capture more fine details of the input objects. Similarly, showed that adding global context pooled from a feature map can help smooth the segmentation results.

與Faster-RCNN的區域提議網絡(Region Proposal Network, RPN)不同的是,SSD中的先驗框不需要對應到它目前層的感受野(receptive field),通過綁定先驗框的方式(tiling of default boxes),固定每一層先驗框的尺度與長寬比,引導各特征圖對各特定尺度的目标作出響應,把邊框校正這一任務交給網絡去學習(原文連結6)。

原文連結6: Feature map from different levels within a network are known to have different (empirical) receptive filed sizes. Fortunately, within the SSD framework, the default boxes do not necessary need to correspond to the actual receptive fields of each layer. We design the tiling of default boxes so that specific feature maps learn to be responsive to particular scales of the objects.

先驗框的尺度計算如下(随着特征圖大小降低,先驗框尺度線性增加):

s k = s m i n + s m a x − s m i n m − 1 ( k − 1 ) , k ∈ [ 1 , m ] s_k = s_{min} + \frac{s_{max}-s_{min}}{m-1}(k-1), k\in[1, m] sk​=smin​+m−1smax​−smin​​(k−1),k∈[1,m]

其中 s m i n = 0.2 s_{min}=0.2 smin​=0.2, s m a x = 0.9 s_{max}=0.9 smax​=0.9 代表最淺層也就是Conv7的先驗框尺寸為0.2 (SSD300中Conv4_3先驗框尺寸單獨設定為0.1,SSD512中Conv4_3先驗框尺寸單獨設定為0.07,且 s m i n = 0.15 s_{min}=0.15 smin​=0.15),最深層也就是Conv11_2的先驗框尺寸為0.9, s k s_k sk​代表第k個用于預測的特征圖的先驗框尺寸, m m m指用于預測的特征圖數量。(ps: 源碼好像是另一套計算方式)

先驗框的長寬比範圍: a r ∈ { 1 , 2 , 3 , 1 2 , 1 3 } a_r \in \{1, 2, 3, \frac{1}{2}, \frac{1}{3}\} ar​∈{1,2,3,21​,31​},由此可以計算出5個先驗框的長寬:

w k a = s k a r , h k a = s k / a r w_k^a = s_k\sqrt a_r, h_k^a=s_k/\sqrt a_r wka​=sk​a

​r​,hka​=sk​/a

​r​

由于論文中為長寬比為1單獨增加了一個尺寸為 s k ′ = s k s k + 1 s_k'=\sqrt{s_ks_{k+1}} sk′​=sk​sk+1​

​,是以特征圖的每一個位置共有6個先驗框(Conv4_3, Conv10_2, Conv11_2的特征圖的每個位置隻設定四個先驗框,長寬比為 1 , 2 , 1 2 {1,2,\frac{1}{2}} 1,2,21​)。設定先驗框的中心為 ( i + 0.5 ∣ f k ∣ , j + 0.5 ∣ f k ∣ ) (\frac{i+0.5}{|f_k|}, \frac{j+0.5}{|f_k|}) (∣fk​∣i+0.5​,∣fk​∣j+0.5​), ∣ f k ∣ |f_k| ∣fk​∣是第k個用于預測的特征圖的尺寸,即 i , j ∈ [ 0 , ∣ f k ∣ ] i, j \in [0,|f_k|] i,j∈[0,∣fk​∣]。文中提到可以為特定資料集去尋找最為合适的先驗框分布,但最優的設定方法(optimal tiling)目前仍是一個開放的問題。

(4)難例挖掘(Hard Negative Mining)。在先驗框比對之後,未比對的先驗框會被标記為負樣本,由于未比對的檢測框會占較大比例,便存在正負樣本不平衡(imbalance)的問題。解決方案是:将所有負樣本按照置信度損失從高到低排列,取排名前列的負樣本加入模型訓練中,需要確定訓練時的正樣本與負樣本的比例至多為3:1。難例挖掘使得模型優化速度更快,訓練過程更加穩定。

(5)資料增廣(Data Augmentation)。為了讓模型能夠對不同大小、形狀的目标的檢測更具魯棒性,每一張訓練圖檔都會随機進行其中一種處理:

  • 使用原圖作為輸入
  • 對原圖采樣得到與目标交并比為0.1, 0.3, 0.5, 0.7, 0.9的圖檔塊(image patch)
  • 對原圖随機采樣圖像塊

采樣得到的圖像塊的尺寸(scale)是原圖的 [ 0.1 , 1 ] [0.1, 1] [0.1,1],長寬比(ratio)是 [ 1 2 , 2 ] [\frac{1}{2}, 2] [21​,2]。采樣圖像塊的過程中如果标注框(ground truth)的中心位于圖像塊中,則保留圖像塊與原圖示注框交疊的部分(原文連結7)。

原文連結7: We keep the overlapped part of the ground truth box if the center of it is in the sampled patch.

不僅如此,每個采樣得到的圖像塊都會被縮放(resize)到固定大小(fixed size)并以 p = 0.5 p = 0.5 p=0.5的機率進行水準翻轉,同時還會采取顔色扭曲(photo-metric distortion)。

3. 實驗

3.1 PASCAL VOC 2007

在Pascal VOC 2007資料集上,作者将SSD300、SSD512與Fast R-CNN、Faster R-CNN進行一系列對比,所有模型都是基于相同的預訓練VGG16模型進行微調(finetune)。從資料data一欄可以看到,訓練資料有“07”, “07+12”,“07+12+COCO”,分别代表VOC2007 trainval,VOC2007 整個資料集 + VOC2012 trainval,COCO trainval135k 然後用07+12資料集微調。

從結果上看,訓練集為VOC2007 trainval時,SSD300 超過了Fast RCNN,SSD512超過了Faster RCNN;訓練集為 “07+12”, “07+12+COCO”時,SSD300與SSD512都超過Faster-RCNN。

Object Detection:One-stage Detector SSD

為了進一步了解SSD的性能增益,作者做了下圖的可視化實驗(Visualization)。白色區域說明SSD能夠在多個類别上實作較高的檢測性能;與R-CNN相比,SSD實作了更少的定位錯誤(localization error);然而,SSD在相似(similar)類别出現混淆(confuse),尤其是動物(animal)一類,見下圖第二行的紅色區域,作者認為這是SSD對不同類别共享位置導緻的(share locations for multiple categories),換句話說就是這種基于位置的檢測方法可能會導緻相似類的混淆,因為缺少了兩階段模型中基于類别(class-specific)的邊框回歸。

Object Detection:One-stage Detector SSD

下圖說明了SSD對檢測框的尺寸非常敏感。SSD對多個尺度的目标檢測還是很魯棒的,尤其是大目标,但SSD對小目标的檢測表現較差。雖然增加輸入圖檔尺寸在一定程度上能提升小目标的檢測性能,但是仍然還有很大的提升空間。

Object Detection:One-stage Detector SSD

3.2 模型分析/消融實驗(Ablation Studies)

從下圖可以看出:(1)資料增廣技術很重要;(2)使用更多尺度的先驗框可以得到更好的結果;(3)使用Atrous版本的VGG-16雖然性能提升較小,但能提升20%的速度。

Object Detection:One-stage Detector SSD

下圖可以看出:多尺度特征預測的重要性。為了公平,以下消融實驗中先驗框的數量較為接近,這是通過增加可選擇的先驗框尺寸實作的。

Object Detection:One-stage Detector SSD

3.3 PASCAL VOC 2012

在“07++12”上,SSD300/512 超過Fast/Faster R-CNN與YOLO;在“07++12+COCO”上,SSD300/512超過Faster R-CNN。

Object Detection:One-stage Detector SSD

3.4 COCO

因為COCO目标尺寸整體比PASCAL小,是以論文中采用了更小尺度的先驗框。SSD300在[email protected]與[email protected][0.5:0.95]上性能超越了Fast R-CNN,在[email protected]上與ION、Faster-RCNN相近,但在[email protected]上遜色于ION、Faster-RCNN。SSD512達到SOTA,有趣的是:SSD512相對于SSD300,在[email protected]高了5.3%,在[email protected]僅高了1.2%。

Object Detection:One-stage Detector SSD

3.5 資料增廣對小目标準确率的影響

“拉近(zoom in)”和“拉遠(zoom out)” 的資料增廣政策有助于提升小目标準确率。其中,“拉近”可由随機截取(Random Crop)實作,而“拉遠”則是采用一種擴張(expansion)方式:将原圖随機放在16倍的用均值(mean value)填充的畫布(canvas)上,然後對其做随機截取 (原文連結8)。因為通過資料增廣增加了訓練集規模,論文将疊代的次數調整為原來的2倍。

原文連結8: We first randomly place an image on a canvas of 16x of the original image size filled with mean values before we do any random crop operation.

由下面兩圖可以體會到資料增廣對小目标準确率的提升是有很大幫助的。作者還提出了一種提升SSD性能的可選方案:設計更好的貼瓷磚(“先驗框”)方式 (隻可意會,不好翻譯呀),使其能夠更好的對齊特征圖上每個位置的感受野(原文連結9)。

原文連結9: An alternating way of improving SSD is to design a better tiling of default boxes so that its position and scale are better aligned with the receptive filed of each position on a feature map.
Object Detection:One-stage Detector SSD
Object Detection:One-stage Detector SSD

3.6 預測階段 (Inference Time)

  • 根據類别置信度确定其類别與置信度,過濾屬于背景的預測框
  • 根據置信度門檻值篩去不符合條件的預測框
  • 将剩下的預測框進行解碼,并做裁剪(避免預測框位置超出原圖), 得到對應到原圖中的位置參數
  • 按照置信度降序排列,保留top-k個預測框
  • 進行NMS,篩去重疊較多的預測框。
  • 最終剩下的框便是檢測結果。

SSD有80%的前傳時間花在骨幹網絡上。下圖是各模型性能對比:

Object Detection:One-stage Detector SSD

4. 總結

SSD 融合了兩階段模型Faster-RCNN的先驗框機制(anchor)與單階段模型的回歸思想(regression),借助多層特征(multiple feature maps)預測以及資料增強等手段,在實作高精度(high precision)的同時又保證了實時速度(real-time spped)。SSD是目标檢測單階段模型的其中一個裡程碑,非常值得大家去精讀!

參考連結:

SSD解析好文推薦:目标檢測|SSD原理與實作

繼續閱讀