陳灝然,彭 力
物聯網技術應用教育部工程研究中心(江南大學物聯網工程學院),江蘇無錫 214122
目標檢測是當下計算機視覺研究的重點之一。傳統的目標檢測算法有常用于人臉檢測的Harr[1]特征以及在行人檢測和普通常規目標檢測中所用的HOG[2]特征。這些傳統的算法有兩個重要的難以避免的缺陷:(1)用滑動窗口策略進行區域選擇時針對性不強,增加了時間復雜度及窗口的冗余;(2)手動設計的特征對于目標的多樣性并沒有很強的魯棒性。
隨著卷積神經網絡的不斷改進,針對目標檢測的研究開始真正進入了深度學習的時代。當下主流基于深度學習進行目標檢測的主要有one-stage(一階)與two-stage(二階)兩種。Two-stage 是準確度的代表,one-stage 則是速度的代表。自此,目標檢測成為了一個多任務學習的問題。
Two-stage 類算法首先是產生候選區域,然后對候選區域進行分類。Girshick 等人于2014 年提出的R-CNN(region-convolutional neural networks)[3]是利用卷積神經網絡進行目標檢測的開端。其兩步法主要是利用類似于機器學習中的局類算法,對圖像分組得到多個候選框的層次組,隨后進行分類。在R-CNN 的基礎之上,Girshick 于2015 年提出了Fast R-CNN[4],在之前的基礎上針對每個候選區域添加ROI Pooling[5]進行池化操作,隨后采用softmax[6]取代SVM(support vector machine)[7]進行多分類的操作,并且利用回歸模型進行邊框位置與大小的微調。2015 年,Ren 等人在Fast R-CNN 的基礎上提出了Faster R-CNN[8],將特征提取、候選區域、邊界框回歸、分類整合到了一個網絡中,借此提高綜合性能。雖然在精度上有了極大的提高,但是仍然不能真正實現端到端的檢測。
基于候選區域的深度學習目標檢測類算法在速度方面并沒有很大的改進,針對目標的提取仍然具有很大的復雜度,導致時效性比較差。One-stage類算法因此被提出,主要有YOLO[9](you only look once)、SSD[10](single shot multibox detector)以及以這兩個算法為主衍生的算法。
Redmon 等人于2016 年提出的YOLO 算法主要是通過候選區域產生大量的可能包含待檢測物體的潛在邊界框,然后用分類器去判斷每個邊界框里是否包含物體以及物體所屬類別可能性以及置信度。相較于基于候選區域檢測目標在實時性方面有了很大的進步,但是在準確度以及對于小物體的檢測效果并不十分理想。
Liu 于2016 年提出的SSD 算法主要利用了金字塔結構的特征提取層進行特征圖的提取,將多個卷積層提取的特征圖進行softmax 分類和位置回歸。YOLO 僅利用了高層特征圖導致低層語義信息的缺失,從而導致小目標的檢測效果不是十分顯著。SSD雖然也利用了低層級的語義信息,但是這樣的每個層級單獨分類和回歸導致每個層級間并沒有直接的關聯,導致上下層語義信息并沒有很好地交融,小目標檢測的效果仍然不是那么顯著。
Liu 深知SSD 的優點與缺點,故與Fu 聯合發表了DSSD(deconvolution single shot multibox detector)[11]算法。在SSD 卷積層之后,添加了輔助卷積層以及相對應的不對稱反卷積層。同時將基礎網絡VGG-16 換成Resnet101[12],增強特征提取的同時也增加了特征融合,但是不可避免地增加了計算量,導致速度變慢。除此之外,由于Resnet 網絡的特性,其下采樣stride=4,這樣也直接導致其對于小目標的檢測仍然不是特別好。
由Cao 等人提出的Feature-Fused SSD[13]算法同樣融合了上下文信息,它的基礎網絡仍然是VGG-16,與DSSD 不同之處是利用融合高層的語義信息去感知低層的語義信息。
基于現有的理論,提出了一種基于SSD,利用感受野以及多尺度融合的算法。首先在特征提取階段,本文算法利用了基于VGG-16的主體框架。作為輕量級的backbone,VGG-16 具有更高的特征提取效率,同時在特征提取層中加入RFB[14](receptive field block)模塊,通過模擬人類視覺感受野加強網絡在特征方面的提取能力。此外,加入了特征融合模塊,將上下文信息進行有效的融合,從而加強對小目標的檢測精度。
針對小目標的檢測一直是深度學習圖像檢測的一個難題[15],與較大型目標相比小目標不論是數量還是大小在圖片中往往占據很小的比例。正因為小目標的低分辨率,圖像相對更模糊并且攜帶的信息過少導致其表征能力很弱。此外,神經網絡中的主導為大型目標,也會導致小目標的被動忽視,導致其檢測效果差。
神經學發現,在人類視覺皮層中,群體感受野的尺度是其視網膜偏心度的函數,其尺度與視網膜圖的偏離度正相關,且不同視網膜圖上群體感受野的尺度不一樣。Receptive field block 是一個類似inception[16]模塊的多分支卷積模塊,它的內部結構分為多分支卷積層以及與之相連的膨脹卷積層,通過連接的多個分支卷積核以獲得不同尺度的感受野,如圖1 所示。
多分支卷積部分,借鑒了inception 的結構,同時加入旁路剪枝,用以減少大量的卷積核通道數。首先用1×1 的卷積核來實現通道的交互和信息整合以及進行卷積核通道數的降維。隨后將兩個5×5 的卷積核替換為兩個3×3 的卷積核以減少參數量,同時增強模型的非線性能力。此外,進一步使用1×n和n×1的卷積核替代原有的n×n卷積核用以增強寬度和高度上的特征。同時設置旁路剪枝以減少卷積核的通道數,降低參數計算量。
膨脹卷積部分,最初于DeeplapV2 中被提出,在保持參數量和同樣感受野的情況下,用來獲取更高分辨率的特征,膨脹卷積歸根到底是對卷積核進行填充。膨脹后的卷積核大小計算公式為:

