顧晉,羅素云
(201620 上海市 上海工程技術大學 機械與汽車工程學院)
車輛檢測是目標檢測的一種,目標檢測的發展經歷了傳統檢測方法、機器學習以及現在熱門的深度學習3 類算法階段。傳統的檢測方法主要由3 部分構成滑窗區域選擇、手工設計特征并提取(一般有HOG[1]、SIFT[2]等算法),分類器分類檢測(常用算法有SVM[3]、ADABOOST[4]等)。傳統目標檢測方法的不足主要有:(1)滑窗區域選擇遍歷圖片效率低下,圖片的重要特征所在的部位各不相同,造成時間的浪費嚴重;(2)手工設計特征受外部條件例如光照、陰影、目標形態多變等影響嚴重,魯棒性差;(3)分類器受特征及樣本影響大,易產生假陽性,訓練時間過長等問題。
基于深度學習的目標檢測算法,利用大量的數據完成對模型的訓練[5],其算法的泛化能力、魯棒性更強,更適合目標復雜多變、背景復雜多變的實際應用場景,而不是如傳統檢測算法一樣受限于實際應用中的諸多因素。目前,主流的基于深度神經網絡的目標檢測方法主要分為TWO-STAGE方法和ONE-STAGE方法[6],即基于Region-proposal[7]的TWO-STAGE 方法:R-CNN,Fast R-CNN,MR-CNN 和基于回歸的ONE-STAGE[8]方法:YOLO,SSD。本文提出的改進算法以YOLO v3 為骨架。YOLO 算法于2015年在CVPR2016 上出版,它避免了CNN 算法速度慢的問題,但同時也犧牲了一部分的定位精確度。相對于YOLO-v1,YOLO-9000,YOLO v3 解決了許多前身存在的問題。本文通過簡化YOLO v3 的網絡結構,引入K-means++[9]處理數據集,用更優秀的GIOU 損失函數代替原有的MSE 函數,提升了YOLO v3 的精確度并兼具識別速度。實驗證明,本文提出的改進算法可取得較好的效果,Recall 值達到了88%。
YOLO 系列是基于卷積神經網絡的目標檢測算法[10],本文以YOLO v3 算法為改進對象進行車輛檢測研究。
YOLO 系列算法的基本原理[11]是在圖片輸入后將其分成a×a 個柵格,當圖片中物體的重心位置的坐標落入某個柵格中,那么該柵格負責檢測該物體。每個格子產生多個預測框Bounding boxes 及其置信度object_conf,每個預測框包含5個參數,即(x,y,h,w,置信度)。(x,y)預測邊界中心和對應網格邊界偏移值,寬度(w,h)是幀的寬度和高度與整個圖像的寬度和高度的比值。置信度object_conf 反映是否包含物體以及準確性,如式(1)所示:

式中:Pr(object)——柵格是否包含真實對象,假若柵格中包含物體則Pr(object)取值為1,若不包含則取值為0;——預測框與真實物體區域的交集區域的面積。YOLO 實現原理的示意圖如圖1 所示。

圖1 YOLO 實現原理Fig.1 Realization principle of YOLO
YOLO v3采用Darkent-53網絡結構。Darknet-53 網絡融合了YOLO 9000 的優點以及Darknet-19和新的Residual(殘差) 網 絡。Darknet-19 網絡由19 個卷積層,5 個最大池化層組成[12]。它類似于VGG 模型的傳統網絡結構,假若YOLO v3 從傳統網絡模型增加到53 層,模型結構會過于冗長產生梯度消失問題,所以YOLO v3 引入了ResNet 的Residual 殘差結構,減少了訓練難度。Darknet-19 結構如圖2 所示,Darknet-53 網絡結構如圖3 所示。

圖2 Darknet-19 網絡結構Fig.2 Network structure of Darknet-19

圖3 Darknet-53 網絡結構Fig.3 Network structure of Darknet-53
YOLO v3 的總體網絡結構[13]主要由3 部分組成,分別為(1)輸入部分;(2)基礎網絡部分,YOLO v3 采用的是Darkent-53;(3)特征融合層。
YOLO v3 對圖片的輸入像素有一定的要求,圖中為416×416 像素,假若輸入的圖片過大,需要將圖片Resize 為合適的尺寸,否則算法中的感受野無法完整地感知到圖片。雖然Darknet-53中的卷積核帶有縮小輸出圖片尺寸的效果,但是仍然需要輸入復核尺寸的圖片,才能得到更好的檢測效果。
YOLO v3 基礎網絡部分即Darknet-53,如圖4 所示,由DBL 組件與殘差結構res(n)組成。DBL 組件如圖4 左下角所示,它分別由卷積、BN、激活函數LeakyReLu[14]組成。卷積為1×1與3×3 組成,BN 層的計算公式[15]:

