張力天 孔嘉漪 樊一航 范靈俊 包爾固德
1(北京交通大學軟件學院 北京 100044) 2(中國科學院計算技術研究所信息技術戰略研究中心 北京 100190) 3(貴陽市大數據產業集團有限公司 貴陽 550081)
現階段,駕車出行已經變成人們日常生活中的一部分.車輛給人們的生活帶來了很多便利,但也帶來了很多交通安全隱患.根據美國國家公路交通安全管理局(National Highway Traffic Safety Admini-stration,NHTSA)發布的《機動車碰撞概述》,美國每分鐘大約發生10起車輛事故,每3分鐘就有1人因車輛事故而喪生[1].根據世界衛生組織2018年發表的《全球道路安全狀況報告》,全球有超過135萬人死于道路車輛事故.車輛事故問題已經變成世界關注的焦點問題.預防車輛事故的方法有很多,政策方面包括提高駕駛員的安全意識、加大處罰力度和更新交通系統設備,而技術方面主要是在事故發生前預測事故并通知警示駕駛員.
在事故預測中,獲取車輛事故數據是很重要的環節.在以往的研究中,這些數據集包含宏觀因素[2-4]或微觀因素[5-8].宏觀因素包括地理情況(如公路和街道)、環境情況(如濕度和能見度)和交通情況(如交通速度和密度).這些包含宏觀因素的數據集通常是從當地交通部門收集到的,例如RCP(part of the Ministry of Justice and Public Order of the Republic of Cyprus),CIAIR(Center for Integrated Acoustic Information Research),SPD(Seattle Police Department)數據集[9-11].微觀因素包括事故發生前的車輛行為(如速度和加速度)和駕駛員行為(如眼動和手勢).這些數據集通常使用駕駛模擬器收集,例如STSIM,SCANeR,VANET數據集[7,9].在以往的研究中,大部分數據集只包含宏觀或微觀其中一種因素.究其原因,是宏觀因素和微觀因素難以同時收集.然而,車輛事故往往是兩者共同作用的結果[1].雖然Gite和Agrawal使用了2類因素的數據進行事故預測,但數據集包含的特征數量非常少[5].
事故預測的另一重要環節是用算法處理數據,而當前有很多種預測車輛事故的方法.在深度學習出現之前,人們通常使用神經網絡[10,12-14]或統計方法,如條件logistic模型等[15-18].目前,很多研究者使用LSTM處理時間序列事故數據[5],或使用CNN和DNN處理非時間序列數據[2,4,19],來預測駕駛員的危險行為或者預測出事故發生的時間和地點.因為收集到的數據中沒有可以用于預測的事故發生概率標簽,以往的研究通常只是計算出一個0/1二分類預測結果,即僅僅判斷事故能否發生,但這樣的結果不夠實用,駕駛員更希望得到的是不同級別的危險預警信號[20].如果可以預測出事故概率值,就能更好地滿足駕駛員的需求.
2019年發布的事故宏觀因素數據集OSU(Ohio State University)與宏觀因素數據集FARS(fatality analysis reporting system)和微觀因素數據集SHRP2(strategic highway research program 2)都具有一些相同的特征,為它們的融合提供了機遇[21-22].因此在本研究中,我們首先得到了一個同時包含宏觀和微觀因素的數據集.對于正樣本數據,我們融合了包含宏觀因素的OSU和FARS數據集,以及包含微觀因素且與SHRP2分布相同的Sim-SHRP2(simulated strategic highway research program 2)數據集.而負樣本數據,則是在美國加利福尼亞州和華盛頓州自行駕駛汽車收集而來的.此外,融合后的數據集只包含事故是否發生的0/1標簽而不包含事故發生的概率標簽,所以我們還設計了一個深度學習框架來預測車輛事故發生的準確概率值.該框架參考了Zhang等人[23]提出的算法,是一個無監督的深度學習框架,但是它可以使用迭代的方式為數據集生成準確的概率標簽,并使用這些概率標簽來進行訓練.由于時間和資金的限制,負樣本數據量約為正樣本數據量的1/5,所以在該框架中,我們使用了deep-SVDD算法,該算法能夠很好地解決數據不均衡的問題[24].
綜上所述,本文的貢獻主要在實際應用上,解決了2個問題:1)車輛事故是宏觀因素和微觀因素共同作用的結果[1],但是因為宏微觀因素難以同時收集,所以以往的大部分車輛事故數據集只包含宏觀或微觀其中一種因素.針對這一問題,我們融合了2019年發布的事故宏觀因素數據集OSU與宏觀因素數據集FARS和微觀因素數據集SHRP2,得到了包括宏微觀因素的數據集.2)不同層級的事故發生概率的預警可以有效地避免交通事故,并且也符合駕駛員的需求[20],但是因為收集的數據集中沒有可以用于預測事故發生概率的標簽,所以以往的大部分研究只得到事故是否發生的二分類結果.針對這一問題,我們設計了一個概率級別的無監督深度學習框架,使用迭代的方式為數據集生成準確的概率標簽,并使用這些概率標簽來進行訓練,從而可以預測出準確的事故發生概率值.
為了得到完整而足量的訓練數據,我們首先融合了3個包含正樣本的車輛事故數據集,然后將它們與一個包含負樣本的安全駕駛數據集相結合,最終獲得了可用于訓練的完整數據集.正樣本的3個數據集分別是OSU,FARS,Sim-SHRP2,其中前2個數據集包含事故的宏觀因素,后一個包含事故的微觀因素.OSU數據集是從俄亥俄州立大學收集的涵蓋美國49個州的全國性車輛事故集合,其中包含車輛事故的地理情況和環境情況相關特征.FARS數據集是在美國進行的全國性年度事故普查的數據,其中包含交通情況相關特征.Sim-SHRP2數據集也是美國的全國性事故統計,其中包含車輛事故中的車輛行為和駕駛員行為相關特征.負樣本數據集則是我們與騰訊自動駕駛組人員合作,駕駛配備有各類傳感器的汽車在加利福尼亞州和華盛頓州收集到的.數據融合過程如圖1所示:

Fig.1 Illustration of data fusion process圖1 數據融合流程示意圖
在構建好包含正負樣本的具有多個特征的數據集后,我們將數據輸入深度學習框架中,首先通過無監督算法生成粗糙概率標簽,然后使用粗糙的標簽迭代地訓練深度學習算法,得到更準確的標簽,再用所得到的標簽進行訓練.框架主要分為3步:
1)使用無監督的機器學習算法對數據進行預處理,生成粗略的概率標簽;
2)使用有粗糙概率標簽的數據訓練有監督的深度學習算法;
3)使用訓練后的深度學習算法進一步處理數據,使生成的概率標簽更準確.
步驟2)和步驟3)不斷迭代進行,直到深度學習算法得到充分訓練為止.
因為訓練數據只包含事故發生的0/1標簽,并不包含我們所需要的概率標簽,所以我們以迭代的方式逐漸得到準確的概率標簽.在本文中,選擇的無監督機器學習算法是k-means聚類算法和autoencoder自編碼器,而有監督的深度學習算法是一種修改的deep-SVDD算法.原始的deep-SVDD算法為無監督算法,但是可以通過修改損失函數,改為有監督算法.我們選用無監督deep-SVDD算法并把它修改為監督學習算法,主要是因為訓練數據的正負樣本不均衡,而deep-SVDD算法可以很好地處理這樣的數據.盡管訓練數據可以通過多次迭代逐漸獲得準確的概率標簽,但是在迭代初期的概率標簽比較粗略,也比較適合修改為監督算法的無監督學習,而不是一般的監督算法.整體框架如圖2所示.值得說明的是,盡管該框架為訓練數據生成了概率標簽,并且使用修改的deep-SVDD算法進行了監督學習,但是它使用的訓練數據與k-means,autoencoder和原始的deep-SVDD算法一樣,都是沒有概率標簽的數據,所以是概率級別的無監督學習框架.