在每個常規卷積核后都會連接膨脹卷積層,隨后各個分支concate[17]再后接1×1 卷積核用以與同層feature map 下的特征結合,同時減少通道參數,形成了類似人類感知視覺的模式。即離中心越近,貢獻越高,反之越小。最后將concate 后的特征圖與剪枝進行對位相乘。
主體仍然沿用了SSD的backbone。VGG-16采用了連續的3×3 卷積核并且后接池化層。對于給定大小的輸入圖片,采用連續的堆積小的卷積核是因為多層非線性層可以在增加網絡深度的情況下,做到保持復雜度的同時減少參數。相比早期的AlexNet,減小了卷積核的大小,確保了參數量的下降。相比擁有更多卷積層的DenseNet、ResNet 等網絡,VGG-16的卷積層數較少避免了過擬合現象的發生。基于現有的先驗知識,VGG-16 在實時性方面相對于重量級網絡有很大的速度優勢。與更輕量級的mobilenet[18]相比,VGG-16 因為擁有更多的卷積層,所以在犧牲較少實時性的同時具有更強的特征提取能力。
在原始的VGG-16 網絡上是沒有BN[19](batch normalization)層的,這里選擇添加BN 層,因為神經網絡一旦訓練起來,便會更新大量參數,除了輸入層的數據外,后面網絡層的輸入數據分布是一直在發生變化的,數據的不斷變化會影響網絡的訓練速度,添加BN 層可以使得網絡收斂性更加快速。一般情況下可以通過調整學習率、權重衰減系數、Dropout比例等,對這些參數同時進行調整并且多次實驗,這樣必定會浪費大量的時間用于調整參數上。實驗過程中,在不加BN 層的情況下,單一地調整學習率和權重系數等參數,損失值依然很大,說明梯度問題未得到改善。因為原網絡的輸入特征在未經過線性歸一化的情況下,需要網絡主動去調整學習適應輸入特征的均值和方差。因此選擇在網絡層間添加BN 層,也就相當于多了一個映射層,使得網絡不必花費大量的時間調整自己去適應輸入特征,極大地加速了網絡的收斂以及梯度的下降。此外,BN 層可以完全取代具有相同歸一化功效的Dropout 層,使得改進后的網絡在空間復雜度方面得到了優化。
添加BN 層后,適當提高學習率,并且將fc6 與fc7 全連接層做up-sampling[20]后變成卷積層,因為全連接層會破壞圖像的空間結構,故將其替換為卷積層。對于10×10 的特征圖,不直接在上面采用Receptive field block,因為在這些提取到的特征圖中能夠獲得的信息量較小。
早先的SSD 主體框架在各個層級上是分別進行特征提取并且直接預測的,此外各個層級之間并無直接的關聯,這樣就導致對中小型的目標的檢測并不是那么準確,SSD 的預測結構圖如圖2 所示。

