廖慕欽, 周永軍, 湯小紅, 蔣淑霞, 李宇瓊
(中南林業科技大學 機電工程學院,湖南 長沙 410000)
在自動駕駛中,車輛檢測作為一個必不可少的部分而廣受關注[1]。計算機視覺車輛檢測算法主要有兩種,傳統目標檢測算法和基于深度學習的方法。
傳統機器視覺算法的優劣取決于特征提取的效果。崔江等人針對車輛側面檢測提出一種基于圖像濾波與匹配技術的方法[2]。針對車輛重疊現象,朱世松等人使用背景差分法利用車輛輪廓的特征點實現了車輛檢測[3]。Jheng Y J等人利用Sobel邊緣檢測的方法,對圖片中車道線與陰影部分進行感興趣區域提取,并和車輛目標進行匹配,以此定位車輛目標[4]。Coifman B等人針對車輛部分遮擋問題,提出利用角點特征實現多車輛跟蹤[5]。這些算法依賴手工調參,特征表達能力不強,所以準確度與檢測速度均不理想。
近年來,深度學習發展迅速,基于深度學習的車輛檢測漸漸成為主流。趙餛等人改進 Fast-RCNN ,在其中融入邊緣信息,以此實現快速、準確的車輛檢測[6]。Chabot F等人提出Deep MANTA檢測算法,利用卷積神經網絡(covolutional neural networks,CNN)對圖像中的車輛進行多任務分析,同時實現了車輛檢測、零部件定位、汽車3D尺寸估計等目標[7]。Chen X等人對Faster-RCNN進行改進,將激光雷達點云特征與局部圖像特征融合,直接回歸車輛的3D信息[8]。Tang T等人對數據集進行增強,利用一階段回歸算法YOLO檢測車輛,提高了檢測模型的泛化能力和檢測速度,但相對準確率較低[9]。這些方法雖然準確率較傳統方法有所上升,但模型參數量較大,不適用于嵌入式平臺。
由于深度卷積神經網絡的層級較多,參數量相對較大,難以部署到移動端,如何在保證檢測精準度的前提下盡量減少模型參數量是研究重點方向。SSD是2016年Liu W等人[10]提出的優秀算法,其檢測準確率與速度均有較好的表現。MobilenetV3是2019年Google在前兩代的基礎上得到的輕量化模型,檢測準確率較高的同時占用內存少。SSD算法的基礎網絡為VGG16,模型參數量大不適用于嵌入式平臺。
本文針對此問題結合MobilenetV3占用內存小的優點,將SSD的基礎網絡替換為MobilenetV3,同時加入遷移學習思想,對MobilenetV3進行預訓練,使其在精度與參數量上都有更好的表現。
SSD的設計理念有以下三點:1)檢測采用大小不同的特征圖;2)特征提取直接由卷積完成,融合不同卷積層特征圖以增強表達能力;3)設置多個大小不同的先驗框,以先驗框為基礎對回歸框(bounding boxes)進行預測。SSD使用VGG16作為主網絡,修改最后兩個全連接層為卷積層,在末尾添加4個卷積層擴充網絡結構。圖1為SSD網絡主要結構。

圖1 SSD算法結構
SSD的算法流程如圖2所示。

圖2 SSD的算法流程圖
SSD的損失函數采用一種“multibox loss”計算方法,將定位損失與置信度損失相加得到總損失值,計算公式為
(1)
式中L為總損失;x為第i個預測框(prior box)匹配到第j個真實框(ground truth box)是否為p類別,匹配時x=1,若不匹配則x=0;c為所選框屬于類別p的置信度;l為預測值;g為真實值;N為匹配到GT(ground truth)的prior box數量;Lconf為置信度損失,Lloc為定位損失。


(2)
MobilenetV3是在前兩代的基礎上,由神經結構搜索(NAS)和NetAdapt算法改進而成,其核心技術為:1)使用5×5卷積代替部分3×3卷積,實驗表明能提高網絡性能;2)模型的整體結構基于NAS實現的MnasNet模型,其核心為(squeeze and excitation,SE)結構的輕量級注意力模型;3)繼承自MobilenetV1的深度可分離卷積和MobilenetV2的倒殘差結構和線性瓶頸結構;4)修改激活函數,使用改進的H-Swish代替部分ReLU6函數。H-swish函數是從Swish函數改進而來,實驗表明Swish激活函數能有效提高模型識別準確率,但是Swish函數計算量太大,所以對其進行了優化,具體變化如下所示
swish(x)=x·σ(x)
(3)
(4)
在網絡模型結構上,MobilenetV3在MobilenetV2的基礎上重新設計最后階段,使其在不損失準確率的情況下減少計算量,具體改動如圖3所示。

