馮向榮,馬玉琨,李琳芳,安金梁,張志霞
(河南科技學院信息工程學院,河南新鄉(xiāng)453003)
據調查,在我國有27%以上的駕駛員認為有過疲勞駕駛的經歷[1],2010年美國汽車協會交通安全基金會進行了一項交通安全事故調查,結果表明因疲勞駕駛造成的交通事故占比21%[2].因此,如何檢測、識別駕駛員的疲勞程度,及時提醒駕駛員采取措施,避免疲勞駕駛,減少疲勞駕駛交通事故,具有重要意義.關于疲勞駕駛的研究,按疲勞特征選取的不同可以分為4個方面:①基于駕駛車輛行駛特征進行的疲勞檢測,這一類方法主要利用車輛行駛軌跡、行駛速度、駕駛人打方向盤的快慢和握方向盤的松緊等特征來檢測疲勞程度.如Chai等[3]提出了使用方向盤狀態(tài)來檢測疲勞狀態(tài).張明明[4]提出利用駕駛人對方向盤的握力特征來檢測疲勞狀態(tài),此類方法受駕駛習慣、道路情況影響較大,檢測正確率不高.②基于駕駛員生理信號特征進行的疲勞檢測,主要是利用腦電信號、心電信號和肌電信號.如Luo等[5]采集駕駛人前額腦電信號數據,利用自適應多尺度熵特征提取算法進行的疲勞駕駛檢測方法.Wang等[6]利用股二頭肌肌電圖進行的疲勞檢測方法等.這一類方法需要駕駛員穿戴檢測人體生理信息的設備,會干擾到駕駛員的正常駕駛.③利用駕駛員行為特征進行的疲勞檢測.此類方法主要利用駕駛人頭部、眼部、嘴部動作特征來檢測駕駛人疲勞狀態(tài).如Xu等[7]利用眼球運動特征檢測駕駛人的疲勞程度.Knapik等[8]利用熱成像檢測哈欠等.此類方法缺點是易受光線和駕駛員頭部動作影響,優(yōu)點是準確度更高、容易實現、實時性強.④將多個特征進行的融合疲勞檢測[9].此類方法將上述三類采用的特征融合在一起,需要大量的訓練集,訓練過程較為繁瑣,且實時性難以保障.本文提出基于歸一化平均眼睛寬高比的疲勞檢測方法,利用python和opencv實現了疲勞檢測預防系統(tǒng).
駕駛人疲勞首先會體現在眼睛上,眼部特征能最直觀的表現出駕駛人的疲勞狀態(tài).輕微疲勞時:眼部疲勞,眼皮沉重;中度疲勞:眼睛會發(fā)澀,輕微疼痛;重度疲勞:昏昏欲睡,神志不清,有時會有突然醒來的感覺,有時甚至呼呼大睡.隨著疲勞程度的加深,眨眼的頻率增加,眼睛的高寬比變小,單次閉眼時長增加直至睡著.
圖1 人眼特征點標注Fig.1 Eye feature point labeling
如圖1所示,給眼睛標注6個點,眼睛的高寬比用EAR0表示,則
通過實時計算駕駛人不同狀態(tài)的EAR,可以得到圖2.
圖2駕駛員不同狀態(tài)情況下眼睛高寬比Fig.2 Eye aspect ratio of drivers in different states
圖2 是駕駛員不同狀態(tài)情況下眼睛的高寬比,試驗條件是:分別實時截取駕駛員精神飽滿、輕度疲勞、重度疲勞3種情況下的眼睛實時高寬比,共截取視頻幀數200幀,fps=25,從spirited圖中可以看出,精神飽滿時眼睛高寬比較大,高寬比大部分時間大于0.3,當然偶爾會有眨眼動作,偶爾會出現小于0.3的情況;從Mild fatigue圖中可以看出,當處于輕度疲勞狀態(tài)時,相比精神飽滿狀態(tài),眼睛的高寬比開始變小,高寬比小于0.3的情況頻率變大,小于0.3的幀數增多,且偶爾會出現連續(xù)快速的眨眼動作.從Severe fatigue圖中可以看出,當重度疲勞時,大部分幀中的眼睛高寬比小于0.25,甚至接近于0,說明駕駛人處于昏昏欲睡、神志不清的狀態(tài),偶爾會出現大于0.3,甚至接近0.4的情況,說明駕駛員在下意識的同疲勞作斗爭,偶爾會清醒一下.
通過以上分析可知,駕駛人疲勞情況與高寬比(EAR)、眨眼頻率、單次眨眼時長3個行為特征密切相關.疲勞狀況越嚴重總體高寬比變小,眨眼頻率變大,單次眨眼時長增加.
另外,不同的駕駛人,眼睛形狀不同.在同樣精神狀態(tài)下,不同的人,眼睛的高寬比會有很大的不同,因此不能簡單用眼睛高寬比來判斷駕駛人的疲勞程度.
當前眾多算法中都是以眼部行為特征中的一個特征來檢測駕駛人疲勞程度[10],如僅采用眨眼頻率特征來檢測疲勞程度,或者用一個眼部行為特征與嘴部特征、頭部特征、車輛行為特征或駕駛人生理特征相融合來檢測疲勞程度,這樣就忽視了眼部的另外兩個重要行為特征.基于此提出了NMAER疲勞檢測方法.該方法用一個簡單數學公式融合了高寬比、眨眼頻率和眨眼時長3個眼部的重要行為特征,計算量小,計算速度快.
假設有一段n幀的駕駛員駕駛行為視頻,首先讀取視頻中連續(xù)N幀,N的取值為:50<N<5 000,試驗取值為:N=200,然后計算出每一幀的EAR,則N幀中EAR的最大值為
數組EAR的長度為N,則NMEAR的值為
公式(3)通過對眼睛高寬比(EAR)的求和,融合了眨眼時長、頻率和EAR信息,通過歸一化(除以M),解除了因不同個體眼睛高寬比不同所帶來的影響.通過求均值,可以淡化因特殊情況導致的眨眼所帶來的影響.
公式(2)和公式(3)僅僅計算出了一個M值和一個NMEAR的值,事實上由于n遠大于N,也就會有很多個M值和很多個NMEAR的值.當n較大時,可用如下公式計算M和NMEAR的值
式(4)從第N幀開始,每增加一幀,就計算一個NMEAR值,共計算n-N個NMEAR值,實時性較強;式(5)從第N幀開始,每增加一幀就計算一次M值,共計算n-N個M值.從公式(4)和公式(5)可用看出,從第N幀開始,每增加一幀就可以計算出一個NMEAR值.
對于M和NMEAR的計算,在實際應用中還可以用公式(6)和公式(7)來分別計算NMEAR和M值
式(6)從i=0開始,每隔N幀,計算一個NMEAR值,共需計算k=n//N個NMEAR值,與公式(4)相比,公式(6)計算量更小,實時性比公式(4)稍差.
實現NMEAR算法需要做的工作包括,對輸入的視頻圖像進行預處理,利用基于HOG+SVM的人臉檢測算法,進行人臉檢測,借助Dlib的關鍵點檢測器對人臉68個關鍵點進行定位,提取人眼坐標點,計算EAR、M和NMEAR,判斷駕駛人的疲勞狀態(tài).算法流程見圖3.
圖3 NMEAR疲勞檢測算法流程Fig.3 Flow chart of NMEAR fatigue detection algorithmv
Dlib工具包提供的人臉檢測方法是基于圖像的HOG(圖像方向梯度直方圖)特征,并結合了支持向量機算法.這種檢測方法具有魯棒性好、準確率高等特點,被廣泛應用于面部檢測.算法思想是首先訓練好人臉分類器,然后對圖片進行掃描,提取出HOG特征,將HOG特征喂入分類器,從而判斷出人臉所在位置.Dlib所提供的人臉檢測器只能處理灰度圖,因此首先需要對圖片進行預處理,轉化成灰度圖,然后調用人臉檢測器來實現人臉的檢測.
Dlib工具箱提供兩種人臉特征點定位方法,第一種是含有5個特征點的定位器,但這種定位器由于特征點太少,無法完成眼睛寬高比計算.第二種是68個特征點的定位器,臉部68個關鍵點見圖4.
圖4 人臉68個關鍵點示意Fig.4 Schematic diagrams of 68 key points of human face
檢測出圖片中的人臉后,調用Dlib中定位器在檢測出的人臉上進行關鍵點標注,提取出關鍵點的坐標,通過切片技術,分別得到左眼6個關鍵點的坐標和右眼6個關鍵點的坐標.
得到眼部12個關鍵點的坐標后,利用公式(1)求出每一幀的EAR;利用公式(2),求出M;利用公式(3)求出 NMEAR.
利用上述步驟求出圖(1)中所對應數據的NMEAR的值分別為:
精神飽滿時NMEAR0=0.887 442 360 728 619
輕度疲勞時NMEAR1=0.698 335 779 855 587
重度疲勞時NMEAR2=0.384 320 098 641 971
上述3個NMEAR的值均正確地反映了駕駛人的駕駛時的疲勞狀態(tài).
但由于圖1中所對應的數據較少,取N=200,這里只求出一個NMEAR值,因為數據較少,所求的M值在200個EAR內是最大的,但這個M值可能并不是真的最大,導致計算的NMEAR值偏大,在實際疲勞駕駛檢測時數據是足夠大的,視頻幀數多達數十萬甚至上百萬,求得的M值比較準確.實測時由于數據量大,通常采用公式(4)和(5),或公式(6)和(7)來計算 NMEAR 和 M 值.
經過對100個短視頻進行測試初步界定精神飽滿、輕度、中度和重度指標見表1.
表1 NMEAR疲勞程度表征Tab.1 Characterization of NMEAR fatigue degree
事實上用單個的NMEAR來判定疲勞程度是不準確的,因此本文提出用NMEAR概率分布的方法來判定疲勞程度,取連續(xù)的N0個NMEAR,統(tǒng)計這N0個NMEAR落入上述區(qū)間的概率,通過落入疲勞區(qū)間的概率來判斷駕駛人的疲勞程度.如落入NMEAR≥0.7區(qū)間的概率>50%,這判定駕駛員為精神良好.
數據為中午13時錄制的一段時長20 min 28′的視頻(模擬駕駛),視頻描述:駕駛人有午休習慣,錄制前有輕微疲倦,開始錄制時駕駛人精神振作,但很快就顯示了困意,隨著時間推移,疲倦加重,中間有強制睜大眼睛的行為(與疲倦斗爭),但隨后眨眼次數顯著增多,閉眼時間變長,甚至有短暫睡著現象.視頻共 36 785幀,幀寬度為1 280,幀高度為 720,幀速率 30.1幀 /s,N 取 200幀,采用公式(1)、公式(4)和公式(6)分別計算出EAR和NMEAR.結果見圖5.
圖5 NMEAR隨疲勞程度變化Fig.5 Variation of NMEAR with fatigue degree
圖5由3副子圖組成,由上至下依次為ERA圖、公式(4)計算的NMEAR0和公式(6)計算的NMEAR1圖.可以看出NMEAR0值和NMEAR1值變化趨勢是一致的.觀察EAR圖,可以看出EAR值有所變小,但變化不明顯,不能清楚展現駕駛員疲勞程度.而從NMEAR0和NMEAR1的變化圖上看以看出,NMEAR值變化明顯,呈明顯下降趨勢,顯示出了駕駛員從精神較好到嚴重疲勞的變化過程.圖中的NMEAR值準確表達了視頻中駕駛人的疲勞程度變化情況,NMERA值總體上隨著駕駛時間的增加在減小,說明疲勞程度在加深.
疲勞程度判定.由圖5中的NMEAR子圖可知,NMEAR呈震蕩變化,因此用單一的NMEAR值判定疲勞程度不夠準確,因此我們取100個NMEAR值用于當前疲勞程度的判定,如當前的NMEAR值為NMERA(k),則取數組 NMEAR[k-100:k]中的 100 個值,統(tǒng)計 NMEAR 值在區(qū)間 NMEAR≥0.7、0.6≤NMEAR<0.7、0.5≤NMEAR<0.6和NMEAR<0.5出現的概率,如果某一區(qū)間出現的概率大于50%,則判定為該項對應的疲勞程度成立.如:NMEAR<0.5在數組NMEAR[k-100:k]出現的概率大于50%,則判定為重度疲勞.
算法性能統(tǒng)計,為了驗證算法的可行性和先進性,分別錄制了5組不同人員的駕駛視頻,每組為20人每次時長約5分鐘的視頻,用NMEAR算法進行檢測,選定閾值為0.7(僅僅判定疲勞與否,不具體判定疲勞等級).結果見表2.
表2 NMEAR法檢測正確率統(tǒng)計Tab.2 Statistical table of detection accuracy of NMEARM method
由表2可以看出,NMEAR算法疲勞檢測的正確率高達96%,而計算NMEAR運算量很小,如果采用公式(4),檢測完畢一段n幀的視頻,只需要n個加法,n-N個乘法,n-N個除法.可見算法在疲勞檢測層面提高了檢測速度.
本文提出的NMEAR算法算式簡單、計算量小,且將眼部3個關鍵行為特征融合在了一起,克服了因個體差異、眼睛高寬比不同帶來的影響.實驗表明NMEAR疲勞駕駛檢測正確率高達96%.但NMEAR算法仍會受到光線和頭部運動的影響,解決方案是可以采用雙攝像頭(普通攝像頭+紅外攝像頭)交叉布置.