羅明睿, 張翠平, 李亞欣, 李媛媛
(北京信息科技大學(xué) 計(jì)算機(jī)學(xué)院, 北京 100192)
隨著交通智能化和人工智能技術(shù)水平提升,越來越多的傳統(tǒng)車企和互聯(lián)網(wǎng)企業(yè)參與到自動(dòng)駕駛技術(shù)的研發(fā)。 近幾年自動(dòng)駕駛技術(shù)愈來愈熱,越來越多的消費(fèi)者也更青睞于購買和使用具有輔助駕駛(自動(dòng)駕駛)的車輛,從而減少駕駛員駕駛時(shí)的體力損耗,降低因疲勞駕駛帶來的風(fēng)險(xiǎn)。 與此同時(shí),因自動(dòng)駕駛技術(shù)的普及而產(chǎn)生的交通事故也越來越多。
2022 年6 月16 日,美國聯(lián)邦政府公布了兩份對于自動(dòng)駕駛技術(shù)的報(bào)告,報(bào)告中首次公布了涉及自動(dòng)駕駛汽車(AV) 和配備先進(jìn)駕駛輔助系統(tǒng)(ADAS) 的汽車在碰撞和死亡事故方面的相關(guān)統(tǒng)計(jì)。 其中,加州51 起自動(dòng)駕駛事故中有45 起事故是因?yàn)樽詣?dòng)駕駛狀態(tài)中追尾或者撞到其他障礙物造成的。 因此,在自動(dòng)駕駛領(lǐng)域,如何對周圍環(huán)境進(jìn)行感知,對前方目標(biāo)進(jìn)行測距是非常重要的技術(shù)難題。目前,在自動(dòng)駕駛領(lǐng)域比較有名的兩大車企——特斯拉和蔚來所研發(fā)的自動(dòng)駕駛平臺(tái)中,特斯拉的NOA 和蔚來的NOP 均不能做到對人、動(dòng)物、交通燈、墻、路障等非車輛目標(biāo)做出反應(yīng),遇到這些情況會(huì)交予人為處理。
當(dāng)前,針對自動(dòng)駕駛和輔助駕駛障礙系統(tǒng)國內(nèi)外已有一些研究,其主要對于避障算法和圖像識別方向展開的研究。 如:胡正云等[1]針對車道線圖像識別的實(shí)時(shí)性和適應(yīng)性等問題,提出了一種基于遺傳算法,并且結(jié)合車道線圖像閾值的分割優(yōu)化算法來解決此問題。 牛洪超等人[2]對M-YOLO 圖像識別進(jìn)行改進(jìn),使得M-YOLO 更符合自動(dòng)駕駛中圖像識別的要求。 Chen[3]等人對多種公共自動(dòng)駕駛數(shù)據(jù)集的性能進(jìn)行了全面調(diào)查,目前應(yīng)用到實(shí)際中的障礙物預(yù)警系統(tǒng),這種方式雖然能夠迅速的對前方障礙物進(jìn)行檢測,但無法第一時(shí)間對障礙物類別進(jìn)行識別,無法對目標(biāo)障礙物是否在橫向移動(dòng)進(jìn)行監(jiān)控,從而導(dǎo)致無法為駕駛員提出有效的避障建議。本文基于YOLOv5 圖像識別算法和基于OpenCV 的自動(dòng)跟隨系統(tǒng)進(jìn)行設(shè)計(jì),從而設(shè)計(jì)出應(yīng)用于車載電腦的駕駛輔助預(yù)警系統(tǒng)。
本系統(tǒng)的目標(biāo)使用者是L3 級別以下的自動(dòng)駕駛車輛和駕駛?cè)藛T,主要功能是利用攝像頭對前方路面進(jìn)行實(shí)時(shí)監(jiān)控,檢測到前方有障礙物后第一時(shí)間提醒駕駛員并給出避障建議。 該系統(tǒng)需要對不同類型的障礙物,如動(dòng)物、路障、塑料袋、行人、非行駛狀態(tài)的車輛進(jìn)行有效的識別,因此對系統(tǒng)設(shè)計(jì)有以下需求:
(1)能夠通過圖像識別對前方是否有障礙物進(jìn)行有效識別;
(2)針對不同的障礙物能夠進(jìn)行快速分類,如:貓、狗等屬于動(dòng)物分類,車用警示標(biāo)志牌、路障等屬于需要躲避障礙物,塑料袋、雜草屬于無需躲避障礙物等;
(3)對前方移動(dòng)車輛進(jìn)行有效監(jiān)控,判斷前方車輛是否處于正常行駛的狀態(tài),并對前方車輛緊急停車(減速)進(jìn)行判斷;
(4)能夠判斷所檢測物體的運(yùn)動(dòng)狀態(tài);
(5)針對不同類型的障礙物給出合理的相關(guān)避障措施;
(6)在給出避障措施后發(fā)出警報(bào),并給出語音播報(bào)障礙物的種類和避障建議。
如圖1 所示,系統(tǒng)主要由前端UI 界面、圖像識別和避障處理3 部分構(gòu)成。
圖1 系統(tǒng)框架圖Fig.1 System framework
前端UI 界面負(fù)責(zé)人機(jī)交互,主要完成攝像頭的操作、視頻流的讀取、顯示識別結(jié)果、避障建議以及語音播報(bào)和報(bào)警4 部分內(nèi)容。 物體識別包括目標(biāo)追隨、圖像識別兩個(gè)主要部分。 首先需要對于前方待識別物體進(jìn)行選擇、追蹤,選定單個(gè)或多個(gè)目標(biāo)之后,通過圖像識別對其進(jìn)行識別并返回識別的可能結(jié)果及相關(guān)物體屬性。 數(shù)據(jù)處理部分是基于不同的障礙物類型給出不同的避障建議,最后在UI 界面上返回識別結(jié)果及避障建議并發(fā)出警報(bào)和語音提醒。
系統(tǒng)采用Qt Designer[4]進(jìn)行界面設(shè)計(jì)(如圖2所示),主要模塊包括打開攝像頭、讀取視頻流、識別結(jié)果顯示、避障建議以及語音播報(bào)和報(bào)警4 個(gè)部分。
攝像頭操作主要是利用QLabel 組件和OpenCV實(shí)現(xiàn)對車載行車記錄儀的連接和斷開。 當(dāng)用戶點(diǎn)擊開始之后連接車載行車記錄儀,調(diào)用OpenCV 中的圖像獲取功能,使用VideoCapture()函數(shù)去獲取行車記錄儀的圖像數(shù)據(jù)。
將視頻流看做N多個(gè)幀的圖片,讀取部分運(yùn)用OpenCV 中VideoCapture()函數(shù)創(chuàng)建多個(gè)圖像獲取對象,用以讀取視頻文件內(nèi)容。 之后,使用IsOpened函數(shù)判斷該視頻文件是否被正確打開。 IsOpened()函數(shù)將返回一個(gè)boo 量,用于判斷視頻流是否可以使用。 寫入部分使用get() 函數(shù)得到視頻的長和寬,并用初始化視頻捕獲對象并且把視頻流讀入內(nèi)存。
通過圖像識別模塊識別出不同的物體后,根據(jù)處理結(jié)果會(huì)產(chǎn)生不同的建議。 此時(shí),系統(tǒng)均采用QTextEdit 組件來顯示參數(shù)名稱、輸出結(jié)果和避障措施。
語音報(bào)播模塊由一個(gè)音量調(diào)節(jié)器、預(yù)警靜音開關(guān)(取消報(bào)警)和聲音播放器構(gòu)成。 其中,音量調(diào)節(jié)器使用setVolume()方法和Qslider 組件完成;預(yù)警靜音開關(guān)使用setVolume()方法和QRadiobutton 組件完成;聲音播放器使用QmediaPlayer 模塊實(shí)現(xiàn)。由于QmediaPlayer 是對本地計(jì)算機(jī)底層播放框架封裝,所以語音提示播放和預(yù)警聲音均是接入錄好的MP3 音源。
3.2.1 目標(biāo)追隨
目標(biāo)追隨系統(tǒng)選用KCF 算法,借鑒柳天宇等人[5]基于KCF 算法的空中目標(biāo)追蹤模擬中提出的目標(biāo)追蹤思路。 KCF 算法實(shí)現(xiàn)目標(biāo)跟蹤的基本流程為:讀入視頻序列,由YOLOv5 檢測出的目標(biāo)作為真實(shí)目標(biāo),在當(dāng)前幀采樣,用目標(biāo)和背景信息訓(xùn)練分類器,得到相關(guān)濾波器;下一幀圖像與相關(guān)濾波器做卷積,響應(yīng)最大的區(qū)域作為預(yù)測目標(biāo),目標(biāo)更新迭代,并進(jìn)行跟蹤;下一幀循環(huán)上述過程。
訓(xùn)練樣本的生成都是基于循環(huán)矩陣形式來構(gòu)建的。 其中基樣本x為正樣本,其他全部都是負(fù)樣本。由于循環(huán)矩陣的性質(zhì),樣本集可以很方便的利用快速傅里葉變換和傅里葉對角化的性質(zhì)來進(jìn)行計(jì)算。由任意基樣本x生成的循環(huán)矩陣具有以下特性:
其中,是x的離散傅里葉變換,F(xiàn)是離散傅里葉常量矩陣,是FH的厄米特轉(zhuǎn)置。
循環(huán)矩陣既簡化了計(jì)算,降低了運(yùn)算時(shí)間,又解決了跟蹤器訓(xùn)練時(shí)樣本不足的問題。
嶺回歸的方法是KCF 算法中用來訓(xùn)練跟蹤器,如式(2)所示。
解得ω形式為
之后,需要利用核函數(shù)將非線性在映射后滿足線性要求,以此達(dá)到非線性到線性的轉(zhuǎn)換,從而使得跟蹤準(zhǔn)確度提升。 此時(shí),ω可表達(dá)為式(4):
可解出:
最終可得訓(xùn)練樣本的相關(guān)矩陣,如式(6)所示。
3.2.2 訓(xùn)練數(shù)據(jù)集
本項(xiàng)目采用伯克利大學(xué)2020 年發(fā)布的開放式駕駛視頻數(shù)據(jù)集BDD100K[6](本數(shù)據(jù)集目前在Github 上為開源項(xiàng)目), 本數(shù)據(jù)集中有近10 萬個(gè)視頻圖片資源,圖片數(shù)量分布如圖3 所示。 該數(shù)據(jù)集發(fā)布的目的是方便評估自動(dòng)駕駛圖像識別算法的發(fā)展,目前也是自動(dòng)駕駛領(lǐng)域使用最為廣泛的數(shù)據(jù)集。由于硬件配置所限,本項(xiàng)目只訓(xùn)練了數(shù)據(jù)集中的部分圖片,并根據(jù)系統(tǒng)的實(shí)際應(yīng)用,添加了對于Animal 類別的圖片進(jìn)行訓(xùn)練。 訓(xùn)練圖片的具體類別和數(shù)量見表1。
表1 系統(tǒng)訓(xùn)練的內(nèi)容數(shù)量和種類Tab.1 Quantity and type for system training
圖3 OpenCV 的坐標(biāo)系示意圖Fig.3 Schematic diagram of OpenCV coordinate system
由于BDD100K 均使用Json 格式的文件存儲(chǔ),無法直接將BDD100k 格式轉(zhuǎn)換成適用于YOLO 格式,所以在訓(xùn)練數(shù)據(jù)集的過程中,先將BDD100k 的數(shù)據(jù)集標(biāo)簽轉(zhuǎn)換為coco 格式,之后再將COCO 格式轉(zhuǎn)換為本項(xiàng)目可以訓(xùn)練的YOLO 格式。
3.3.1 判斷物體運(yùn)動(dòng)狀態(tài)
判斷物體的狀態(tài)分為判斷物體橫向移動(dòng)和物體是否停止或者減速。 首先對物體進(jìn)行橫向位移的檢測,利用OpenCV 中的cv2.findContours 對目標(biāo)輪廓進(jìn)行檢測[7],并對矩形的長、寬、高、面積、周長測算并讀出矩陣4 個(gè)頂點(diǎn)的坐標(biāo),如圖4 所示。
圖4 OpenCV 測距原理圖Fig.4 Schematic diagram of OpenCV ranging
通過比較上一幀和下一幀目標(biāo)物體所在矩形的坐標(biāo),以判斷物體是否在水平運(yùn)動(dòng)。 對于判斷物體是否在加速或者減速,本項(xiàng)目利用空間的深度來實(shí)現(xiàn),其原理如圖4 所示。
如圖4(b)所示,物體寬度為W,物體W距離相機(jī)的長度為d,對物體進(jìn)行拍攝,拍得照片的像素寬度為P,于是可以得出相機(jī)焦距F的公式如下:
公式變換可得:
由此可測出目標(biāo)物體的距離。
得到物體距離后,根據(jù)當(dāng)前車速和反應(yīng)時(shí)間測得下一幀D的理論值,對比D和D′的大小,若D >D′可知目標(biāo)物體正在減速或者靜止。
3.3.2 避障建議
避障建議本系統(tǒng)借鑒遺傳算法的思路,在多個(gè)約束條件下給出最有效的解決方案,算法流程如圖5 所示。
圖5 算法流程Fig.5 Algorithm flow chart
算法描述如下:
當(dāng)目標(biāo)障礙物識別成功后,對其運(yùn)動(dòng)狀態(tài)進(jìn)行分類,若為動(dòng)態(tài)且為加速狀態(tài)則繼續(xù)行駛,反饋給避障建議為繼續(xù)行駛;若為靜止或者減速狀態(tài)則對目標(biāo)障礙物種類進(jìn)行訪問,若為可直接壓過的種類(如塑料袋、雜草等),同時(shí)反饋建議為繼續(xù)行駛;否則,對目標(biāo)是否為正在移動(dòng)的動(dòng)態(tài)障礙物進(jìn)行判斷,根據(jù)判斷出不同的內(nèi)容進(jìn)行分類。 其中為動(dòng)態(tài)障礙物有Car 類、Moto 類、Bus 類、Animal 類和Person 類,若是活物則繼續(xù)判斷其水平運(yùn)動(dòng)狀態(tài),不是則識別左右車道是否具備轉(zhuǎn)向條件。 當(dāng)判斷物體沒有水平運(yùn)動(dòng)后視為物體非活物,進(jìn)而判斷左右車道是否具備轉(zhuǎn)向條件;若目標(biāo)物體仍在水平移動(dòng)則進(jìn)入緊急制動(dòng),并反饋出避障建議,避障建議為緊急剎車。 若左右車道具備轉(zhuǎn)向條件,則給出避障建議為向左轉(zhuǎn)或向右轉(zhuǎn)。
本測試主要是針對3 部分進(jìn)行,其中包括:測試該項(xiàng)目是否可以識別出橫向移動(dòng)的障礙物;測試內(nèi)容是測試對于同一個(gè)障礙物的目標(biāo)追隨能力;測試內(nèi)容是按鈕功能的完善情況。
本測試針對當(dāng)前方突然出現(xiàn)障礙物后,系統(tǒng)是否可以識別出障礙物類型、分類和給出的避障建議。如圖6 所示,當(dāng)前方出現(xiàn)行人穿過馬路時(shí),系統(tǒng)可以識別出類型為人,類別為person 類。 給出的避障建議是緊急剎車,完全符合系統(tǒng)設(shè)計(jì)要求。
圖6 系統(tǒng)運(yùn)行結(jié)果Fig.6 System running results
本測試針對前方一直跟隨的障礙物,當(dāng)其他障礙物進(jìn)入攝像區(qū)域后,是否可以對目標(biāo)物體繼續(xù)跟隨。 如圖7(a)所示,本系統(tǒng)一直跟隨目標(biāo)車輛,當(dāng)側(cè)后方出現(xiàn)白色車輛后依舊可以跟隨目標(biāo)車輛,如圖7(b)所示。
圖7 系統(tǒng)運(yùn)行結(jié)果Fig.7 System running results
本文基于YOLOv5 圖像識別和OpenCV 圖像處理,完成了基于圖像識別的輔助駕駛避障預(yù)警系統(tǒng)??梢葬槍Φ缆飞喜煌愋偷恼系K物給予駕駛員不同的避障建議,輔助駕駛員在第一時(shí)間做出正確處理,從而降低駕駛中發(fā)生危險(xiǎn)引起交通事故的幾率。