圖3 改進前、后最后階段網絡結構
SSD-MobilenetV3結合SSD檢測速度快和MobilenetV3占用內存小的優點,使用MobilenetV3替換VGG16。模型一共由29層組成,其中前17層為MobilenetV3特征提取網絡,剩下的12層網絡負責為SSD網絡提供不同的特征圖,與經典SSD模型一致。SSD網絡總計需要6個不同的尺度特征,第14層和17層提供前2個尺度,后12層提供后4個尺度。前17層特征提取部分網絡具體結構如表1所示,其中,Operator代表特征層將進行的Block操作;BNeck是瓶頸層(bottleneck layers),其中的每一層都代表一個MobileBlock,整個網絡由多個這樣的模塊組成;Exp size為膨脹參數,是BNeck內倒殘差結構上升后的通道數;# Out為輸入到BNeck時特征層的通道數;SE為Squeeze-and-Excite結構,0表示不含有,1表示含有;NL為Non-Linearity,也就是激活函數,HS表示H-Swish函數,RE表示ReLU函數;s表示每一次Block結構的步長。

表1 特征提取部分網絡結構
遷移學習就是將模型在大型數據集上預訓練出模型參數,然后將其應用到新環境加速其收斂速度。本文在大型數據集COCO上對MobilenetV3進行預訓練,將模型初始化之后,只需對最后一層全連接層進行重訓練,就能快速得到效果較好的網絡模型。將預訓練好的模型放進網絡中并使用汽車數據集對SSD-MobilenetV3網絡第17層重新訓練,將訓練結果輸入到SSD分類器中,具體訓練流程如圖4所示。

圖4 SSD-MobilenetV3預訓練流程
本次訓練的深度學習框架為Tensorflow,編程語言為Python,集成開發環境為Pycharm,程序運行平臺為Windows10系統搭載GeForce RTX 2080顯卡,具體環境設置Python為3.6.8版;Tensorflow-GPU為1.13.1版;CUDA為10.0版;Cudnn為10.0版。
本文數據集由KITTI與BIT-Vehicle合并而成。數據集總計17 331張圖片,挑選其中90 %為訓練集,共15 597張,取訓練集中2 340張作為驗證集,測試集占10 %,共1 734張。數據集包括不同大小、不同光照、不同路況等各個場景的車輛。本文主要目的是車輛定位檢測,不需要將車輛分類,所以在標簽中將car,van,truck,tram等類型的車輛合并成car一類,同時去除車輛以外的圖片以及標簽,部分未標注圖片采用Labellmg進行手動標注。
超參數根據經驗選擇,本次訓練Batchsize選擇64,訓練40 000步。學習率的設置采用WarmUp預熱學習率的方法,如圖5所示。訓練開始時選用小的學習率0.13進行訓練,每2 000步增大一次,最終達到初始設定學習率0.4,隨后逐漸衰減,40 000步后學習率衰減為0.000 013。這樣可以使模型訓練更加穩定,有助于模型收斂,效果更好。結果顯示平均每一步訓練時長大約為0.25 s,總損失在15 000步左右趨于平穩,最后總損失在0.5左右,如圖6所示。

圖5 學習率變化曲線

圖6 損失值收斂曲線
模型訓練好之后使用測試集測試,部分測試結果如圖7所示。

圖7 模型檢測效果
由圖7(a)可以看出模型檢測率較高,在復雜路況也能準確的檢測出車輛回歸框位置,但對小目標檢測準確率不高;從圖7(b),(d),(f)可知在環境與路況簡單情況下,模型檢測準確率非常高,達到90 %以上;圖7(c)顯示在環境復雜,但路況簡單的情況下,檢測準確率在80 %以上;從圖7(e)可知在環境復雜,車輛較多,且車輛較為雜亂的情況下會出現漏檢與誤檢現象,且檢測準確率明顯下降。
使用檢測準確率與模型大小對模型性能進行分析評估。在同樣環境下,將本文模型與經典模型SSD,Faster-RCNN,YOLO進行對比,具體數值如表2所示。

表2 常用模型檢測性能對比
從表2中可以看出,本文算法準確率對比原SSD與YOLO均有提升,略低于Faster-RCNN,參數量相對各經典模型均大幅減少。本文算法效果比經典模型效果好的原因主要有以下兩點:1)使用遷移學習的方法,用COCO數據集進行預訓練,有效的對網絡進行了初始化,同時使用Warmup學習率設置方法,使網絡平穩快速收斂;2)將基礎模型從傳統的VGG替換成性能較好的MobilenetV3,所以融合網絡準確率有小幅提升,網絡模型參數量大幅減少,本文模型相對于原SSD參數量減少了83.1 %,更適合嵌入式平臺使用。
本文提出的融合網絡模型SSD-MobilenetV3結合SSD網絡檢測速度快和MobilenetV3網絡參數量少的特點,將SSD的主網絡替換成MobilenetV3,并結合遷移學習的方法對MobilenetV3進行預訓練,在提高準確率的同時減少參數量,更適用于自動駕駛嵌入式平臺。實驗結果表明:本文提出的SSD-MobilenetV3模型檢測準確率為85.6 %,相對原SSD提高了3.1 %,同時模型參數量減少了83.1 %。模型的不足之處在于對復雜路況的檢測效果不理想,出現重復檢測和漏檢測現象,還需在下一步的研究工作中提高模型對復雜路況的檢測能力。