Fig.2 Illustration of the deep learning framework process圖2 深度學習框架流程示意圖
1.2.1 正樣本數據融合
OSU數據集由事故發生的地理情況(如“經緯度”和“所在州”)、時間、環境情況(如“降雨量”和“能見度”)等相關特征構成;FARS數據集由地理情況、時間、事故嚴重程度、環境情況、交通情況(如“周邊是否有校車”和“周邊是否有行人”)等相關特征構成;SHRP2數據集由地理情況、時間、事故嚴重程度、車輛行為(如“是否超速”和“是否變道”)、駕駛員行為(如“是否系安全帶”和“是否打瞌睡”)等相關特征構成.盡管FARS數據集也包含少量駕駛員行為相關特征,但是遠不如SHRP2數據集全面.我們運行程序來融合OSU,FARS,Sim-SHRP2數據集,該程序包括融合數據集和剔除無效數據項等功能.首先,我們根據不同數據集的相同特征來融合數據集.OSU和FARS數據集的融合方式為,如果2個事故分別來自于OSU和FARS數據集,并且它們的經緯度距離之差小于500 m,時間之差小于30 min,那么我們就將其視為同一起事故,合并相應的數據項.OSU和Sim-SHRP2數據集的融合方式為,如果2個事故分別來自于OSU和Sim-SHRP2數據集,并且它們的州、其他地理情況(如“是否靠近學校”和“是否靠近交叉路口”等)、時間和事故嚴重程度完全相同,那么我們就將其視為同一起事故,合并相應的數據項.之后,我們根據相關和相似特征來剔除無效數據項,這些相關和相似特征如OSU數據集中的“降雨量”特征和FARS數據集中的“地面濕度”特征,以及FARS數據集中的“事故前駕駛員行為”特征和Sim-SHRP2數據集中的“駕駛員是否分心”特征等.如果某一合并數據項的相關和相似特征不一致,我們就將其視為無效數據并加以剔除.這些不一致一般是因為數據記錄時的偏差引起的.其中,對于Sim-SHRP2數據集,原始SHRP2數據集無法免費下載,但是官方網站提供了所有特征的概率分布,所以我們根據其提供的概率分布模擬了Sim-SHRP2數據集.融合后的數據集包含約850 000個具有97個特征的數據項,這些特征分為5個不同類別,分別是:地理情況、環境情況、交通情況、車輛行為和駕駛員行為.
1.2.2 負樣本數據收集
為了收集負樣本數據,我們使用行車記錄儀(Garmin VIRB Ultra 30)、車輛傳感器(iVICAR)和視頻記錄儀(iPhone 11),駕駛汽車(Toyota RAV4)在加利福尼亞州、華盛頓州和周邊的多個場景下采集負樣本數據.這些場景互不相同,覆蓋了特征的多種組合.行車記錄儀記錄地理情況、環境情況和交通情況,而視頻記錄儀記錄駕駛員行為,采集到的視頻通過手動分析來進一步提取特征.車輛傳感器則可以自動記錄車輛行為特征,其截圖如圖3所示.由于時間和資金的限制,收集的負樣本數據集包含約170 000個樣本,約占正樣本數據集的1/5.

Fig.3 Snapshot of the car sensor圖3 車輛傳感器截圖
我們使用無監督機器學習方法來為訓練數據集計算粗略的概率標簽.根據Zhang等人[23]所述,這里應當使用至少2種無監督機器學習方法來保證結果的準確度,所以本項目同時使用了k-means算法和autoencoder.k-means算法可以將樣本劃分為k個聚類,使得彼此接近的樣本分到同一聚類之中.在本項目中,k-means算法會使訓練數據集聚集為2個類:聚類1主要包含正樣本數據,聚類0則主要包含剩余的負樣本數據.在得到這2個聚類后,需要把每個樣本到聚類中心的余弦距離歸一化到[0,1]之間,然后可以求得樣本i的粗略概率標簽
其中di是歸一化后的距離.也就是說,對于正樣本,距離聚類中心的距離越近,發生車輛事故的概率越大;而對于負樣本,距離聚類中心的距離越近,發生車輛事故的概率越小.autoencoder是一種可以學習無標簽訓練樣本編解碼過程的神經網絡.本項目中,autoencoder使用正樣本進行訓練,這樣當輸入正樣本時,輸出的解碼數據與原數據差別較小,而輸入為負樣本時,輸出的解碼數據與原數據差別較大,就可以對正負樣本加以區分[25].每個樣本與其解碼樣本余弦距離的歸一化值取負加1,即是它粗略的概率標簽.無論是k-means算法還是autoencoder算法,都難以直接求得準確的概率標簽,所以如Zhang等人[23]所述,我們對k-means算法和autoencoder算法的結果和原始0/1標簽求平均值,這樣所得的結果更加準確,可以取得更好的訓練效果.