圖4 YOLO v3 總體網絡結構圖Fig.4 Total network structure of YOLO v3

式中:γ——縮放因子;μ——均值;σ2——方差;β——偏置;xconv——卷積計算結果。xconv計算公式如式(3)所示:

式中:res(n)——YOLO v3 的殘差;n——每個殘差塊中有n 個殘差單元。Darknet-53 得益于殘差簡化了網絡結構,避免了梯度問題[16]。
殘差模型圖如圖5 所示。

圖5 殘差模型圖Fig.5 Residual model diagram
特征融合層為圖4 最右側所示。由3 個尺度組成[17],分別為(1)最小尺度Y1 層,輸入13×13 的特征圖,一共1 024 個通道,進行一系列卷積操作,通道數減少為75 個,輸出同樣為13×13 的特征圖,隨后進行分類與回歸定位;(2)中等尺度Y2 層,對79 層的13×13,512通道的特征圖進行卷積操作,進行上采樣,生成26×26,256 通道的特征圖,然后將其與61 層的26×26,512 通道的中尺度特征圖進行合并,最終輸出為26×26 大小的特征圖,75 個通道,然后在此進行分類和定位回歸;(3)最大尺度Y3層,對91 層的26×26,256 通道的特征圖進行卷積操作,生成26×26,128 通道的特征圖,進行上采樣生成52×52,128 通道的特征圖,然后將其與36 層的52×52,256 通道的中尺度特征度合并,進行一系列卷積操作,通道數最后減少為75 個。最終輸出52×52 大小的特征圖,75 個通道,最后在此進行分類和位置回歸。
選擇K-均值聚類算法處理數據。由于K-means 并不適合車輛檢測這類位置變化頻繁的場景,于是采用K-means++算法優化候選區域的選取,提高實驗結果的精度。
means++[18]的算法步驟分別是:(1)從輸入的數據點集合中隨機選擇一個點作為第一個聚類中心;(2)對于數據集中的每一個點x,計算它與最近聚類中心的距離D(x);(3)重新選擇一個D(x)值比較大的數據點作為新的聚類中心,這樣被選為聚類中心的概率較大;(4)重復2和3 直到k 個聚類中心被選出來;(5)利用這k個初始的聚類中心來運行標準的K-means 算法。
標準K-means 的算法過程為:(1)隨機生成初始位置;(2)將所有數據點分類到最近的歐氏質心;(3)計算一個類中所有數據點的位置,并計算出新的質心;(4)重復上述步驟,直到重心位置不再改變。
K-means 的聚類過程如圖6 所示。

圖6 K-means 的聚類過程圖Fig.6 Clustering procedure of K-means
K-means++可以根據實際應用場景選擇合適的聚類中心,盡可能采集數據集中的數據點,將數據集進行分類,使其更加適合YOLO v3 對數據尺寸敏感的特點,從而提升算法的精確度與效率。
YOLO-v3 網絡模型采用Darknet-53,相較于YOLO2 的Darknet-19 引入了殘差,成功簡化了模型結構。簡化模型結構的意義在于更少的參數參與算法計算,減少冗余的通道,減少內存的浪費。此外,訓練過程中結點劃分過程不斷地重復,會造成算法將訓練集自身的特點當作所有的數據都具有的一般性質,從而導致過擬合[19],剪枝處理也可以有效地降低這種風險,降低模型的大小,加快訓練速度。
剪枝算法主要是基于BN 層的γ參數并針對Darknet-53 中的卷積層進行剪枝,γ參數公式如下:

原理為BN 層對通道進行歸一化處理。
模型剪枝是為了減少卷積層中特征性較弱的神經元,進而達到減少不必要的計算、加快速度的目的。主要針對粗粒度剪枝中的通道剪枝。采用BN 層的參數γ[20]作為通道剪枝因子。
剪枝算法的步驟簡單分為以下3 步[21]:(1)對模型進行稀疏化訓練,提取稀疏化后的BN 權重,統計得出的γ并排列,根據一定的比例制定臨界值s;(2)將小于s 的γ減掉,得到剪枝后的模型;(3)對剪枝得到的模型進行通道調整。卷積層剪枝前后部分通道數變化如圖7 所示。

