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