Fig.2 SSD prediction structure圖2 SSD 預測結構圖
現在需要做的是將各個預測層連接起來,讓高層的語義信息和低層的語義信息能夠更好地融合。因為相較于低層的語義信息,更深的卷積神經網絡能夠檢測到更多的語義信息,并且這些語義信息都具有平移不變性,對于目標類別的檢測更加有效。特征融合預測結構圖如圖3 所示。

Fig.3 Feature fusion prediction structure圖3 特征融合預測結構圖
實際的特征融合過程中,Conv3_3 由于融合效果不算顯著,且增加了額外的計算量,因此并沒有被加入到特征融合模塊中。當提取到的特征圖分辨率低于10×10 之后,特征中所包含的信息就會較少,Conv8_2以及Conv9_2 的特征圖大小分別為3×3 以及1×1,故將其替換為RFB 模塊,不參與融合。實際的實驗中首先采用了Conv3_3、Conv4_3、fc7、Conv7_2 進行融合,實際實驗中與只融合Conv4_3、fc7、Conv7_2 進行對比,并沒有顯著提升,且相對于后者,增加了計算量,故不選擇Conv3_3 進行融合。同時,在特征融合模塊中加入感受野模塊,首先是為了能夠降低通道參數,減少參數計算量,其次是確保在保持參數量和同樣感受野的情況下,用來獲取更高分辨率的特征,特征融合結構圖如圖4 所示。
選擇fc7 以及Conv7_2 進行雙線性插值操作,并將新生成的特征圖進行concate,因為相較于elementwise[21]融合操作,concate的操作時間更短,效果更好。

Fig.4 Feature fusion structure圖4 特征融合結構圖
系統的整體框架依然沿用了SSD 的整體結構,在Vgg16 的整體基礎上替換Conv8 以及Conv9 為膨脹卷積層,因為該層提取到的特征分辨率可以應用5×5 的卷積核,而最后幾層分辨率太低無法應用,故只替換了Conv8 以及Conv9,同時在特征融合的過程中加入膨脹卷積層。
經過融合實驗之后,以Conv4_3 為基礎層,其特征圖大小為38×38,將其通過RFB 模塊之后再進行1×1 卷積,用以減少特征圖的通道數,Conv7_fc 的分辨率為19×19,Conv7_2 的分辨率為10×10,通過RFB通道后其分辨需要與Conv4_3 卷積后的特征圖的width、height 一致,故需要進行雙線性插值操作使其分辨率一致。隨后進行concate 操作將其融合在一起。相較于原始的SSD 網絡,增加的僅僅是融合部分以及替換Conv8、Conv9 后通過感受野模塊的計算量。相較于SSD 的FPS,雖然大幅下降,但是其平均精度mAP 提升了4.6 個百分點,相較于原始的僅僅加入感受野模塊提升了1.3 個百分點。同時相比于原始的SSD 網絡,增加了層間的BN 層,極大降低了梯度,防止訓練過程中梯度爆炸的現象發生,整體算法結構如圖5 所示。

