周萬奇,李丹
(四川大學錦城學院,四川成都,611731)
中國是一個領土面積大且人口數量眾多的國家,隨著人們的生活水平不斷提高家家戶戶都擁有汽車。因此交通問題便是人們所關心的問題例如:車與車之間的矛盾、人與車之間的矛盾。若是用人去解決這樣的矛盾,這需要花費很多的人力。因此我們需要去用智能化的方法去解決這樣的問題。
對于目前來說,能做智能化的去感知交通情況的相關算法有很多。都可以去完成目標檢測。例如較為經典的R-CNN、Faster R-CNN等基于候選框生成檢測的。這些較為經典的算法對于目標檢測來說都有很高的精確度,但是他們的速度相對于Yolo V4來說使比較慢的。但是在車流量都較為密集的地方,我們還是需要一個速度較為塊,且精度不低的算法去實現目標的快速檢測。因此選擇Yolo V4是一個不錯的選擇,它基于Yolo V3進行的改進。不僅在速度得到了提升,在精度方面也得到了提升。進而更好的對人和車進行檢測。
大多數基于CNN的目標檢測只能使用在推薦的系統上。雖然精確但是較為緩慢。但是車流量和人流量高的地方,這是需要快速去識別的。因此選擇Yolo v4相對于來說是比較符合需求的。Yolo V4是一種單階段目標檢測的算法,該算法在Yolo v3的基礎上添加了一些新的改進思路并且在原論文中給出兩個很好的概念Bag of freebies(目標檢測器在不用增加推理成本,讓精確度更好)和Bag of specials(僅增加少量推理成本但可以顯著的提高對象檢測準確性),同時YOLO V4在coco數據集上不僅達到了43.5%Ap而且能達到65FPS。使得其速度與精度都得到了極大的性能提升。Yolo V4算法主要有三個大部分組成。第一個部分就是其主干網絡部分,主干網絡采用的是CSPDarkNet53用來提取模型中的特征還有DropBlock,馬賽克數據增強。第二個部分是脖子部分(neck)包括SPP和PANet。第三個部分就是Yolo head部分,里面包含損失函數GIOU_Loss。圖1是YoloV4的整個網絡結構。

圖1 Yolo V4網絡結構
在主干網絡部分,YoloV4沒有繼續的沿用YoloV3的主干網絡DarkNet,而是采用了CSPDarknet53網絡。該網絡的輸入圖像大小為608*608,圖片輸入到網絡中后,會對圖片進行預處理,也就是把輸入的圖片大小縮放到網絡的輸入大小。同時網絡中擁有52個卷積。輸入的圖片先經過有32個過濾器的卷積核去卷積,將得到的特征層在經過5個殘差單元,并且在每個單元中會去進行重復的卷積操作且多是先進行1*1在繼續進行一個3*3的卷積操作,而且每個單元分別重復卷積操作的次數為(1、2、8、8、4),再將在這一步分得到的3個輸出結果分別做不同的處理,使用CSPDarknet53的優點有三方面1:增強了CNN的學習能力,在輕量化的同時保持準確性、2:降低了計算瓶頸、3:降低內存成本。雖然整個的主干網絡看起來和Yolo v3差不多,但是再DarknetConv2D中把激活函數進行了替換,改為了Mish函數。
使用Mish函數是因為Mish函數是個無界函數,同時梯度更加的平滑,能讓更好的信息進入到神經網絡中去。
此外除了激活函數的改變,還將殘差網絡的結構也進行了改變。使用的是CSPNet網絡,將殘差塊拆分成兩個部分。主要部分就繼續進行殘差堆疊,另一邊則是一個殘差邊,最后與主要部分進行結合輸出。CSPNnet結構如圖2所示

圖2 CSPNet結構以及對比圖
在主干網絡部分,會對3個特征層進行利用,分別是主干網絡中的倒數3層如圖1所示。其中(19,19,1024)的特征層會被送入到SPP采用1*1、1*5、9*9、13*13的最大池化方式,進行多尺度融合。SPP可以將模型的感受野增大,將最顯著的上下文特征分離出來。然后將得到的特征層,和(76,76,256)、(38,38,512)一同放入到 PANet。進入到PANet中的特征層,會完成特征金字塔從下到上和從上到下的的特征提取,在里面不斷的拼接、卷積、上采樣與下采樣。最后得到3個輸出,也就是圖1中的yolo head。
在yolo head中anchor機制與yoloV3相同,主要改進的是訓練時損失函數。使用的是CIou_loss。為什么要選擇CIOU_Loss呢?在選擇IOUloss的情況下當預測框和目標框不相交時,IOU=0,無法反映兩個框之間的距離,無法進行優化,若時當兩框進行完全重合時,無法區分兩者相交的情況。而GIOU_Loss雖然可以解決梯度消失的問題,但會消耗大量的時間在預測框與真實框接觸上,影響收斂的速度。
CIOU_Loss是在DIOU_loss的基礎上進行改進的,加入了影響因子,將目標框回歸函數該考慮的重要因素:重疊面積、中心距離、長寬都考慮進去了。采用這樣的回歸方式,使得預測框回歸的速度和精度要更高一些。

