鄭偉成,李學偉,劉宏哲,代松銀
(北京聯合大學 北京市信息服務工程重點實驗室,北京 100101)
疲勞駕駛是指駕駛人員在長時間連續行車后,造成生理和心理機能的失調,而在客觀上出現駕駛技能下降的現象。駕駛人員疲勞后繼續駕駛車輛,身體會出現困倦瞌睡、注意力不集中、駕駛操作停頓或對危險情況的預判能力下降等不安全因素,極易發生道路交通事故。近年來,世界各大汽車廠商與科研機構將疲勞駕駛檢測技術作為研究重點并取得了相關研究成果,其主要分為主觀檢測和客觀檢測兩大類。主觀檢測方法主要靠駕駛人員的主觀因素進行判斷,可靠性不高,很難成為評價疲勞駕駛的標準,而客觀檢測方法可靠性相對較高,已成為疲勞駕駛檢測的主要方法。
客觀檢測方法主要分為基于生理特征的檢測方法、基于車輛行駛信息的檢測方法及基于駕駛人員行為特征的檢測方法3類。其中,基于駕駛人員行為特征的檢測方法通過分析駕駛人員的眼睛狀態(如眨眼幅度、眨眼頻率等)、嘴部運動、頭部姿態等,實現駕駛人員的疲勞檢測。此類方法與前兩者相比,有非接觸性、準確性高、成本低及易實現等優點,因此疲勞駕駛預警系統具有極其廣闊的市場前景。
基于駕駛人員行為特征的檢測方法根據面部疲勞特征又可分為基于眼部特征的檢測方法、基于嘴部特征的檢測方法及基于頭部姿態的檢測方法3類。在基于眼部特征的檢測方法中,當駕駛人員出現疲勞駕駛時,其眼睛閉合持續時間會明顯變長,眨眼頻率會加快或減少,因此眼部特征直接反映駕駛人員的精神狀態。文獻[1]定位出人眼區域后,在人眼定位過程中,采用OSTU閾值分割、非線性點運算和積分投影等預處理過程消除眉毛,并利用模糊綜合評價算法對眼睛矩形區域的長寬比、擬合橢圓面積、瞳孔黑色素所占比例這3個影響因子進行分析,判別出眼睛的睜開閉合狀態,最后根據PERCLOS[2]原理對駕駛人員的疲勞狀態做出判斷。在基于嘴部特征的檢測方法中,當駕駛人員感到疲勞時,嘴部會自發地發生打哈欠的行為,嘴部張開程度大,張開時間持久。文獻[3]通過分析標注剝奪睡眠的駕駛人員視頻數據集,說明面部觸摸、人臉遮擋及打哈欠之間的關系,提出面部觸摸可作為檢測打哈欠的新線索,并提出一種通過提取嘴部和眼部區域的幾何和外觀特征來檢測打哈欠的方法。在基于頭部姿態的檢測方法中,當駕駛人員產生疲勞時,打瞌睡點頭次數會增多,出現長時間不正視前方等姿態。文獻[4]提出一種基于面部特征點定位的頭部姿態估計方法。在檢測到的人臉區域,使用Hough圓檢測方法定位眼睛和鼻孔,利用人眼和鼻孔的位置信息,將眼睛、鼻子定位結果與正臉頭部姿態中的眼睛、鼻子進行對比,從而對不同的頭部姿態進行粗估計。文獻[5]提出一種簡單且魯棒的頭部姿態確定方式,通過訓練一個多損失函數的卷積神經網絡,直接使用RGB結合分類和回歸損失來預測頭部姿態歐拉角。
傳統基于駕駛人員行為特征的檢測方法使用HOG、SIFT、Haar等特征描述子,人工提取特征進行模式識別,在實際復雜的駕駛環境下檢測精度通常不能滿足需求,且魯棒性也有待提高。深度學習[6-7]技術是一類能從數據中自動學習特征表示的方法,近年來在目標檢測[8-9]、目標跟蹤[10-11]、人臉識別[12-13]、場景理解[14]等圖像處理領域取得了快速發展,其強大的特征學習能力,對部分遮擋、光照變化等外界條件表現出較強的魯棒性。因此,本文提出基于深度學習的疲勞駕駛檢測算法,選取表征疲勞駕駛常用且有效的眼睛閉合程度、嘴巴張開程度和頭部姿態等參數指標,利用多特征融合策略檢測駕駛人員的疲勞程度。
本文提出的基于深度學習的疲勞駕駛檢測算法具體步驟為:1)利用改進的MTCNN[15]人臉檢測模型檢測出攝像頭實時獲取畫面中的駕駛人員人臉圖像;2)基于人臉圖像,使用具有較高效率和準確率的PFLD[16]模型進行人臉關鍵點檢測,從而定位出眼部和嘴部;3)根據人臉關鍵點計算出人臉圖像的頭部姿態歐拉角,即俯仰角(Pitch)、偏航角(Yaw)及滾轉角(Roll);4)采用多特征融合策略,根據眼部、嘴部和頭部的疲勞特征建立疲勞駕駛預測模型,實現對疲勞駕駛的預警。算法總體流程如圖1所示。