1.4節介紹了對原始deep-SVDD算法的修改,而本節介紹對修改deep-SVDD算法的迭代訓練過程.我們使用得到的粗略標簽訓練修改的deep-SVDD算法.由于標簽較為粗糙,損失函數項的超參數u需要設置為較大值.修改的deep-SVDD算法的訓練過程與原始deep-SVDD算法一樣,首先固定超球面半徑R,使用隨機梯度下降法優化網絡權重W,然后再固定W,使用線性搜索優化R,這一過程反復進行多次,直到收斂為止.修改的deep-SVDD算法在訓練之后,就可以為訓練數據計算新的概率標簽,而這些新的概率標簽與先前計算的粗略概率標簽融合,就可以得到具有更準確概率標簽訓練數據集(如1.3節所述).
接下來,我們使用這些更準確的概率標簽,再次訓練修改的deep-SVDD算法.由于標簽比之前更準確,損失函數項的超參數u需要適當調小.經過訓練的deep-SVDD算法再次為訓練數據集計算概率標簽,并將結果與先前計算的概率標簽進行融合.這個過程持續進行多次,用于訓練的概率標簽會越來越準確,deep-SVDD算法也會被訓練得越來越充分,進而算法的預測準確度也會越來越高.
對于autoencoder,我們為編碼設置了3個隱藏層,分別包含128,74,32個節點,為解碼設置了3個隱藏層,分別包含32,74,128個節點,并讓它以30期(epoch),256批次(batch)進行訓練.deep-SVDD算法具有10層的CNN,每層包含128個節點,以4期256批次反復迭代訓練,學習率為0.000 5.
為了評測本項目所提出框架的性能,我們首先將整體的事故數據集分為2部分:訓練數據集和測試數據集.訓練數據集的數據量占整個數據集的80%,而測試數據集是舍棄額外正樣本數據而剩下的正負樣本平衡數據,占整個數據集的20%.首先,我們測試了不同參數下該框架的性能表現,包括網絡層數(1~20)、迭代次數(1~8)和學習率(0.000 01~0.001)參數.該實驗可以驗證1.6節所述參數設置的可行性.此外,我們還測試了不同迭代次數下(1~8)訓練數據標簽生成結果的準確性.該實驗可以證明該框架可以得到準確的訓練數據標簽,進而得到高質量的訓練結果.此外,該框架是概率級別的無監督學習框架,但是在0/1級別上使用了原始的0/1標簽是監督學習框架,并且訓練數據集的正負樣本不平衡,所以我們將該框架的性能與監督的不平衡二分類算法CCNN(cost-sensitive CNN)和CDNN(cost-sensitive DNN)進行了比較[26].同時,該框架對原始的deep-SVDD算法做了修改,所以我們也和原始deep-SVDD算法進行了比較.為得到概率級別的結果,CCNN算法和CDNN算法直接使用輸出層的分類概率,而deep-SVDD算法計算樣本到超球面中心的余弦距離并進行歸一化.該實驗可以證明該框架優于現有算法.實驗在具有4個GPU節點、67 000個CUDA內核和128 GB內存的高性能計算集群上部署進行,所有算法都使用Python和Tensorflow1.12.0深度學習框架實現.
我們分別在0/1級別和概率級別對本項目所提出框架進行了評測.
對于0/1級別,我們將預測概率值<0.5的值算作0,≥0.5的值算作1,然后將它們與測試數據集中的0/1標簽進行比較.因此,評測指標為:
1)真陽性樣本量(TP).TP是正確預測的正樣本數,即算法預測發生且實際也發生的事故數量.
2)假陽性樣本量(FP).FP是錯誤預測的正樣本數,即算法預測發生但實際未發生的事故數量.
3)真陰性樣本量(TN).TN是正確預測的負樣本數,即算法預測未發生且實際未發生的事故數量.
4)假陰性樣本量(FN).FN是錯誤預測的負樣本數,即算法預測未發生但實際發生的事故數量.
5)召回率(Recall).Recall=TP/(TP+FN).
6)精確率(Precision).Precision=TP/(TP+FP).
7)準確率(Accuracy).Accuracy=(TP+TN)/(TP+FP+TN+FN).
8)F值(F-score).F-score=2Recall×Precision/(Recall+Precision).
對于概率級別的數值,我們應該將預測概率值(或生成的訓練數據標簽)與實際概率值進行比較,但是數據集中沒有任何概率標簽.因此,將該框架預測概率值(或生成的訓練數據標簽)與k-means算法、autoencoder進行比較,相同結果越多,表明該框架的召回率和準確率越高,評測指標為:
1)IK是與k-means算法相同的結果數量;
2)IA是與autoencoder相同的結果數量;
3)IB是與k-means算法和autoencoder都相同的結果數量.
2.3.1 不同隱藏層數的比較
表1給出了不同隱藏層數時,本項目所提出框架在0/1級別上的結果.當隱藏層數小于10時,該框架具有相對較小的召回率;而當數目增加到10以上時,該框架具有相對較高且穩定的召回率、精確率和準確率.

