余穎舜,李成瑤,潘長開
(佛山職業(yè)技術學院,廣東 佛山 528137)
YOLOv4(以下簡稱“YOLO”)算法是目前自動駕駛中使用最廣泛的目標檢測算法[1],其在晴朗白天光線充足的環(huán)境下進行車輛目標識別任務時能達到96%的準確率,而且每秒能處理100幀以上的圖片,可以實時處理視頻流。盡管如此,96%的白天準確率依然是不夠的,為了進一步提升YOLO算法的目標識別準確率,對其展開研究是當前自動駕駛行業(yè)較為迫切的問題。
YOLO算法將圖片劃分為若干個區(qū)域,然后對每個區(qū)域進行目標檢測。默認是把1幀圖片壓縮為448×448分辨率的圖片,然后再平均劃分為7×7個區(qū)域。與Faster-RCNN算法[2]相比,YOLO算法為了提高處理速度,并沒有使用滑移窗口與區(qū)域提議的方式,所以容易導致某些目標對象被分割在多個不同的區(qū)域中,導致不管YOLO算法對哪個區(qū)域進行識別,都只能看到目標對象的局部,引起識別準確率的下降。為此,可以通過區(qū)域交錯、元學習、知識蒸餾、參數(shù)微調提升YOLO算法的識別準確率。
針對YOLO算法識別準確率偏低的問題,可以通過增加所劃分區(qū)域的數(shù)量,同時重疊一部分相鄰的區(qū)域來提高YOLO算法的目標識別準確率。假設YOLO算法把圖片劃分為3×3個區(qū)域,如圖1實線所示,圖片中會出現(xiàn)4個交點。假如有1個目標對象的中心恰好就在交點附近,則這個目標對象會被分割在與該交點相鄰的4個不同的區(qū)域中。對于YOLO算法來說,這個目標對象是難以識別的。所以提出一種新方法:以每個交點為中心,再增加1個區(qū)域讓YOLO算法進行識別,新增加的區(qū)域大小與原來劃分的區(qū)域大小一致,如圖1虛線所示。
圖1 區(qū)域交錯示例
隨著YOLO算法需要識別的區(qū)域增加,其識別準確率會有所提高,但計算量也會越來越大。因此,只在識別過程最容易失效的區(qū)域邊角處增加新的識別區(qū)域,以減少新增區(qū)域的數(shù)量,限制新增的運算量。
新增加的區(qū)域會增加運算量,但是該方案的串行運算量未增加,所增加的是并行的運算量。因此,可以使用多進程等并行運算技術來運行,這樣就可以在不降低YOLO算法速度的情況下提升YOLO算法的目標識別準確率。
雖然YOLO算法有不錯的準確率與速度,但是其泛化性較差。泛化性差的原因與訓練數(shù)據(jù)分布不均衡及小樣本有高度關聯(lián)。訓練數(shù)據(jù)分布不均衡導致YOLO算法很難學習到在訓練集中出現(xiàn)概率較低的路況。
針對這個問題,使用元學習來確定YOLO算法的初始化參數(shù)。元學習并不會訓練出強大的YOLO算法,但可以訓練出有潛力的YOLO算法。然后再使用訓練集對YOLO算法進一步訓練,就可以獲得泛化能力更加強大的YOLO算法。選用元學習理論中的Reptile算法[3]對YOLO算法進行元學習,基本過程如下:
(1) 人工分類訓練數(shù)據(jù),根據(jù)白天、黑夜,以及天氣狀況,將數(shù)據(jù)集劃分為12個不同的任務訓練集。
(2) 復制YOLO算法,取名YOLO1。隨機抽取1個任務訓練集,取名“任務i”。使用“任務i”對YOLO1進行訓練,使用Adam優(yōu)化器,直到YOLO1收斂。
(3) 對YOLO的參數(shù)進行更新,即
θ←f(θ,λ(θ1-θ))
(1)
式中:θ為YOLO的參數(shù);θ1為YOLO1訓練收斂后的參數(shù);λ為超參數(shù),取0.001;λ(θ1-θ)為優(yōu)化器輸入中的梯度;f(θ)為優(yōu)化算法函數(shù),可以是梯度下降、動量、AdaGrad、RMSprop等。
(4) 重復步驟(2)與步驟(3),直到YOLO收斂。
YOLO在進行元學習后,使用知識蒸餾技術[4]對其進一步訓練。
使用目標檢測準確率最高的Faster-RCNN模型作為教師模型,YOLO作為學生模型進行訓練。
對于YOLO中的分類任務,教師模型提供的標簽是soft-max標簽,能提供各個不同類別之間具有關聯(lián)性的信息;而如果直接使用訓練數(shù)據(jù)進行訓練,YOLO得到的標簽是one-hot標簽,所能夠學習的信息相對較少。
即使經(jīng)歷了知識蒸餾的訓練,YOLO算法模型在實際應用中依然會對少部分目標對象存在分類錯誤的情況。為了改善這個問題,需要對YOLO算法的參數(shù)進行微調。
YOLO算法參數(shù)微調的訓練集由兩部分組成:
(1) YOLO做分類任務時,分類結果與one-hot標簽相差較大的樣本會被放進微調訓練集。這種方式類似于強化學習中的優(yōu)先級回放技術[5]。
(2) 使用對抗訓練中的FGSM算法[6]生成對抗樣本,把對抗樣本放進微調訓練集中。
考慮到深度學習模型通常存在“災難性遺忘”現(xiàn)象,參數(shù)微調階段的訓練可能會導致YOLO算法丟失知識蒸餾階段的訓練成果。因此,在微調階段,使用增量學習中的EWC算法對YOLO算法的參數(shù)進行微調訓練。
EWC算法使用的損失函數(shù)為:
(2)
(3)
盡管YOLO算法已經(jīng)能夠處理實時的視頻流數(shù)據(jù),但是對于自動駕駛領域來說依然不夠快。很重要的原因是由于在YOLO算法給自動駕駛系統(tǒng)信號后,自動駕駛系統(tǒng)不能馬上進行響應。從自動駕駛系統(tǒng)接收到YOLO算法信號到汽車的機械部件實施響應,大概有0.5 s延遲。為了進一步減少延遲,采用了一種能讓YOLO算法具備預判能力的方式進行訓練,并對YOLO算法模型的部分參數(shù)進行了量子化處理。
在YOLO算法的訓練階段(元學習階段、知識蒸餾訓練階段、參數(shù)微調階段),YOLO(在元學習階段是YOLO1)的輸入是一幀圖片,但是其對應的標簽并非該幀圖片的標簽,而是視頻流數(shù)據(jù)中0.5 s后的另一幀圖片的標簽。所以YOLO算法并不是對當前幀的圖片做目標檢測,而是根據(jù)當前幀的圖片,預測0.5 s后行車障礙物最有可能出現(xiàn)的位置。
使用這種方式訓練出來的YOLO算法具備對路況的預判能力。盡管其運算速度并沒有真正得到提升,但是其表現(xiàn)出來的效果與速度提升一致。
在YOLO算法參數(shù)微調階段,EWC算法會計算出YOLO算法每個參數(shù)的重要程度。假如YOLO算法中的某個張量中的大部分參數(shù)被EWC算法評價為非重要參數(shù),則更換其數(shù)據(jù)類型,讓張量的數(shù)據(jù)類型從占用字節(jié)較多的雙精度浮點型數(shù)據(jù)轉換為短整形數(shù)據(jù)。該方式能有效減少YOLO算法占用的內存,并且可以提高其工作時的運算速度。
使用訓練出來的YOLO算法能在訓練集中獲得95.2%的識別準確度,在測試集中能獲得93.8%的識別準確度。
通過對YOLO算法識別錯誤的圖片進行分析,其識別失敗主要分為以下3種情況:
(1) 人群識別。圖片中有多個行人,并且相互重疊時,YOLO算法對行人的識別效果較差,通常只能識別人群中的一部分,無法識別全部行人。值得慶幸的是,對于自動駕駛系統(tǒng)來說,這種情況下出現(xiàn)的漏檢往往不會對自動駕駛系統(tǒng)構成太大的負面影響。只要YOLO算法能檢測到前方有行人,自動駕駛的車輛就會制動,行人依然是安全的。
(2) 遠距離目標識別。當目標在遠處時,YOLO算法容易出現(xiàn)漏檢的情況。即使沒有漏檢,YOLO算法對于遠處的目標對象容易出現(xiàn)識別錯誤的問題。這種情況的錯誤不會對自動駕駛的行車安全構成直接影響,但可能會導致自動駕駛系統(tǒng)無法識別遠處的交通燈或交通標志而導致車輛行駛時違反交通規(guī)則。
(3) 目標對象不在線框中。矩形線框的位置與目標對象的位置差距較大,例如線框的位置在電動自行車的前方,電動自行車大部分都不在邊框里面。從某個角度來看,這種情況不算是YOLO算法識別失敗,反而是YOLO算法的成功預判。因為YOLO在訓練時使用的數(shù)據(jù)標簽本來就不是圖片的標簽,而是0.5 s后的另一幀圖片的標簽。
本文使用了元學習、知識蒸餾等方式對YOLO算法進行訓練,使YOLO算法獲得更好的泛化能力并獲得一定的預判能力。盡管如此,YOLO算法的表現(xiàn)與工程需求依然存在一定距離,需要進一步提升以保障自動駕駛系統(tǒng)的可靠性。