圖1 基于深度學習的疲勞駕駛檢測算法流程
MTCNN是結合級聯與由粗到精思想的深度學習模型(級聯結構包括PNet、RNet及ONet),其是目前應用十分廣泛的特定目標檢測器,也是少數能在傳統硬件上進行實現的檢測器。對于人臉檢測任務,在人臉數少于5的情況下,其具有較高的檢測水準并且有極大的優化空間,通過模型訓練可在移動端達到極快的檢測速度。實驗結果表明,原始MTCNN模型在速度方面存在瓶頸,具體為:1)輸入圖片越大,PNet耗時越長;2)人臉越多,ONet和RNet耗時越長;3)噪點比較多的夜晚圖像會導致PNet誤檢增加。
針對PNet、ONet和RNet耗時長的問題,采取優化網絡結構的策略,使其在精度下降不明顯的情況下,盡可能減少計算量。改進方法主要為使用ShuffleNet[17]中的shuffle-channel思想,將特征的通道平均分到不同組中,使每個組在卷積時能得到其他組的信息,增加不同channel之間的關聯性。實驗為對比改進方法的優越性,采用Xception[18]中depthwise卷積思想以減少計算量和提升效率。首先對輸入圖的每個通道進行卷積,然后由1×1卷積將通道進行合并。實驗結果證明,此操作基本可以等同于普通的空間卷積,并且在I/O效率和性能不變的情況下,計算量降低了90%。因此,利用該方法替換PNet、RNet和ONet中的卷積操作,可使模型檢測速度得到大幅提升。
由于駕駛場景下攝像機采集的一般為單張人臉圖像,因此實驗僅在單張人臉數據集上進行測試,使用的深度學習框架為TensorFlow,測試硬件環境為i7-9750H CPU,測試軟件為Pycharm2018。在某些監控場景的夜晚圖片中,會有大量噪點的出現,導致PNet產生大量的誤檢候選區。為減少這些噪點的出現,實驗在PNet檢測前,使用一次中值濾波進行快速去噪,具有較好的實驗效果。
在疲勞駕駛檢測應用場景中,除了根據人臉關鍵點定位眼部及嘴部外,還可利用關鍵點進行頭部姿態估計,計算頭部姿態的歐拉角。圖2為人臉中的68個關鍵點。

