最全的目標檢測入門系列(六)SSD系列

最全的目標檢測入門系列(六)SSD系列

最全的目標檢測入門系列(六)SSD系列

盛年不重來,一日難再晨。及時宜自勉,歲月不待人。——陶淵明

最全的目標檢測入門系列(六)SSD系列

引言

相對於two stage目標檢測演算法而言,one stage目標檢測演算法可以一步到位完成檢測,不需要先生成候選區域再進行分類和邊界框迴歸,因此one stage目標檢測演算法在速度上有很大的優勢。

one stage的經典演算法是Yolo、SSD,以及後續對其進行改進的系列演算法。Yolo演算法中,圖片經過縮放及CNN特徵提取後,輸出7*7*30大小的張量,對於每個單元格進行類別預測和邊界框迴歸,從效果來看,Yolo存在定位不準、難以檢測小目標等問題。針對這些問題,SSD做了三個主要的改進:

SSD提取了不同尺度的特徵圖來做檢測,大尺度特徵圖可以用來檢測小物體,而小尺度特徵圖用來檢測大物體;

使用卷積層來預測類別和座標;

SSD採用了不同尺度和長寬比的先驗框(Prior boxes),也就是Faster R-CNN中的錨(Anchors)。

這幾點重要改進使得SSD在一定程度上克服這些缺點,下面我們詳細講解SDD演算法的原理。

SSD演算法

SSD和Yolo一樣都是採用一個CNN網路來進行檢測,但是卻採用了多尺度的特徵圖,其基本架構如圖1所示。下面將SSD核心設計理念總結為以下三點:

最全的目標檢測入門系列(六)SSD系列

圖1 SSD演算法架構圖

1).採用多尺度特徵圖用於檢測

SSD 網路結構採用 VGG16 作為基礎模型,然後在 VGG16 的基礎上新增了卷積層來獲得更多的特徵圖用於檢測。主要改變是將第六層(FC6)第七層(FC7)的全連線層轉換成兩個卷積層,並在第七層(FC7)之後額外增加了四個卷積層,SSD 網路結構如圖 1 所示。預測過程中,在 Conv4_3、FC7 及新增的四個卷積層所產生的六個特徵圖進行目標類別與位置的預測。

2).採用卷積進行檢測

與Yolo最後採用全連線層不同,SSD直接採用卷積對不同的特徵圖來進行提取檢測結果。具體原因是,全連線層會破壞特徵的空間結構。具體做法是使用3*3的卷積進行位置、類別的預測,然後使用reshape縮放維度,可參考SSD原始碼中的multibox_layer函式。

3).設定先驗框

Yolo中,一張圖片經過backbone進行特徵提取後,生成一個寬高為7*7的feature map,也就是49個grid,然後對每個grid預測類別、置信度、座標等資訊,這樣的做法使得召回率較低。SSD中借鑑了Faster R-CNN中anchor的理念,設定不同尺度或者不同長寬比的先驗框,預測框有七千多個,因此在很大程度上解決了召回率低的問題。一般情況下,每個單元會設定多個先驗框,其尺度和長寬比存在差異,如圖2所示。對於有 p 個通道、尺寸大小為m × n的特徵圖,使用3 × 3 × p的卷積核操作,產生一個相對於預設框的座標偏移值以及類別分數。對於在給定位置的 k 個預設框中,需要計算 c+1 (包含背景類)個類別分數和相對於原始預設框的 4 個座標偏移量,因此對於m × n的特徵圖產生(c +1 + 4) × k × m × n個輸出。

最全的目標檢測入門系列(六)SSD系列

圖2 SSD演算法先驗框

在訓練過程中,首先要確定訓練圖片中的ground truth(真實目標)與哪個先驗框來進行匹配,與之匹配的先驗框所對應的邊界框將負責預測它。在Yolo中,ground truth的中心落在哪個單元格,該單元格中與其IOU最大的邊界框負責預測它。但是在SSD中卻完全不一樣,SSD的先驗框與ground truth的匹配原則主要有兩點。

首先,對於圖片中每個ground truth,找到與其IOU最大的先驗框,該先驗框與其匹配,這樣,可以保證每個ground truth一定與某個先驗框匹配。通常稱與ground truth匹配的先驗框為正樣本,反之,若一個先驗框沒有與任何ground truth進行匹配,那麼該先驗框只能與背景匹配,就是負樣本。一個圖片中ground truth是非常少的, 而先驗框卻很多,如果僅按第一個原則匹配,很多先驗框會是負樣本,正負樣本極其不平衡,所以需要第二個原則。

第二個原則是:對於剩餘的未匹配先驗框,若某個ground truth的IOU大於某個閾值(一般是0。5),那麼該先驗框也與這個ground truth進行匹配。這意味著某個ground truth可能與多個先驗框匹配,這是可以的。但是反過來卻不可以,因為一個先驗框只能匹配一個ground truth,如果多個ground truth與某個先驗框IOU大於閾值,那麼先驗框只與IOU最大的那個先驗框進行匹配。