Table 1 0/1-Level Results with Various Numbers of Hidden Layers表1 不同數量隱藏層的0/1級別結果
表2給出了不同隱藏層數時,本項目所提出框架在概率級別上的結果.類似地,當隱藏層數小于10時,該框架具有相對較小的IK,IA,IB值;而當數目增加到10及以上時,該框架具有較高且較平穩的IK,IA,IB值.因此,如1.6節所述,隱藏層的數量為10是一個合理的參數選擇.

Table 2 Probability-Level Results with Various Numbers of Hidden Layers表2 不同數量隱藏層的概率級別結果
2.3.2 不同迭代次數的比較
表3給出了在不同迭代次數下,本項目所提出框架在概率級別上的結果.在迭代次數低于4時,該框架具有相對較小的IK,IA,IB值,而當迭代次數增加到4及以上時,該框架具有較高且較平穩的IK,IA,IB值.因此,如1.6節所述,迭代次數為4是一個合理的參數選擇.

Table 3 Probability-Level Results with Various Numbers of Iterations 表3 不同迭代次數的概率級別結果
因為在不同迭代次數下,本項目所提出框架在0/1級別上的結果與其他算法相比沒有太大差異,所以沒有直接給出.這表明在訓練時,該框架在0/1級別收斂時,可能并沒有在概率級別收斂,所以概率級別的研究是非常有必要的.
2.3.3 不同學習率的比較
除了0/1級別和概率級別的結果外,圖4給出了在不同學習率下,損失函數數值隨著訓練批次增加的變化趨勢.當學習率低于0.000 5時,損失函數值下降緩慢;當學習率增加到0.000 5以上后,損失函數值下降迅速,但是較高的學習率會導致損失函數值的頻繁波動.因此,如1.6節所述,學習率為0.000 5是一個可行的相對最優參數.

Fig.4 Decrease of loss with various learning rates圖4 不同學習率的損失值下降情況
2.3.4 訓練數據標簽生成結果
不同迭代次數下訓練數據的標簽生成結果與2.3.2節相似.在迭代次數低于4時,該框架具有相對較小的IK,IA,IB值;而當迭代次數增加到4及以上時,該框架具有較高且較平穩的IK,IA,IB值.第8次循環后,IK,IA,IB值分別可達9 522,12 988,5 197.因此,該框架可以得到準確的訓練數據標簽,進而得到高質量的訓練結果.
表4給出了本項目所提出框架與CDNN算法、CCNN算法和原始deep-SVDD算法的0/1級別的結果.這些方法都具有較高的真陽性樣本量,但是相比CDNN算法,CCNN算法、deep-SVDD算法和該框架具有更高的真陰性樣本量和更低的假陽性樣本量.除此之外,這些方法都具有相近的召回率,但是CCNN算法、deep-SVDD算法和該框架都具有更高的精確率、準確率和F值.圖5給出了CDNN算法、CCNN算法、原始的deep-SVDD算法和本項目所提出框架的ROC曲線.CCNN算法、deep-SVDD算法和該框架的AUC值高于CDNN算法.

Table 4 0/1-Lvel Comparison Results to Different Methods表4 不同方法的0/1級別結果

Fig.5 ROC curves of the different methods圖5 不同方法的ROC曲線
圖6用韋恩圖給出了本文所提出框架與CDNN算法、CCNN算法和原始deep-SVDD算法概率級別的結果.與其他算法相比,該框架與k-means算法和autoencoder都具有更多相同的概率值.也就是說,該框架可以計算出更準確的概率值.特別地,盡管CCNN算法、deep-SVDD算法和該框架在0/1類級別上的性能相似,但是該框架在概率級別上要優于CCNN算法和deep-SVDD算法.

Fig.6 Venn diagrams of prediction results among the different algorithms圖6 不同算法的預測結果韋恩圖
本文首先通過融合OSU,FARS數據集,SHRP2數據集分布相同的Sim-SHRP2,以及自己駕駛汽車,得到了一個完整的車輛事故數據集.此外,我們還設計了一個概率級別的無監督深度學習框架來預測事故發生的準確概率值.該框架使用迭代的方式為數據集生成準確的概率標簽,并使用這些概率標簽來進行訓練.我們分別在事故發生的0/1級別和概率級別上對該框架進行了評測,實驗結果表明,該框架可以使用所得到的數據集來靈敏而準確地預測車輛事故.以該框架為基礎,可以構建為車輛駕駛員提供不同級別事故預警的軟件.
之后,我們將把這項工作與目標檢測的識別方法相結合,使得車內設備可以自動、實時地獲取交通標志[27]、地理情況、環境情況、交通情況和駕駛員行為等特征,進而構建最終的事故預警軟件.