歐陽麟, 吳仲城, 張 俊, 李 芳
(1.中國科學院 強磁場科學中心,安徽 合肥 230031;2.中國科學技術大學,安徽 合肥 230026;3.強磁場安徽省實驗室,安徽 合肥 230031)
世界衛(wèi)生組織(WHO)指出,道路交通事故是對全球公眾身體健康造成傷害的最重要原因之一。如《2018年世界道路安全狀況報告》[1]中所述,交通事故是致死和致傷的重要原因,每年有接近140萬人死于交通事故,還有數(shù)百萬人因交通事故受傷或致殘。圖1顯示了2004年—2016年間因道路交通事故死亡的人數(shù),可知死亡人數(shù)每年以緩慢的趨勢上升。
圖1 2014年—2016年因道路交通事故死亡的人數(shù)[1]
2013年在摩洛哥進行的一項研究[2]表明,該國每年因疲勞駕駛而死亡的人數(shù)高達4000多人,同時造成經(jīng)濟損失高達14億美元。輕度疲勞占到了事故比例的36.8%,重度疲勞占到了31.1%,如圖2所示。研究還指出,有42.4%的駕駛員未能按照每500 km或2 h 休息15 min的標準進行駕駛。
圖2 調查人群中各類人所占比例
同時,因個人體質不同,每個人所需休息時間和休息間隔不同,因此,單純依靠遵守規(guī)則并不能完全避免駕駛員疲勞駕駛行為,需要一種能檢測到疲勞駕駛行為的方法,并通過警報提醒駕駛員或上傳控制中心,避免交通事故的發(fā)生或降低損失。
在早期的疲勞檢測研究中,主要使用駕駛員的生理信號來進性檢測,如眼電圖[3]、心電圖(ECG)[4]、腦電圖、肌電圖,通過附著在駕駛員身上的各類傳感器,獲取生理數(shù)據(jù)[5],分析正常狀態(tài)和疲勞狀態(tài)下生理數(shù)據(jù)的差異來判斷疲勞與否,這種方法檢測精度高,但是需要駕駛員的配合以及昂貴的信號采集設備,需要與駕駛員的身體進行接觸,比較容易引起駕駛員的不適和反感。另一種是基于行駛中車輛本身的方法,如通過研究車速、車輛軌跡、車道偏離等,來判斷疲勞駕駛狀態(tài)。Ma等[6]通過小波分析和神經(jīng)網(wǎng)絡來計算目標車輛的橫向距離來預測駕駛員疲勞狀態(tài),這種方法受限于車道、駕駛員駕駛習慣,以及路面狀況等,通常很難應用于復雜的實際場景中。還有一種通過攝像頭捕捉駕駛員面部信息的方法,通過分析眨眼頻率、是否打哈欠、PERCLOS(Percentage of Eyelid Closure over the Pupil)[7]等疲勞特征來判斷駕駛員的狀態(tài),Alioua等[8]通過Hough提取眼部和嘴部特征,利用SVM(Support Vector Machine,支持向量機)分類器來完成疲勞狀態(tài)判斷。這種基于計算機視覺的方法因其低侵入性、低成本的特點,受到了較廣泛的應用。
近年來,以CNN(Convolutional Neural Networks,卷積神經(jīng)網(wǎng)絡)為代表的深度學習模型[9]在計算機視覺領域的一系列問題(如分類、目標檢測、圖像分割等)上取得了巨大的成功。如果將疲勞檢測視為圖像分類問題,則很容易應用深度網(wǎng)絡模型。例如,Kurylyak等[10]提出的基于卷積神經(jīng)網(wǎng)絡的哈欠檢測算法,直接將駕駛員面部圖片輸入神經(jīng)網(wǎng)絡,Softmax分類器用于判別駕駛員疲勞狀態(tài),疲勞(1)或非疲勞(0),在YawDD[11](Yawning Detection Dataset)上取得了95.81%的準確度。但是在實際應用中,疲勞狀態(tài)往往是以序列的形式出現(xiàn)的,是一個動態(tài)的過程,很難通過單張圖片來判斷駕駛員是否疲勞?;跁r序數(shù)據(jù)的方法大多通過加窗的方式,對窗口內的數(shù)據(jù)加以處理,并手動提取特征,例如鐘奕輝[12]根據(jù)窗口內的視頻幀計算眨眼間隔時間估計疲勞程度;Junaedi等[13]先判斷視頻幀中人眼部的狀態(tài),再計算PERCLOS值來判斷疲勞狀態(tài),并使用P60[14]標準在YawDD上獲得了最高83.66%的準確率。這種方法需要手動設置閾值,根據(jù)提取特征與閾值進行比較,當駕駛員臉部差異較大或個人習慣不同時,閾值不同,泛化性不強。另一種方法對手動提取的特征進行特征融合[15]或接入如SVM[16]、MLP(Multilayer Perceptron,多層感知機)等分類算法對疲勞狀態(tài)進行識別,這兩種方法都需要手動設計特征且只針對臉部部分區(qū)域(如眼部、嘴部特征),不能充分利用臉部疲勞特征。
基于以上研究,本文提出了一種基于CNN和長短期記憶(Long Short-Term Memory,LSTM)單元的端到端可訓練網(wǎng)絡,并利用MTCNN(Multi-Task Cascaded Neural Networks,多任務級聯(lián)神經(jīng)網(wǎng)絡)檢測人臉關鍵點,提取感興趣區(qū)域(Region of Interest,ROI),將拼接后的融合了嘴部區(qū)域和眼部區(qū)域的ROI放入CNN中提取特征,多幀圖片提取后的特征再經(jīng)過LSTM單元學習序列特征,輸出疲勞狀態(tài)(疲勞、打哈欠、非疲勞)。模型通過逐幀處理而不是基于窗口預測,因此,它檢測速度快,消耗的計算成本較低,并且能夠實時工作。實驗表明本文方法在疲勞檢測數(shù)據(jù)集NTHU-DDD[17]中獲得了98%以上的準確率并有較好的實時性。
疲勞檢測算法整體流程圖如圖3所示。
圖3 疲勞檢測算法流程圖
具體流程如下:
① 圖片經(jīng)過一個MTCNN[18]提取ROI,將ROI調整成網(wǎng)絡輸入所需的比例后拼接成單張圖片輸入進CNN。
② CNN對連續(xù)視頻幀中的ROI進行特征提取,提取后的序列特征進入LSTM單元學習時序特征。
③ LSTM提取的特征經(jīng)過Softmax分類器對當前視頻幀進行分類(正常、疲勞、打哈欠3種狀態(tài))。
YawDD是由Abtahi等制作的視頻數(shù)據(jù)集,用于哈欠檢測模型的設計與測試,其中包含了多名駕駛員在駕駛位上的視頻。視頻分為兩部分,一部分是攝像頭位于車內后視鏡下方,側對著駕駛員錄制得到的;另一部分是攝像頭位于儀表盤上方,正對著駕駛員,采集到駕駛員的正面圖像,每秒采集30幀。每個駕駛員錄制3~4段視頻。此數(shù)據(jù)集用于驗證模型的泛化性。本文取正臉部分數(shù)據(jù)集,按照視頻文件的分類將數(shù)據(jù)集分為打哈欠和正常兩種狀態(tài)。
疲勞駕駛檢測數(shù)據(jù)集采用來自于臺灣國立清華大學的NTHU-DDD[17](Driver Drowsiness Detection),包括正常駕駛和疲勞駕駛的視頻數(shù)據(jù)集。在白天和黑夜兩種場景下拍攝,包含了戴眼鏡、不戴眼鏡、打哈欠、低頭等多種動作。圖像幀像素格式為640像素×480像素,每段視頻平均60 s左右,每秒取15幀(黑夜)或30幀(白天)。此數(shù)據(jù)集用于模型的訓練與測試。由于數(shù)據(jù)集的標簽只有0(正常)和1(疲勞)狀態(tài),而本文模型輸出3種狀態(tài)(正常、疲勞和打哈欠),于是對數(shù)據(jù)集重新制作標簽,將本來類別為1(疲勞)的視頻幀按照順序分為1(疲勞)和2(打哈欠)。圖4為從NTHU-DDD中的一段連續(xù)的視頻均勻采樣截得的視頻幀。
圖4 NTHU-DDD部分視頻幀
NTHU-DDD分為訓練集、驗證集和測試集,其中訓練集來自18位志愿者,共360段視頻,包括723248個視頻幀;驗證集來自4位志愿者,共20段視頻,包括173299個視頻幀;測試集包括所有志愿者的70段視頻,包括736132個視頻幀。
YawDD采用的正臉部分數(shù)據(jù)集包括16段男性視頻和13段女性視頻,男性視頻共有36126幀,女性視頻共有28467幀。YawDD中的數(shù)據(jù)僅用于測試。
生物醫(yī)學研究表明,疲勞狀態(tài)是一個漸進的過程,初期表現(xiàn)為眨眼頻率變高、打哈欠、哈欠持續(xù)時間變長,后期表現(xiàn)為眼睛閉合程度增大、眼睛閉合時間增長等。因此面部區(qū)域中能表現(xiàn)疲勞特征的是眼部和嘴部,為了去除無關信息,而將有用的ROI送入CNN中進行訓練,首先應用MTCNN提取面部關鍵點,基于特征點截取出眼部和嘴部區(qū)域,再拼接成整個圖片。
2.2.1 圖片角度矯正
由于本文數(shù)據(jù)集中存在部分視頻幀未能正臉面對攝像頭,可能會出現(xiàn)頭部向左或者向右偏轉的情況。為了能夠正確提取出ROI,對于這種圖片,首先需要對其進行角度矯正,如圖5所示。
圖5 圖片旋轉過程
圖5中,假設在圖片經(jīng)過MTCNN后輸出的關鍵點中,左眼和右眼分別為A點(xA,yA)和B點(xB,yB),那么此時兩眼連線與水平方向的夾角θ(即傾斜角度)為
(1)
將圖片圍繞中心點Z(x0,y0)旋轉θ°,即可調整至水平狀態(tài)。此時原圖片中任意點的坐標P(xi,yi)將調整至P′(x′i,y′i)。計算規(guī)則如下:
yi=2y0-yi
(2)
2.2.2 提取眼部ROI
得到2.2.1節(jié)中輸出的圖片及關鍵點坐標后,提取眼部ROI,如圖6所示。
圖6 提取眼部ROI
圖6中眼部矩形框即為提取的ROI區(qū)域,坐標點以及矩形框寬度w、高度h之間的關系如下:
(3)
式中:xC為C點x軸坐標;yC為C點y軸坐標;d為兩眼之間橫向距離。
同理,右眼區(qū)域與左眼區(qū)域經(jīng)過相同處理。
2.2.3 提取嘴部ROI
嘴部區(qū)域ROI處理與眼部類似,將比例調整至合適范圍內。如圖7所示,嘴部矩形框左上角C點的坐標為
圖7 提取嘴部ROI
(4)
式中:xC為C點x軸坐標;yC為C點y軸坐標;d為兩眼之間橫向距離。
將NTHU-DDD中所有視頻幀在訓練之前都進行上述ROI提取處理,將得到的結果拼接成為一張新的圖片,正好可以得到一張長寬大小相同的圖片。部分訓練集圖片如圖8所示。將圖片調整為227像素×227像素的格式,做好數(shù)據(jù)標簽,以便下一步訓練網(wǎng)絡所用。
圖8 經(jīng)過ROI提取后的數(shù)據(jù)集
CNN因其在ImageNet上的出色表現(xiàn),受到了大量的關注和研究,廣泛應用于各類視覺任務。隨著網(wǎng)絡層數(shù)的加深,模型的表達能力也越強,然而當網(wǎng)絡層數(shù)到達一定程度,由于梯度消失問題,導致在視覺任務中的準確率不升反降。ResNet使用跳連接[19],即殘差塊(Residual Block)來解決這類問題,使得在復雜的視覺任務中可以更好地應用深度網(wǎng)絡。ResNet基本單元如圖9所示。
圖9 ResNet基本單元
筆者選用的用于提取面部特征的ResNet-18中使用了4組這樣的單元,每組2個。
使用從ImageNet上遷移過來的網(wǎng)絡,加載預訓練權重,開放部分權重用于訓練,加快收斂速度,防止過擬合。除了ResNet-18外,還使用了VGG-16[20],DenseNet[21]、AlexNet[22]這些在ImageNet上表現(xiàn)出色的網(wǎng)絡用于對比特征提取器的效果。
LSTM[23]是遞歸神經(jīng)網(wǎng)絡(Recurrent Neural Network,RNN)的改進網(wǎng)絡。區(qū)別于CNN對單張圖片的特征提取及分類,LSTM的模型輸出與之前檢測的視頻幀結果是有關的。它將上一時序網(wǎng)絡的隱層狀態(tài)輸出到下一時序網(wǎng)絡中,與當前序列數(shù)據(jù)一同訓練,因此,它更擅長于處理時序數(shù)據(jù)。RNN示意圖如圖10所示。
圖10 RNN示意圖
圖10中,ht+1為當前序列的隱狀態(tài),它根據(jù)當前的訓練樣本xt+1以及上一序列的隱狀態(tài)ht進行計算得出。LSTM在上述基本單元上又添加了3個控制門結構,即輸入門、遺忘門和輸出門,能夠遺忘掉次要的特征信息而記住更明顯的疲勞特征。
筆者使用從ImageNet上遷移過來的ResNet-18提取特征,如圖11所示。凍結部分層的權重,開放后n層進行fine-tune。連續(xù)的視頻幀經(jīng)過ROI提取后輸入進ResNet-18,輸出的線性特征再接入LSTM網(wǎng)絡學習時序特征,最終輸出的特征經(jīng)過Softmax分類得到駕駛員疲勞狀態(tài)。圖11中的Basic Block為圖9中的基本單元。
圖11 疲勞檢測網(wǎng)絡結構圖
筆者采用隨機裁剪、旋轉和噪聲處理進行數(shù)據(jù)增強,通過減去圖片通道平均值實現(xiàn)歸一化。優(yōu)化器采用SGD(Stochastic Gradient Descent)算法。批次大小設為256,權重衰減系數(shù)設為0.0005,動量設為0.9,初始學習率設為0.01。并將LSTM單元的步長設為16,即選擇連續(xù)的16幀作為檢測窗口。權重采用預訓練模型初始權重,開放后10層更新權重,防止過擬合,在NVIDIA GTX 1080Ti上訓練的迭代次數(shù)為200。
將ResNet-18與其他分類網(wǎng)絡(AlexNet、VGG-16和DenseNet)用相同的配置進行訓練,同時,用ResNet18在不經(jīng)過ROI提取的原始數(shù)據(jù)集上進行訓練以作為比較。實驗中損失值以及驗證集中準確率曲線如圖12和圖13所示。
圖12 損失值變化曲線
由圖可知,VGG網(wǎng)絡在訓練中的振動幅度較大,AlexNet-LSTM網(wǎng)絡的檢測效果最差,ResNet18和DenseNet提取面部特征的能力較為出色。經(jīng)ROI提取后的ResNet18-LSTM網(wǎng)絡性能最佳,在驗證集上達到98.56%的準確率。在原始數(shù)據(jù)集上訓練的ResNe18-LSTM達到了97.22%的準確率。相較于原始數(shù)據(jù)集,ROI提取明顯抓住了反映疲勞特征的關鍵區(qū)域,提升了準確率。各網(wǎng)絡在驗證集上的最終識別準確率具體如表1所示。
表1 各網(wǎng)絡在NTHU-DDD數(shù)據(jù)集上的準確率
各個主干網(wǎng)絡在ImageNet上的精度與參數(shù)量大小信息如圖14所示[24]。圖14中圓形的中心為模型在圖表中的位置,圓形的大小對應模型的參數(shù)量,橫軸為計算量,縱軸為Top-1的準確率,越靠近左上角的模型計算復雜度越低、準確率越高,越小的模型參數(shù)越少。一般來說,網(wǎng)絡參數(shù)量和計算量越大,表示模型容量越大,而精度越高代表網(wǎng)絡提取特征的能力越強。由表1信息可知,主干網(wǎng)絡提取特征能力越強,則遷移后的疲勞檢測網(wǎng)絡識別準確率越高,而模型參數(shù)量達到一定量級后,可能會出現(xiàn)過擬合而導致檢測率不升反降。例如精度接近的VGG-16和ResNet-18,VGG-16由于模型過大而產生的過擬合(可通過表1中數(shù)據(jù)輔證,VGG-16在訓練集上的精度很高,在驗證集上卻出現(xiàn)精度下降),導致疲勞檢測網(wǎng)絡中ResNet-18的精度要遠高于VGG-16,且計算量更小。這說明在遷移學習任務中,選擇適合的模型尤為重要。
圖14 各主干網(wǎng)絡精度與模型大小對比
接著將模型與其他同樣在NTHU-DDD測試集上測試的基于時序數(shù)據(jù)的方法進行對比。不同方法使用相同的預處理方法,使用模型與最終準確率如表2所示。
由表2可知,基于LSTM網(wǎng)絡的方法整體要優(yōu)于視頻幀中加窗分析的方法,而經(jīng)過預處理后的數(shù)據(jù)集識別準確率也得到了提升,這說明本文預處理方法對于疲勞檢測數(shù)據(jù)集是有效的。
表2 不同方法在NTHU-DDD測試集上的結果對比
下面討論上文中提出的網(wǎng)絡模型所涉及到的兩個重要參數(shù)。通常駕駛員一次眨眼的過程需要約0.3 s,當出現(xiàn)疲勞駕駛時,司機眨眼變慢,一次眨眼過程持續(xù)時間更長。這對應于4.1節(jié)提到的LSTM中步長的選擇。步長過大,則當前幀之前的視頻幀對當前狀態(tài)影響更大,LSTM可能會提取不重要的特征;反之,步長過小,則忽略掉的視頻幀越多,可能會學習不到序列特征。因此,選擇不同的步長進行實驗,對比得出最佳步長為16。實驗結果如圖15所示,曲線代表準確率與步長的關系。
圖15 步長對網(wǎng)絡檢測效果的影響
對于采用的ResNet-18預訓練模型,開放層數(shù)也會影響模型精度,層數(shù)過多,可能導致在小樣本數(shù)據(jù)集上不收斂,層數(shù)過低,可能學習不到數(shù)據(jù)集本身的特征,無法很好地遷移到目標任務中。通過實驗得出當開放層數(shù)為10的時候,準確率達到峰值。開放層數(shù)與模型最終精度的關系如圖16所示。
圖16 開放層數(shù)與模型最終精確度的關系曲線
為了驗證模型的泛化能力,將其應用于YawDD數(shù)據(jù)集,并與其他哈欠檢測算法[13,26-27]進行比較,由于本文模型輸出打哈欠、疲勞和正常3個狀態(tài),而數(shù)據(jù)集中只標注了打哈欠和正常2個狀態(tài),于是將輸出為疲勞的數(shù)據(jù)歸結于正常狀態(tài),測試結果如表3所示。
表3 不同算法在YawDD數(shù)據(jù)集上的檢測結果
如表3所示,在基于PERCLOS的方法中,不同的標準(P60,P70,P80)下有不同的結果,表3中記錄了方法在數(shù)據(jù)集多個部分中的最好結果。而本文方法在未經(jīng)YawDD數(shù)據(jù)訓練的情況下直接測試,達到了與主流哈欠檢測算法近似的精度,由此說明模型泛化性較強。
為了測試模型在實際場景中的實時性,在NVIDIA GTX 1080Ti環(huán)境下檢測連續(xù)的視頻幀,將攝像頭捕捉圖片裁剪為200像素×150像素的大小,提取ROI后輸入LSTM網(wǎng)絡,測出檢測速度為25 f/s,平均檢測一幀的速度為40 ms,其中提取ROI所用時間與檢測疲勞狀態(tài)所用時間比例約為1∶1。在駕駛員疲勞檢測任務中實時性較強。若將模型放于更高配置的GPU服務器上提供服務,則可以進一步提升檢測效率。
本文首次提出了一種將LSTM應用于駕駛員面部時序數(shù)據(jù)中的方法,根據(jù)面部關鍵點提取疲勞特征ROI,通過遷移學習提取圖像特征,并結合LSTM處理時序數(shù)據(jù)的能力,提出了一種能夠檢測疲勞駕駛的端到端可訓練網(wǎng)絡。在公開數(shù)據(jù)集中達到了較高的精度,同時具有較好的泛化能力,對于公共交通安全以及駕駛員人身安全保護具有很重要的意義。下一步研究可將模型放入云端,開發(fā)Restful API并提供HTTP服務,以此實時檢測終端駕駛員的疲勞狀態(tài)。