圖2 人臉中的68個關鍵點
從實用性角度來看,人臉關鍵點檢測面臨諸多問題:1)人臉表情變化很大,真實環境光照復雜,而且現實中存在大量人臉局部被遮擋的情況等;2)人臉是3D的,位姿變化多樣,另外,因拍攝設備和環境影響,成像質量也有所不同;3)現有訓練樣本的各個類別存在不平衡問題;4)在計算受限的設備(如手機)終端時,必須考慮計算速度和模型規格問題。
為解決以上問題,本文提出人臉關鍵點檢測模型PFLD。該模型的主干網絡用于定位關鍵點的位置,在訓練時加入預測人臉姿態的輔助網絡以提高定位精度,但在測試時省略該網絡。對于訓練樣本類別不平衡問題,PFLD通過修改loss函數,在訓練時關注稀有樣本,如果某類別樣本較少則賦予較大的權重,并使用輕量級模型提高計算速度和降低模型規格。
在模型設計上,PFLD模型的骨干網絡未采用VGG16[19]、ResNet[20]等網絡,但為增加模型的表達能力,對MobileNet[21]的輸出特征進行結構修改,通過融合3個不同尺度的特征來增加模型表達能力,并且為更好地兼容嵌入式設備,PFLD模型進行了性能優化,在驍龍845芯片中的效率可達140 frame/s,模型內存為2.1 MB,在許多關鍵點檢測的Benchmark中也取得了較好的結果。
在實際駕駛環境中,頭部姿態主要用來判斷駕駛人員的注意力情況,如檢測長途司機是否在目視前方,若長時間不目視前方,則給予相應警告,以保證安全,減少事故。
頭部姿態歐拉角的計算分為:1)2D人臉關鍵點檢測(使用PFLD模型),該部分采用的人臉關鍵點有鼻尖、下巴、左眼的左角、右眼的右角、左嘴角、右嘴角;2)3D人臉模型匹配;3)求解3D點和對應2D點的轉換關系;4)根據旋轉矩陣求解歐拉角。
人臉相對于相機的姿態可以使用旋轉矩陣和平移矩陣進行表示,其中:平移矩陣(t)表示物體相對于相機的空間位置關系矩陣;旋轉矩陣(R)表示物體相對于相機的空間姿態關系矩陣。具體的計算過程為:人臉特征的3D坐標是以世界坐標系進行表示,如果旋轉和平移均已知,那么可以將世界坐標中的3D點轉換到相機坐標系中的3D點;然后采用相機的內在參數(焦距、光學中心等),將相機坐標系中的3D點再投影到圖像平面(如圖像坐標系)。圖3為坐標系統的工作原理。

圖3 坐標系統工作原理
世界坐標系到相機坐標系的轉換、相機坐標系到像素坐標系的轉換如式(1)、式(2)所示:

(1)
(2)
像素坐標系和世界坐標系的關系為:
(3)
式(3)可用DLT算法結合最小二乘進行迭代求解,最小二乘的目標函數為:
(4)
其中,帶“^”的變量為預測值,其余為測量值。若相機存在徑向和切向畸變,則需先將相機坐標系轉換到圖像中心坐標系(如式(5)所示),然后計算畸變(如式(6)所示),最后得到圖像中心坐標系和像素坐標系的關系(如式(7)所示)。

(5)
(6)
(7)
由式(7)可以看出,若已知世界坐標系內點的位置、像素坐標位置和相機參數,則可以使用Opencv中求解PnP問題的solvePnP函數計算旋轉和平移矩陣,計算得到的旋轉矩陣為:
(8)
其中:

(9)

(10)

(11)
最終得到的歐拉角為:
(12)
其中,世界坐標系的中心位置由3DMM模型進行確定[22]。實驗中首先對DLT算法進行了改進,即隨機輕微地改變姿態(R和t),然后檢查重投影誤差的衰減情況,如果是衰減,則接受為新的姿態,最后繼續調整R和t以尋找更好的姿態。
駕駛人員眼部的運動和眨眼信息被認為是反映疲勞狀態的重要特征,眼部疲勞檢測算法利用PERCLOS中的P80標準和眨眼頻率進行眼部疲勞特征提取。
5.1.1 PERCLOS值
PERCLOS是卡內基梅隆研究所經過反復實驗和論證提出的度量疲勞/瞌睡的物理量。研究表明,在PERCLOS常用的判定標準中,P80標準與疲勞駕駛的相關性較高,P80標準指當眼瞼遮住瞳孔的面積超過80%時記為眼睛閉合,統計在一定時間內眼睛閉合時所占的時間比例,其原理如圖4所示。

