陳灝然,彭 力
物聯(lián)網(wǎng)技術(shù)應(yīng)用教育部工程研究中心(江南大學(xué)物聯(lián)網(wǎng)工程學(xué)院),江蘇無錫 214122
目標(biāo)檢測是當(dāng)下計算機視覺研究的重點之一。傳統(tǒng)的目標(biāo)檢測算法有常用于人臉檢測的Harr[1]特征以及在行人檢測和普通常規(guī)目標(biāo)檢測中所用的HOG[2]特征。這些傳統(tǒng)的算法有兩個重要的難以避免的缺陷:(1)用滑動窗口策略進(jìn)行區(qū)域選擇時針對性不強,增加了時間復(fù)雜度及窗口的冗余;(2)手動設(shè)計的特征對于目標(biāo)的多樣性并沒有很強的魯棒性。
隨著卷積神經(jīng)網(wǎng)絡(luò)的不斷改進(jìn),針對目標(biāo)檢測的研究開始真正進(jìn)入了深度學(xué)習(xí)的時代。當(dāng)下主流基于深度學(xué)習(xí)進(jìn)行目標(biāo)檢測的主要有one-stage(一階)與two-stage(二階)兩種。Two-stage 是準(zhǔn)確度的代表,one-stage 則是速度的代表。自此,目標(biāo)檢測成為了一個多任務(wù)學(xué)習(xí)的問題。
Two-stage 類算法首先是產(chǎn)生候選區(qū)域,然后對候選區(qū)域進(jìn)行分類。Girshick 等人于2014 年提出的R-CNN(region-convolutional neural networks)[3]是利用卷積神經(jīng)網(wǎng)絡(luò)進(jìn)行目標(biāo)檢測的開端。其兩步法主要是利用類似于機器學(xué)習(xí)中的局類算法,對圖像分組得到多個候選框的層次組,隨后進(jìn)行分類。在R-CNN 的基礎(chǔ)之上,Girshick 于2015 年提出了Fast R-CNN[4],在之前的基礎(chǔ)上針對每個候選區(qū)域添加ROI Pooling[5]進(jìn)行池化操作,隨后采用softmax[6]取代SVM(support vector machine)[7]進(jìn)行多分類的操作,并且利用回歸模型進(jìn)行邊框位置與大小的微調(diào)。2015 年,Ren 等人在Fast R-CNN 的基礎(chǔ)上提出了Faster R-CNN[8],將特征提取、候選區(qū)域、邊界框回歸、分類整合到了一個網(wǎng)絡(luò)中,借此提高綜合性能。雖然在精度上有了極大的提高,但是仍然不能真正實現(xiàn)端到端的檢測。
基于候選區(qū)域的深度學(xué)習(xí)目標(biāo)檢測類算法在速度方面并沒有很大的改進(jìn),針對目標(biāo)的提取仍然具有很大的復(fù)雜度,導(dǎo)致時效性比較差。One-stage類算法因此被提出,主要有YOLO[9](you only look once)、SSD[10](single shot multibox detector)以及以這兩個算法為主衍生的算法。
Redmon 等人于2016 年提出的YOLO 算法主要是通過候選區(qū)域產(chǎn)生大量的可能包含待檢測物體的潛在邊界框,然后用分類器去判斷每個邊界框里是否包含物體以及物體所屬類別可能性以及置信度。相較于基于候選區(qū)域檢測目標(biāo)在實時性方面有了很大的進(jìn)步,但是在準(zhǔn)確度以及對于小物體的檢測效果并不十分理想。
Liu 于2016 年提出的SSD 算法主要利用了金字塔結(jié)構(gòu)的特征提取層進(jìn)行特征圖的提取,將多個卷積層提取的特征圖進(jìn)行softmax 分類和位置回歸。YOLO 僅利用了高層特征圖導(dǎo)致低層語義信息的缺失,從而導(dǎo)致小目標(biāo)的檢測效果不是十分顯著。SSD雖然也利用了低層級的語義信息,但是這樣的每個層級單獨分類和回歸導(dǎo)致每個層級間并沒有直接的關(guān)聯(lián),導(dǎo)致上下層語義信息并沒有很好地交融,小目標(biāo)檢測的效果仍然不是那么顯著。
Liu 深知SSD 的優(yōu)點與缺點,故與Fu 聯(lián)合發(fā)表了DSSD(deconvolution single shot multibox detector)[11]算法。在SSD 卷積層之后,添加了輔助卷積層以及相對應(yīng)的不對稱反卷積層。同時將基礎(chǔ)網(wǎng)絡(luò)VGG-16 換成Resnet101[12],增強特征提取的同時也增加了特征融合,但是不可避免地增加了計算量,導(dǎo)致速度變慢。除此之外,由于Resnet 網(wǎng)絡(luò)的特性,其下采樣stride=4,這樣也直接導(dǎo)致其對于小目標(biāo)的檢測仍然不是特別好。
由Cao 等人提出的Feature-Fused SSD[13]算法同樣融合了上下文信息,它的基礎(chǔ)網(wǎng)絡(luò)仍然是VGG-16,與DSSD 不同之處是利用融合高層的語義信息去感知低層的語義信息。
基于現(xiàn)有的理論,提出了一種基于SSD,利用感受野以及多尺度融合的算法。首先在特征提取階段,本文算法利用了基于VGG-16的主體框架。作為輕量級的backbone,VGG-16 具有更高的特征提取效率,同時在特征提取層中加入RFB[14](receptive field block)模塊,通過模擬人類視覺感受野加強網(wǎng)絡(luò)在特征方面的提取能力。此外,加入了特征融合模塊,將上下文信息進(jìn)行有效的融合,從而加強對小目標(biāo)的檢測精度。
針對小目標(biāo)的檢測一直是深度學(xué)習(xí)圖像檢測的一個難題[15],與較大型目標(biāo)相比小目標(biāo)不論是數(shù)量還是大小在圖片中往往占據(jù)很小的比例。正因為小目標(biāo)的低分辨率,圖像相對更模糊并且攜帶的信息過少導(dǎo)致其表征能力很弱。此外,神經(jīng)網(wǎng)絡(luò)中的主導(dǎo)為大型目標(biāo),也會導(dǎo)致小目標(biāo)的被動忽視,導(dǎo)致其檢測效果差。
神經(jīng)學(xué)發(fā)現(xiàn),在人類視覺皮層中,群體感受野的尺度是其視網(wǎng)膜偏心度的函數(shù),其尺度與視網(wǎng)膜圖的偏離度正相關(guān),且不同視網(wǎng)膜圖上群體感受野的尺度不一樣。Receptive field block 是一個類似inception[16]模塊的多分支卷積模塊,它的內(nèi)部結(jié)構(gòu)分為多分支卷積層以及與之相連的膨脹卷積層,通過連接的多個分支卷積核以獲得不同尺度的感受野,如圖1 所示。
多分支卷積部分,借鑒了inception 的結(jié)構(gòu),同時加入旁路剪枝,用以減少大量的卷積核通道數(shù)。首先用1×1 的卷積核來實現(xiàn)通道的交互和信息整合以及進(jìn)行卷積核通道數(shù)的降維。隨后將兩個5×5 的卷積核替換為兩個3×3 的卷積核以減少參數(shù)量,同時增強模型的非線性能力。此外,進(jìn)一步使用1×n和n×1的卷積核替代原有的n×n卷積核用以增強寬度和高度上的特征。同時設(shè)置旁路剪枝以減少卷積核的通道數(shù),降低參數(shù)計算量。
膨脹卷積部分,最初于DeeplapV2 中被提出,在保持參數(shù)量和同樣感受野的情況下,用來獲取更高分辨率的特征,膨脹卷積歸根到底是對卷積核進(jìn)行填充。膨脹后的卷積核大小計算公式為:
在每個常規(guī)卷積核后都會連接膨脹卷積層,隨后各個分支concate[17]再后接1×1 卷積核用以與同層feature map 下的特征結(jié)合,同時減少通道參數(shù),形成了類似人類感知視覺的模式。即離中心越近,貢獻(xiàn)越高,反之越小。最后將concate 后的特征圖與剪枝進(jìn)行對位相乘。
主體仍然沿用了SSD的backbone。VGG-16采用了連續(xù)的3×3 卷積核并且后接池化層。對于給定大小的輸入圖片,采用連續(xù)的堆積小的卷積核是因為多層非線性層可以在增加網(wǎng)絡(luò)深度的情況下,做到保持復(fù)雜度的同時減少參數(shù)。相比早期的AlexNet,減小了卷積核的大小,確保了參數(shù)量的下降。相比擁有更多卷積層的DenseNet、ResNet 等網(wǎng)絡(luò),VGG-16的卷積層數(shù)較少避免了過擬合現(xiàn)象的發(fā)生?;诂F(xiàn)有的先驗知識,VGG-16 在實時性方面相對于重量級網(wǎng)絡(luò)有很大的速度優(yōu)勢。與更輕量級的mobilenet[18]相比,VGG-16 因為擁有更多的卷積層,所以在犧牲較少實時性的同時具有更強的特征提取能力。
在原始的VGG-16 網(wǎng)絡(luò)上是沒有BN[19](batch normalization)層的,這里選擇添加BN 層,因為神經(jīng)網(wǎng)絡(luò)一旦訓(xùn)練起來,便會更新大量參數(shù),除了輸入層的數(shù)據(jù)外,后面網(wǎng)絡(luò)層的輸入數(shù)據(jù)分布是一直在發(fā)生變化的,數(shù)據(jù)的不斷變化會影響網(wǎng)絡(luò)的訓(xùn)練速度,添加BN 層可以使得網(wǎng)絡(luò)收斂性更加快速。一般情況下可以通過調(diào)整學(xué)習(xí)率、權(quán)重衰減系數(shù)、Dropout比例等,對這些參數(shù)同時進(jìn)行調(diào)整并且多次實驗,這樣必定會浪費大量的時間用于調(diào)整參數(shù)上。實驗過程中,在不加BN 層的情況下,單一地調(diào)整學(xué)習(xí)率和權(quán)重系數(shù)等參數(shù),損失值依然很大,說明梯度問題未得到改善。因為原網(wǎng)絡(luò)的輸入特征在未經(jīng)過線性歸一化的情況下,需要網(wǎng)絡(luò)主動去調(diào)整學(xué)習(xí)適應(yīng)輸入特征的均值和方差。因此選擇在網(wǎng)絡(luò)層間添加BN 層,也就相當(dāng)于多了一個映射層,使得網(wǎng)絡(luò)不必花費大量的時間調(diào)整自己去適應(yīng)輸入特征,極大地加速了網(wǎng)絡(luò)的收斂以及梯度的下降。此外,BN 層可以完全取代具有相同歸一化功效的Dropout 層,使得改進(jìn)后的網(wǎng)絡(luò)在空間復(fù)雜度方面得到了優(yōu)化。
添加BN 層后,適當(dāng)提高學(xué)習(xí)率,并且將fc6 與fc7 全連接層做up-sampling[20]后變成卷積層,因為全連接層會破壞圖像的空間結(jié)構(gòu),故將其替換為卷積層。對于10×10 的特征圖,不直接在上面采用Receptive field block,因為在這些提取到的特征圖中能夠獲得的信息量較小。
早先的SSD 主體框架在各個層級上是分別進(jìn)行特征提取并且直接預(yù)測的,此外各個層級之間并無直接的關(guān)聯(lián),這樣就導(dǎo)致對中小型的目標(biāo)的檢測并不是那么準(zhǔn)確,SSD 的預(yù)測結(jié)構(gòu)圖如圖2 所示。
Fig.2 SSD prediction structure圖2 SSD 預(yù)測結(jié)構(gòu)圖
現(xiàn)在需要做的是將各個預(yù)測層連接起來,讓高層的語義信息和低層的語義信息能夠更好地融合。因為相較于低層的語義信息,更深的卷積神經(jīng)網(wǎng)絡(luò)能夠檢測到更多的語義信息,并且這些語義信息都具有平移不變性,對于目標(biāo)類別的檢測更加有效。特征融合預(yù)測結(jié)構(gòu)圖如圖3 所示。
Fig.3 Feature fusion prediction structure圖3 特征融合預(yù)測結(jié)構(gòu)圖
實際的特征融合過程中,Conv3_3 由于融合效果不算顯著,且增加了額外的計算量,因此并沒有被加入到特征融合模塊中。當(dāng)提取到的特征圖分辨率低于10×10 之后,特征中所包含的信息就會較少,Conv8_2以及Conv9_2 的特征圖大小分別為3×3 以及1×1,故將其替換為RFB 模塊,不參與融合。實際的實驗中首先采用了Conv3_3、Conv4_3、fc7、Conv7_2 進(jìn)行融合,實際實驗中與只融合Conv4_3、fc7、Conv7_2 進(jìn)行對比,并沒有顯著提升,且相對于后者,增加了計算量,故不選擇Conv3_3 進(jìn)行融合。同時,在特征融合模塊中加入感受野模塊,首先是為了能夠降低通道參數(shù),減少參數(shù)計算量,其次是確保在保持參數(shù)量和同樣感受野的情況下,用來獲取更高分辨率的特征,特征融合結(jié)構(gòu)圖如圖4 所示。
選擇fc7 以及Conv7_2 進(jìn)行雙線性插值操作,并將新生成的特征圖進(jìn)行concate,因為相較于elementwise[21]融合操作,concate的操作時間更短,效果更好。
Fig.4 Feature fusion structure圖4 特征融合結(jié)構(gòu)圖
系統(tǒng)的整體框架依然沿用了SSD 的整體結(jié)構(gòu),在Vgg16 的整體基礎(chǔ)上替換Conv8 以及Conv9 為膨脹卷積層,因為該層提取到的特征分辨率可以應(yīng)用5×5 的卷積核,而最后幾層分辨率太低無法應(yīng)用,故只替換了Conv8 以及Conv9,同時在特征融合的過程中加入膨脹卷積層。
經(jīng)過融合實驗之后,以Conv4_3 為基礎(chǔ)層,其特征圖大小為38×38,將其通過RFB 模塊之后再進(jìn)行1×1 卷積,用以減少特征圖的通道數(shù),Conv7_fc 的分辨率為19×19,Conv7_2 的分辨率為10×10,通過RFB通道后其分辨需要與Conv4_3 卷積后的特征圖的width、height 一致,故需要進(jìn)行雙線性插值操作使其分辨率一致。隨后進(jìn)行concate 操作將其融合在一起。相較于原始的SSD 網(wǎng)絡(luò),增加的僅僅是融合部分以及替換Conv8、Conv9 后通過感受野模塊的計算量。相較于SSD 的FPS,雖然大幅下降,但是其平均精度mAP 提升了4.6 個百分點,相較于原始的僅僅加入感受野模塊提升了1.3 個百分點。同時相比于原始的SSD 網(wǎng)絡(luò),增加了層間的BN 層,極大降低了梯度,防止訓(xùn)練過程中梯度爆炸的現(xiàn)象發(fā)生,整體算法結(jié)構(gòu)如圖5 所示。
Fig.5 Block diagram of proposed algorithm圖5 本文算法結(jié)構(gòu)圖
本文所用的深度學(xué)習(xí)框架是pytorch-0.4.0,所用的操作系統(tǒng)為ubuntu16.04。硬件方面所用的GPU顯卡為4*1080Ti,內(nèi)存為16 GB,CUDA 版本為9.0,CUDNN版本為7.0。訓(xùn)練分別采用了Pascal VOC2007、Pascal VOC2012 以及自制航拍數(shù)據(jù)集[22]。VOC2007數(shù)據(jù)集包括9 963 張圖片,總共20 類物體。VOC2012數(shù)據(jù)集包括12 031 張圖片,總共20 類物體。引用的自制航拍數(shù)據(jù)集總共55 740 張圖片共計12 類物體。訓(xùn)練的batch size 選擇為32,max_epoch(訓(xùn)練總輪數(shù))設(shè)置為300。為了使得訓(xùn)練的損失平穩(wěn),在各個epoch設(shè)置了間斷的權(quán)重衰減,沖量為0.9。設(shè)置初始學(xué)習(xí)率為0.006,將學(xué)習(xí)率衰減系數(shù)設(shè)置為gamma=0.2。在初始的11 個epoch 階段,設(shè)置了預(yù)熱階段,此時的學(xué)習(xí)率為0.000 001。因為本文算法沒有經(jīng)過預(yù)訓(xùn)練,所以為了防止損失率出現(xiàn)等于Nan 的情況,需要進(jìn)行預(yù)熱階段。同時,為了保持損失率的穩(wěn)定下降,分別在epoch=150,epoch=180,epoch=210,epoch=240共計4 個階段設(shè)置學(xué)習(xí)率衰減點,實驗結(jié)果如表1~表3 所示。
本文提出的RFB-feature_fusion 算法在VOC2007+VOC2012 上的mAP 為81.8%,相比于SSD 算法有4.6個百分點的提升,同時相比于DSSD 有3.2 個百分點的提升。此外,本文算法所引用的自制航拍數(shù)據(jù)集的mAP 為82.8%。相較于DSSD 在綜合性方面有很大的進(jìn)步,如表2 所示。
首先對比的是針對哪些層進(jìn)行融合可以使得融合后的整體特征效果更好。在不使用RFB模塊的前提下,分別從是否運用BN 層、層級間的融合方式以及融合的層進(jìn)行實驗,得到了如表1所示的結(jié)果。
其次對比是否融入RFB 模塊或者是特征融合模塊進(jìn)行實驗分析。相比于只有單獨的RFB 模塊的加入,融入特征融合模塊,在平均精度方面有大概1.1%的提升,檢測速度方面只有略微的下降,實時性仍然能夠具備。本文提出的RFB-feature_fusion 算法同時兼?zhèn)淞藴?zhǔn)確性與實時性,如表3 所示。
Table 1 Test results of different fusion methods under VOC2007+VOC2012表1 不同融合方式在VOC2007+VOC2012 下檢測結(jié)果
Table 2 Test results of different detection algorithms under VOC2007+VOC2012表2 不同檢測算法在VOC2007+VOC2012 下檢測結(jié)果
Table 3 Comparison of algorithm effect of incorporating different modules表3 融入不同模塊算法效果對比
接下來對比不同的生成特征金字塔的方法。如果不將生成的融合特征送入預(yù)測層,相比在生成的特征金字塔中加入融合特征將會在mAP 上降低0.6 個百分點。如果將所有的Conv 和ReLU 換成bottleneck,這樣將會在mAP上下降0.4個百分點。因此最有效的辦法是在特征金字塔中融入融合特征,如圖6 所示。
在實際應(yīng)用的小目標(biāo)檢測中,為了驗證所提算法的準(zhǔn)確精度,分別利用了Pascal VOC2007+Pascal VOC2012 以及自制的航拍數(shù)據(jù)集進(jìn)行訓(xùn)練檢測。隨機選取了測試集中的圖片對算法的準(zhǔn)確度進(jìn)行驗證。結(jié)果如圖7 和圖8 所示,相對于該數(shù)據(jù)集在SSD中的檢測,針對小型目標(biāo)的檢測在檢測到的小目標(biāo)的個數(shù)以及位置方面有了極大的提高。
Fig.6 Feature pyramid fusion map圖6 特征金字塔融合圖
本文算法是一種輕量級的快速檢測小目標(biāo)的算法,與現(xiàn)在很多采用復(fù)雜的特征提取框架算法不同之處在于本文算法采用的是輕量級的backbone。通過感受野模塊以及特征融合模塊,在犧牲少數(shù)速度的前提下,增加了檢測的精度,進(jìn)一步增強了對小目標(biāo)的檢測效果。在VOC2007+VOC2012 以及在自制的航拍數(shù)據(jù)集中針對小目標(biāo)的檢測精度相比于SSD算法有了很大的提升。
Fig.8 Comparison results of different algorithms on aerial photography dataset圖8 不同算法在自制航拍數(shù)據(jù)集上的對比結(jié)果