儘管在先驗框匹配中,已經做了一點正負平衡的工作,但是這還是遠遠不夠的。因此為了保證正負樣本儘量平衡,SSD採用了難例挖掘(hard negative mining)。原理就是,就是對負樣本按照置信度從大到小進行排序,然後選取誤差較大的top-k作為訓練的負樣本,以保證正負樣本比例接近1:3。這樣在訓練過程中,負樣本的損失誤差主要由難例樣本貢獻,使得模型可以聚焦與難例樣本,進一步提升模型的精度。訓練樣本確定了,然後就是損失函數了。損失函式定義為位置誤差與置信度誤差的加權和:

最全的目標檢測入門系列(六)SSD系列

DSSD演算法

SSD演算法雖然在準確率及速度上取得了較高的水準,但仍存在對小目標不夠友好的問題。因此DSSD在在SSD的基礎上進行了一系列改進,首先是使用ResNet101作為backbone來提取特徵;其次優化了特徵金字塔網路(FPN),提出一個基於top dowm的網路結構,並用反捲積代替傳統的雙線性差值;最後在預測分支中引入了殘差結構,提高候選框迴歸和分類任務的精度。如圖3所示為SSD與DSSD的網路結構對比圖,總結DSSD相比於SSD改進點如下:

最全的目標檢測入門系列(六)SSD系列

圖3 SSD和DSSD演算法結構圖對比

1).backbone替換成更加先進的ResNet101

在SSD中backbone使用的是VGG16,而在DSSD中作者使用了特徵提取能力更強的ResNet101作為backbone,並在conv5之後新增額外的conv block,然後在conv3、conv5以及新增的conv block上進行目標類別及位置的預測。但是在論文裡,作者提到了只是簡單的替換backbone,並不能提升準確率,因此作者提出了Deconvoluational Module和Prediction Module。

2).Deconvoluational Module

如圖4所示為Deconvoluational Module結構圖,Deconvoluational Module和借鑑特徵金字塔的思想(FPN),目的是將深層特徵圖與淺層特徵圖進行融合,這樣融合後的特徵圖同時具有深層特徵圖的語義資訊和淺層特徵圖的位置資訊。方法就是把圖3中的紅色層做反捲積操作,使其和上一級藍色層尺度相同,再把二者融合在一起,得到的新的紅色層用來做預測。值得注意的是,在Deconvoluational Module中上取樣用的是反捲積而不是雙線性插值,同時在每一個conv之後使用BN層,在融合階段採用的是Element-wise product(元素對應相乘)。作者也透過對比實驗,證明了元素點積的方式比元素求和的方式能得到更好的精度。整個DSSD呈沙漏型結構。

最全的目標檢測入門系列(六)SSD系列

圖4 Deconvoluational Module結構圖

3).Prediction Module

SSD中在六層feature map上進行類別預測和位置預測,由於使用了anchor機制,預測的box多大7000多,梯度計算量很大。因此在DSSD中,作者在每一個預測層後增加殘差模組,並且對於多種方案進行了對比,如圖5所示,其中a為SSD採用的方案,b、c、d為作者改進的方案。結果表明,增加殘差預測模組後,高解析度圖片的檢測精度比原始SSD提升明顯,並且作者得出結論,c結構準確率最高。

最全的目標檢測入門系列(六)SSD系列

圖5 不同模組圖

FSSD演算法

同樣考慮到ssd演算法獨立的利用淺層與深層的特徵圖進行預測,不能很好的提取不同尺度物體的特徵,FSSD提出了一種新的特徵融合(feature fusion module)的方式,有效改善了SSD的精度,並只帶來很小的速度損失。其主要思想為:將vgg16產生的不同尺度的特徵圖,利用雙線性插值變換為conv4-3層的特徵圖尺度大小,然後融合所有特徵圖,利用得到的特徵圖重新進行下采樣得到不同的特徵圖尺度,輸入預測網路進行預測。如圖6所示為FSSD網路架構圖,相比於SSD網路提升如下:

最全的目標檢測入門系列(六)SSD系列

圖6 FSSD網路結構圖

1).backbone

FSSD中使用的backbone與SSD的backbone基本一致,均是VGG16,只是在把Conv6_2的步長從2調到了1,這樣conv7_2和Conv6_2一樣也是10*10,因為論文中認為小於10的feature 能夠合併的資訊量太少了。

2).Feature Fusion Module

原始SSD中獨立的利用淺層與深層的特徵圖進行預測如圖4-31 d所示;而在FPN、DSSD中,使用的是一個top-down的逐層特徵融合機制,如圖4-31 (c),新生成的特徵金字塔上每層feature map,僅能融合同層和高層的特徵,且二者的element-wise融合操作耗時很大。因此FSSD提出了一個輕量級、高效的特徵融合方案,以克服以上弊端,將vgg16產生的不同尺度的特徵圖,縮放到一定的尺度大小,然後融合所有特徵圖,利用得到的特徵圖重新構建特徵金字塔,如圖7 e所示。同時在concate後,需要一個BN層操作,以正則化concate後的feature map,如圖7。

最全的目標檢測入門系列(六)SSD系列