圖4 PERCLOS中的P80標準原理
PERCLOS值的計算公式如下:
(13)
其中,fp是PERCLOS值,若D為眼睛完全睜開時的上下眼瞼距離,則t1是D減少20%的時刻,t2是D減少80%的時刻,t4是眼睛由閉合增加至D的20%的時刻,t5是眼睛由閉合增加至D的80%的時刻。PERCLOS值與眼睛睜開程度密切相關,眼睛睜開程度由眼睛上下眼瞼圍成面積的變化進行表示。將眼睛上下眼瞼的輪廓與虹膜看作兩個嵌套的橢圓,如圖5所示。

圖5 P80標準的眼睛輪廓模型
眼睛面積為S=πwh,其中,w表示眼睛寬度,h表示上下眼瞼的垂直距離。w和h的計算公式如下:
(14)
其中,x39、x36為第39個和第36個關鍵點的橫坐標,y40、y38為圖2中第40個和第38個關鍵點的縱坐標(索引下標從0開始)。S的最終取值為左右眼睛面積的平均值,設眼睛睜開百分比為R,則可以得到:
(15)
其中,wmax、hmax、Smax分別為眼睛完全睜開時的值,終端采集視頻中每幀圖片的眼睛睜開程度按照R值進行評定,再根據某時間段推算得到fp值。在一般情況下,正常人的閉眼速度為0.2 s,如果閉眼持續時間超過0.8 s,則為疲勞狀態。
5.1.2 眨眼頻率
據統計,正常人每分鐘眨眼約20次,每次眨眼時間間隔約3 s,發生疲勞時眨眼的頻率會加快,若平均每秒眨眼一二次,屬于應預警的疲勞級別,因此可以通過眨眼頻率(即單位時間內眨眼次數)來判斷駕駛人員是否疲勞。眨眼頻率fblink為:
(16)
其中,NB為時間段T內發生眨眼動作的次數,可由眼睛縱橫比(Eyes Aspect Ratio,EAR)來確定,NP為時間段T內的視頻總幀數。以圖2中的左眼為例,提取的人臉左眼關鍵點分布如圖6所示。

圖6 人臉左眼關鍵點分布
EAR的計算公式為:
(17)
其中,y37、y41、y38、y40分別為第37個、第41個、第38個和第40個關鍵點縱坐標的坐標值,x36、x39分別為第36個、第39個關鍵點橫坐標的坐標值。EAR的最終取值為左右眼EAR的平均值。EAR在眼睛睜開時基本保持不變,在小范圍內會上下浮動;當眼睛閉合時,EAR會迅速下降,即進行一次眨眼動作,由此計算出時間段T內發生眨眼動作的次數NB。
嘴部狀態通常有閉合、說話及打哈欠3種,在疲勞狀態下,人會頻繁地打哈欠。類似于眼部疲勞特征的提取,提取的人臉嘴部區域的關鍵點分布如圖7所示。