在數據集制作方面,在網絡上收集了1000張不同車況的圖像(收集的照片未被標注)。并且自己使用Label Image進行手動標注。分別制作了兩個數據集。數據集1:前500張,訓練集:驗證集:測試集比為8:1:1、數據集2:全部1000張圖像,訓練集:驗證集:測試集比為8:1:1。

圖3 數據集制作
本文采用的是數據集是在網上進行收集的圖片,并且自己進行手動標簽。一共1000張圖片。
本實驗平臺配置為:顯卡為英偉達1050Ti,顯存為4G,CPU為Inter Core i7-8750H,內存為16g,Windows10操作系統,環境為Pyortch。
由于實驗平臺的問題,在訓練數據集1時,應為數量較少輸入圖像大小為608*608,數據集2輸入圖像大小為416*416。應為本文主要針對的汽車的檢測,因此在分類上只分了car的類輸入網絡中去訓練。但在數據集中,車的類型并不只是單一的只有小型汽車,還有卡車消防車等汽車類型。同時為了在一些復雜化環境下也可以檢測到汽車,在數據集中放入了一些惡劣環境下的汽車圖片。同時在進行預測時還使用到視頻去預測。因此本模型不僅可以在靜態的圖片上進行預測,同時也可以在視頻上進行檢驗。
同時在元數據的基礎上使用了Yolo V4的小ticks,在原有的數據上進一步的進行了數據增廣,通過mosaic的方法對圖像進行了隨機裁剪,縮放等一些操作,這樣可以為模型更好的去增加魯棒性。在訓練時訓練了不同的模型,對有的模型加入了平滑標簽,有的沒有加入。
同時在訓練自己的數據集之前,我還對VOC的數據集進行了訓練,epoch為30,學習率為0.0001同時進行了預測。同時采用了YOLOv4的權重文件作為車輛檢測的預訓練模型,并且采用了自己制作的數據集中944張圖片作為訓練集。圖4分別時在VOC數據集上訓練的LOSS變化(右)和在自己數據集上訓練的Loss變化(左)??梢钥闯龅胶竺嬖浇咏Y束時Loss值趨近于收斂。由于在本次實驗在中沒有進行對損失進行歸一化處理所以損失值看來較為大。但影響不大,最終看的還是Loss是否趨于收斂。
在實驗中對于自己數據集訓練,訓練了2個模型。模型1:學習率為0.00001,沒有平滑標簽,輸入網絡的圖像大小為608*608,epoch為30數據集圖片數量只有446張圖像進行訓練和檢驗。模型二學習率為0.0001、平滑標簽為0.01、epoch為50、輸入網絡的圖像大小為418*418,用于訓練和檢驗圖像增加到944。兩模型Batch_size都為4,且對于兩個模型,在訓練時都是進行了凍結的處理目的都是對為了讓模型在訓練數據集的時候加快模型的訓練,讓我們更快的看見結果。圖5為兩個模型loss值得變化的對比。

圖4 左:制作的數據集,右:VOC數據集

圖5 左圖為模型2,右圖為模型1
之后得到了模型選取較為好的權重文件,放入到預測部分去對同一張圖去進行對車輛在路口的識別。圖6為兩個模型識別的對比圖。

圖6 左圖為模型1下進行的檢測、右圖為模型2下進行的檢測
從圖中可以看出模型二的識別效果時較為好的,能識別出大部分的車車輛,且精確度也要相較于模型2有所提升。而模型1由于數據集較為小的原因,并不能完全的都將車輛的全部識別。對于有些遮擋的車輛并不能很好的識別出來,只能前面比較清晰的車輛識別出。
擁擠路段車輛檢測應用流程如圖7所示。系統與各路口的攝像頭相連,通過路口的攝像頭返回實時的圖像或者視頻,將視頻或圖像進行處理后放入模型中進行檢測、統計車流量。將統計的車車流量返回到系統中進行判斷,是否發出超量預警。因此系統能較好的實時統計車流量,并告知出行人員讓其自行判斷出行路線。

圖7 擁擠路段車輛檢測應用流程圖
從上述實驗結果看來,將Yolo V4算法運用在擁擠道路上對于車輛檢測是較為有效的。能夠較好的去識別車輛,并且能統計車輛數。
因為在本次實驗中所用的數據的量較為小,在精準度方面并不是特別的突出,若是收集更多的數據,在更好的設備上進行數據的訓練,相信精確度和速度都會得到更多的提升,對于模型的評估也會更好。對于訓練出更好的模型我們也可以運用在更多更復雜的環境下從而讓其實用性變得更加強。