圖7 Feature Fusion Module結構圖

3).Pyramid feature generators

和原始SSD一樣,使用特徵金字塔來生成目標檢測結果。論文中測試了三種不同的結構,並比較結果來選擇最佳結構。如圖8所示:

(a)中使用簡單步長為2的conv依次降取樣

(b)中同增加步長為1的conv來增加特徵提取能力

(c)中使用了bottleneck結構。作者透過實驗表明第二種結構最佳。

最全的目標檢測入門系列(六)SSD系列

圖8 Pyramid feature generators結構圖

RFBNet演算法

雖然 SSD 演算法採取了多尺度預測,但是淺層特徵圖包含的語義資訊較少,不利於分類。空洞卷積(Dilated Convolution)正好彌補了這個不足,空洞卷積是在保持引數數目不變的情況下,增加普通卷積中卷積的感受野,使每個卷積的輸出包含更大的資訊範圍。其一維數學表達形式為:

最全的目標檢測入門系列(六)SSD系列

如圖9所示:(a)圖的空洞率為 1,感受野大小為3 × 3 = 9;(b)圖的空洞率為 2,即卷積核的相鄰畫素點間距為 1 個空洞,填 0 補充,感受野大小為7 × 7 = 49;(c)圖的空洞率為 4,感受野大小為15 × 15 = 225。因此可以看出空洞卷積的優點是:可以增加感受野,使得每個卷積的輸出包含更大的資訊範圍。然而,使用單一得空洞率便會產生一種網格效應:部分的畫素未能參與計算,損失了資訊的連續性。RFBNet演算法相比於SSD 演算法改進點如下:

最全的目標檢測入門系列(六)SSD系列

圖9 空洞卷積

1).RFB Module

在RFB模型中,為使SSD淺層特徵圖包含較大範圍的資訊,使用一系列具有不同空洞率的空洞卷積,每個空洞卷積均使用單獨的分支處理,最後將不同空洞率的空洞卷積提取出的特徵進行拼接生成最後的結果。提出的空洞卷積模組,如圖10所示。整體結構借鑑了Inception的思想,主要不同點在於引入3個空洞卷積層,空洞率分別為 1、3、5, 然後透過對特徵圖拼接進行資訊融合。該模組能學習到多尺度資訊的模型,從而最大限度地表達特徵圖的特徵資訊,能夠提升模型對影象的整體表達能力。在RFB-s結構中一方面用3*3卷積層代替5*5卷積層,另一方面用1*3和3*1卷積層代替3*3卷積層,主要目的應該是為了減少計算量,類似Inception後期版本對Inception結構的改進。

最全的目標檢測入門系列(六)SSD系列

圖10 RFB模組

2).Model Structure

RFB-Net300的整體結構示意圖,基本上和SSD類似,和SSD不同的是:主幹網上用兩個RFB結構替換原來新增的兩層;conv4_3和conv7_fc在接預測層之前分別接RFB-s和RFB結構,這兩個結構的示意圖如前面圖10所示。

最全的目標檢測入門系列(六)SSD系列

圖11 RFB-Net300的整體結構

總結

總的來說,SSD透過多尺度預測,利用卷積進行檢測,設定先驗框等方法全面改進了Yolo;而DSSD、FSSD、RFB除了改backbone之外,更多的是從特徵融合模組入手。其主要思想是,深層特徵圖雖然對應於原圖的語義資訊豐富、特徵表達能力強,但是由於對應於原圖的感受野大,缺少目標的細節資訊,容易造成小目標物體的漏檢。而淺層特徵圖由於對應於原圖的感受野小,能夠用來檢測影象中的小目標,但是由於淺層特徵圖前的卷積層較少,造成其語義資訊較少、特徵表達能力有限,容易造成欠擬合。因此為提高小目標物體檢測能力,特徵圖一方面應包含較小的感受野以獲得關於目標的細節資訊;另一方面需要具備更強的特徵提取能力及更全域性的語義資訊。相關的研究還可以參考PANet、ASFF、NAS-FPN、BiFPN、Recursive-FPN等。

參考文獻

文章連結:

SSD:https://arxiv。org/abs/1512。02325

DSSD:https://arxiv。org/abs/1701。06659

FSSD:https://arxiv。org/abs/1712。00960

RFBNet:https://arxiv。org/abs/1711。07767

程式碼連結:

SSD:https://github。com/weiliu89/caffe/tree/ssds

DSSD:https://github。com/chengyangfu/caffe/tree/dssd

FSSD:https://github。com/lzx1413/CAFFE_SSD/tree/fssd

RFBNet:https://github。com/ruinmessi/RFBNet

前期回顧

最全的目標檢測入門系列(一)概述

最全的目標檢測入門系列(二)評價指標

最全的目標檢測入門系列(三)資料集

最全的目標檢測入門系列(四)傳統目標檢測方法

最全的目標檢測入門系列(五)YOLO系列

後期預告

最全的目標檢測入門系列(六)SSD系列

歡迎點、藏、關三連

有共同興趣的同學,可以私信探討