圖7 人臉嘴部關鍵點分布
嘴部寬度W及高度H計算如下:
(18)
W與H的比值K為:
(19)
其中,xmax、xmin分別為第54個和第48個人臉關鍵點的橫坐標,ymax為第56個、第58個關鍵點縱坐標的平均值,ymin為第50個、第52個關鍵點縱坐標的平均值。打哈欠時嘴巴的張開程度最大,此時K值變小,由此可判斷駕駛員是否打哈欠。打哈欠的頻率fyawn為:
(20)
其中,NY為時間段T內打哈欠的次數,NT為時間段T內的視頻總幀數。NY的計算方法同眨眼次數NB,可由嘴部縱橫比(Mouth Aspect Ratio,MAR)來確定。
文獻[23]研究發現,成年人的頭部運動范圍包括-60.4°~69.6°的矢狀屈曲和伸展(即從頸部向后運動,Pitch),-40.9°~36.3°的正面側向彎曲(即頸部從右向左彎曲,Roll),-79.8°~75.3°的水平軸向旋轉(即從頭部向左旋轉,Yaw)。當駕駛人員處于疲勞狀態時,通常會無意識地出現身體的前傾后仰、左右傾斜或其他疲勞姿態,導致不能進行正確的駕駛操作,最常見的表現為駕駛人員頭部的點頭頻率和異常姿態,即Roll、Pitch及Yaw旋轉角度的變化。
5.3.1 點頭頻率
頭部姿態檢測得到的歐拉角中前后方向的Pitch與駕駛人員的點頭頻率相關。當Pitch達到一定閾值時判定為點頭動作。點頭頻率fnode為:
(21)
其中,NN為時間段T內發生點頭動作的次數,NT為時間段T內的視頻總幀數。
5.3.2 異常姿態
本文疲勞駕駛檢測算法在頭部姿態檢測的基礎上,結合PERCLOS的P80標準,當頭部姿態歐拉角發生20%的角度變化時,則判定駕駛人員處于異常姿態,即Roll的異常范圍為-56.3°~-40.9°、36.3°~51.7°,Pitch的異常范圍為-86.4°~-40.9°、69.6°~95.6°,Yaw的異常范圍為-110.8°~-79.8°、75.3°~106.3°。異常姿態指標fpose為:
(22)
其中,NP為時間段T內檢測出異常姿態的幀數。
6.1.1 人臉檢測模型
改進的MTCNN人臉檢測模型使用基準人臉數據集WIDER FACE[24]進行訓練,在下載的數據集上共有12 880幅圖像,其中包括159 424張人臉。如圖8所示,其中矩形框為人工標注邊界框,人臉在尺度、姿態、遮擋、表情、裝扮、光照等方面都有很大差異,人臉特征具有多樣性。在訓練模型時,根據圖像的識別難度將數據集劃分為3個子集,其中50%作為測試集,40%作為訓練集,10%作為驗證集。訓練模型正負樣本的處理參考原始MTCNN的訓練方法。為驗證MTCNN改進模型的性能,實驗分別采用ShuffleNet中的shuffle-channel和Xception中的depthwise思想進行模型訓練和測試,實驗結果如表1所示,其中第2組比第3組速度慢的原因為1×1卷積占據了depthwise卷積80%~90%的計算量,shuffle-channel正好解決了計算量和不同通道通信的問題,可以看出shuffle-channel方法具有更高的效率。在駕駛環境下,MTCNN-shuffle人臉檢測模型的檢測效果如圖9所示。

圖8 WIDER FACE數據集樣本

表1 MTCNN及其改進模型的比較

圖9 駕駛環境中的人臉檢測
6.1.2 人臉關鍵點檢測模型
人臉關鍵點檢測模型PFLD使用300W[25]和AFLW[26]兩個基準數據集訓練和測試模型。300 W是用于人臉關鍵點檢測的競賽數據集,其中每幅圖像的每張人臉有68個關鍵點。300W數據集包含LFPW[27]、AFW[28]、HELEN[29]及IBUG[30]4個數據集,共3 837幅人臉圖像。實驗使用3 148幅圖像作為訓練集,689幅圖像作為測試集。具體地,測試集分為3個子集:1)具有挑戰性的集合(IBUG中的135幅圖像);2)一般集合(LFPW測試集中的224幅圖像,HELEN測試集中的330幅圖像,共554幅圖像);3)全集(全部測試圖像,共689幅圖像)。AFLW數據集提供了大規模人臉圖像集合,每張人臉面部有21個標志,表現出各種各樣的外觀及一般的成像和環境條件。實驗分別使用20 000幅圖像和4 386幅圖像作為訓練集和測試集。
在訓練期間,所有人臉圖像被裁剪或重置大小至112×112。實驗采用深度學習框架TensorFlow,批量大小(BatchSize)設置為512,優化器為Adam,權重衰減設置為10e-6,動量為0.9,最大迭代次數為70 000次,整個訓練過程的學習率固定為10-4。訓練硬件環境為單卡Nvidia GTX 2060 GPU。對于300W數據集,實驗采用數據增強技術,如對每個樣本水平翻轉并以5°為間隔從-30°至30°對圖像樣本進行旋轉。考慮到真實駕駛環境,進一步增強模型泛化能力,并對每個樣例中的人臉圖像做了20%的隨機遮擋。對于AFLW數據集,實驗沒有使用任何數據增強技術而是直接輸入原始圖像。圖10為駕駛環境下人臉關鍵點檢測及定位出的眼部及嘴部。