Fig.5 Block diagram of proposed algorithm圖5 本文算法結構圖
本文所用的深度學習框架是pytorch-0.4.0,所用的操作系統為ubuntu16.04。硬件方面所用的GPU顯卡為4*1080Ti,內存為16 GB,CUDA 版本為9.0,CUDNN版本為7.0。訓練分別采用了Pascal VOC2007、Pascal VOC2012 以及自制航拍數據集[22]。VOC2007數據集包括9 963 張圖片,總共20 類物體。VOC2012數據集包括12 031 張圖片,總共20 類物體。引用的自制航拍數據集總共55 740 張圖片共計12 類物體。訓練的batch size 選擇為32,max_epoch(訓練總輪數)設置為300。為了使得訓練的損失平穩,在各個epoch設置了間斷的權重衰減,沖量為0.9。設置初始學習率為0.006,將學習率衰減系數設置為gamma=0.2。在初始的11 個epoch 階段,設置了預熱階段,此時的學習率為0.000 001。因為本文算法沒有經過預訓練,所以為了防止損失率出現等于Nan 的情況,需要進行預熱階段。同時,為了保持損失率的穩定下降,分別在epoch=150,epoch=180,epoch=210,epoch=240共計4 個階段設置學習率衰減點,實驗結果如表1~表3 所示。
本文提出的RFB-feature_fusion 算法在VOC2007+VOC2012 上的mAP 為81.8%,相比于SSD 算法有4.6個百分點的提升,同時相比于DSSD 有3.2 個百分點的提升。此外,本文算法所引用的自制航拍數據集的mAP 為82.8%。相較于DSSD 在綜合性方面有很大的進步,如表2 所示。
首先對比的是針對哪些層進行融合可以使得融合后的整體特征效果更好。在不使用RFB模塊的前提下,分別從是否運用BN 層、層級間的融合方式以及融合的層進行實驗,得到了如表1所示的結果。
其次對比是否融入RFB 模塊或者是特征融合模塊進行實驗分析。相比于只有單獨的RFB 模塊的加入,融入特征融合模塊,在平均精度方面有大概1.1%的提升,檢測速度方面只有略微的下降,實時性仍然能夠具備。本文提出的RFB-feature_fusion 算法同時兼備了準確性與實時性,如表3 所示。

Table 1 Test results of different fusion methods under VOC2007+VOC2012表1 不同融合方式在VOC2007+VOC2012 下檢測結果

Table 2 Test results of different detection algorithms under VOC2007+VOC2012表2 不同檢測算法在VOC2007+VOC2012 下檢測結果

Table 3 Comparison of algorithm effect of incorporating different modules表3 融入不同模塊算法效果對比
接下來對比不同的生成特征金字塔的方法。如果不將生成的融合特征送入預測層,相比在生成的特征金字塔中加入融合特征將會在mAP 上降低0.6 個百分點。如果將所有的Conv 和ReLU 換成bottleneck,這樣將會在mAP上下降0.4個百分點。因此最有效的辦法是在特征金字塔中融入融合特征,如圖6 所示。
在實際應用的小目標檢測中,為了驗證所提算法的準確精度,分別利用了Pascal VOC2007+Pascal VOC2012 以及自制的航拍數據集進行訓練檢測。隨機選取了測試集中的圖片對算法的準確度進行驗證。結果如圖7 和圖8 所示,相對于該數據集在SSD中的檢測,針對小型目標的檢測在檢測到的小目標的個數以及位置方面有了極大的提高。

Fig.6 Feature pyramid fusion map圖6 特征金字塔融合圖
本文算法是一種輕量級的快速檢測小目標的算法,與現在很多采用復雜的特征提取框架算法不同之處在于本文算法采用的是輕量級的backbone。通過感受野模塊以及特征融合模塊,在犧牲少數速度的前提下,增加了檢測的精度,進一步增強了對小目標的檢測效果。在VOC2007+VOC2012 以及在自制的航拍數據集中針對小目標的檢測精度相比于SSD算法有了很大的提升。

Fig.8 Comparison results of different algorithms on aerial photography dataset圖8 不同算法在自制航拍數據集上的對比結果