圖7 卷積層剪枝前后部分通道數變化Fig.7 Change of channel's number of convolution layer
如上文所述,在YOLO 層中存在減少通道數的操作,我們進一步減少特征通道數量,更加精簡了模型,加快了模型效率。
YOLO-v3 的損失函數采取的是MSE 回歸策略。YOLO-v3 目標檢測算法的缺陷是對輸入圖像的尺寸非常敏感,原因就在于MSE 函數作為YOLO-v3 的損失函數對目標的尺度非常敏感[22]。MSE 損失函數的模型圖如圖8 所示。

圖8 MSE 損失函數的模型圖Fig.8 Model diagram of MSE loss function
本文提出用GIOU 回歸策略替代MSE 回歸策略,GIOU 函數模型圖如圖9 所示。

圖9 GIOU 函數模型圖Fig.9 Diagram of GIOU model
GIOU 函數計算公式如下:

相比于MSE 與現如今使用較多的IOU 回歸策略,GIOU 有如下優點:(1)GIOU 具有作為一個度量標準的優良性質;(2)具有尺度不變性;(3)GIOU 的值是小于IOU 的值的;(4)在A,B 沒有良好對齊時,會導致C 的面積增大,從而使GIOU 的值變小,在矩形框沒有重疊區域時依然可以計算損失函數值,比IOU 函數更加優秀[23]。
采用GIOU 回歸策略代替原有MSE 回歸策略可以有效解決YOLO-v3 車輛檢測算法對輸入圖形尺寸過于敏感導致精度差的問題。
本實驗是在Windows 系統下進行的。采用Nvidia GeForce RTX2060 顯卡,Intel 酷睿i7-10875H 8 核16 線程CPU處理器,32G內存。深度學習框架為KERAS-YOLO v3。為了提高計算速度,減少訓練時間,在NVIDIA 官網上下載CUDA-Enabled GeForce and TITAN Products 調用GPU 進行訓練。
本實驗采用COCO 車輛類別數據集,共下載了80 000 張圖片。YOLO-v3 訓練中不一定需要負樣本,我們只需標出需要檢測的樣本即可。訓練集,測試集,驗證集按3∶1∶1 劃分。隨后制作標簽覆蓋檢測圖片的正確位置。
Darknet-53 使用COCO2017 車輛類別數據集訓練YOLO-v3 的步驟分別為:(1)將COCO 的Instances_val(train)2017.json 標簽轉為VOC(.xml)的標簽;(2)分別得到了訓練集的xml 和訓練過程中的測試集的xml 之后,我們進一步使用腳本轉化xml 為txt,其中分為2 部分。第1 部分將所有xml 的路徑取出來放到train_all.txt 中,第2部分將得到的文件一起整理好,生成每個xml 對應的txt 標簽;(3)最后將擬生成的txt 標簽放到VOC2020 的labels 的train2017 和val2017 下面就可以開始訓練darknet 了。
對改進過的YOLO-v3 車輛檢測算法指標進行了動態記錄。平均損失函數的變化如圖10 所示。

圖10 平均損失函數的變化Fig.10 Diagram of Avg_loss
在平均準確度與召回率方面,將原YOLO-v3算法和改進過后的YOLO-v3 算法進行了比較,兩者均在COCO 數據集上進行測試。從表1 可以看出,本文提出的改進的YOLO-v3 車輛檢測算法Map 值達到81.3%,原算法Map 值為75.5%。召回率改進后的算法可以達到88.18%,原算法只有85.11%。檢測幀率也得到了提高,表明改進后的YOLO-v3 車輛檢測算法檢測效果比原算法更高,更準確。

表1 Map 值與召回率比較結果Tab.1 Results of Map and Recall comparison
利用改進的算法對2 個視頻進行了測試,分別為高速公路錄像視頻,以及車輛車載鏡頭視頻,測試結果如圖11 所示。
本文提出的基于YOLO-v3 的改進算法的實際測試結果如圖11 所示。從圖(a),圖(b),圖(c),圖(d),圖(e),圖(j)中可以看出該算法對密集對象檢測效果非常好;從圖(h)中可以看出對突然出現的車輛檢測效果很好;從圖(g),圖(i),圖(k)中可以看出,改進過后的算法對尺寸較小、較密集的物體檢測效果良好。

圖11 測試結果Fig.11 Result of test
基于YOLO-v3 的車輛檢測算法,利用深度學習的特點,有效避免了傳統算法需要人工選擇特征的弊端。本文首先采用K-means++聚類策略處理數據有效避免了梯度問題,提高了之后的檢測效率。隨后通過模型剪枝以及采用新的回歸策略,進一步提高了YOLO-v3 的檢測效率和精準度。實驗結果和現實測試結果表明,本文提出的基于改進的YOLO-v3 車輛檢測算法比原有算法的效果有所提高。