圖10 駕駛環境中的人臉關鍵點檢測
6.1.3 疲勞駕駛檢測模型
疲勞駕駛檢測模型使用YawDD[31]數據集作為疲勞檢測的標準數據集,該數據集包含不同性別、年齡的駕駛人員在不同光照環境下拍攝的模擬駕駛視頻。駕駛人員的面部特征包括:1)正常駕駛(不說話,標簽為Normal);2)駕駛時說話或唱歌(標簽為Talking);3)開車打哈欠(標簽為Yawning)。數據樣本如圖11所示。

圖11 YawDD數據集樣本
由于數據集中的視頻時間長短不一,為保證準確性,實驗隨機選取時間大于30 s的測試樣本,并將視頻的70%作為訓練集,30%作為測試集。同時,由于每一個視頻中駕駛人員的眨眼、打哈欠及異常姿態次數并未標注,因此實驗時尋找10位觀察者記錄每一個視頻中駕駛人員的眨眼、打哈欠及異常姿態次數,最后取10位觀察者的平均值作為真實數據,同時使用PFLD模型檢測并記錄PERCLOS均值,數據樣本如表2所示。

表2 基于10位觀察者收集的數據樣本
由于疲勞特征的多樣性,單一的疲勞特征很難作為疲勞駕駛的檢測標準,因此疲勞駕駛檢測模型采用多種面部疲勞特征相融合的策略,具體過程如下:
1)獲取各疲勞特征閾值與連續檢測幀數。對單個視頻而言,隨機抽取樣本分別得出眼部EAR閾值α、嘴部MAR閾值β、點頭頻率閾值γ、異常姿態閾值θ與連續檢測視頻幀數F的設定對相應檢測準確率的影響。實驗時所有閾值的設定范圍為0.35~0.75,間隔取值為0.05;F設定的值為[10,15,20]。以眼部EAR閾值為例,準確率為檢測到的眨眼次數與標注數據的比值,如圖12所示。根據以上方法在整個訓練集上進行實驗,最后計算所有樣本的眼部EAR閾值α、嘴部MAR閾值β、點頭頻率閾值γ、異常姿態閾值θ在準確率最高值時的平均值分別作為疲勞檢測時的各特征閾值,F選取準確率最高的值。

圖12 眼部EAR閾值與連續檢測視頻幀數對準確率的影響
2)基于決策樹的疲勞駕駛預測與分類模型。根據以上10位觀察者的標注數據,使用sklearn機器學習庫構建決策樹來預測疲勞駕駛檢測模型,特征選擇標準為Gini指數,輸入為所有疲勞特征組成的向量,輸出為連續檢測給定幀數后判別駕駛人員為正常駕駛、駕駛時說話或唱歌及開車打哈欠這3種情況。
在測試階段,為驗證模型準確率,實驗中還檢測并統計了測試樣本的相關疲勞特征數據,如表3所示。可以看出,駕駛人員在疲勞駕駛時,PERCLOS值、打哈欠次數及頭部異常姿態都有所增加或加重。在測試集的所有視頻中,本文疲勞駕駛檢測模型給出的預警均未出現誤判的情況。

表3 測試樣本的相關疲勞特征數據
在復雜的駕駛環境下,魯棒的人臉檢測和人臉關鍵點檢測是疲勞駕駛檢測的前提,而疲勞特征的選取是疲勞駕駛檢測的關鍵。為此,本文提出一種基于深度學習的駕駛疲勞檢測算法,通過改進MTCNN模型提升人臉檢測效率,使用PFLD模型保證人臉關鍵點檢測魯棒性,采用基于決策樹構建的疲勞駕駛預測與分類模型提高疲勞駕駛檢測準確率。實驗結果表明,該算法在疲勞駕駛檢測準確率和效率方面均有較大的性能提升。后續將通過解決視頻樣本中駕駛人員的極端與異常頭部姿態估計問題,進一步提高疲勞駕駛檢測算法的實時性和準確率。