武昆亮,禹素萍,許武軍,范 紅
(東華大學信息科學與技術學院,上海 201620)
疲勞是指對某體力勞動或者腦力勞動進行長時間重復作業,所形成的一種生理阻礙[1]。《道路安全法實施條例》第六十二條表明,連續駕駛機動車超過4h未停車休息,可視為疲勞駕駛。現實中由于多方面因素的影響,例如睡眠質量或者身體情況,4h的駕駛閾值會根據駕駛員的自身情況降低,因此需要一種自適應的疲勞駕駛評估標準。
University of Virginia的Walt研究表明,眼睛疲勞程度與眼睛的閉合時間成正比關系。此基礎上,Mellon[2]提出了PERCLOS算法測算眼部疲勞,通過計算單次的眨眼動作進行評估,容易漏判誤判,對于連續的時間序列無法判別。
人體頭部姿態由歐拉角評估,分別為偏航角(yaw)、俯仰角(pitch)、滾轉角(roll)。目前有兩種常用的頭部姿態算法[3],一種是基于頭部外觀的方法,一種是基于模型的方法。基于外觀的方法通常使用外觀模板與真實圖像比較,通過統計運算來推測具體的頭部姿態,此方法過度依賴環境與精度,在實時環境下無法得到良好的應用。基于模型的方法具有良好的實時性與魯棒性,但采集姿態的范圍有限,經過Ferrario等人[4]研究發現,人體頭部的俯仰角范圍為-60.4°~69.6°,滾轉角的范圍為-40.9°~36.3°,偏航角的范圍為-79.8°~75.3°,上述角度均屬于姿態的極限范圍,現實中,基于模型的方法并不受姿態范圍的影響,本文使用該種方法采集頭部姿態。
本文提出一種全新的BFR算法來測量眼部特征。同時將頭部姿態與眼部特征引入算法框架,進行綜合判別。
眨眼頻率是一個人正常的生理狀態。車在駕駛時,眨眼頻率可作為衡量駕駛員疲勞狀態的生理指標。正常情況下,一個人每分鐘眨眼次數為10~15次,每兩次眨眼時間的間隔是4~5s,本文引入了EAR(眼睛縱橫比)來檢測眨眼動作。
每只眼睛由6個坐標標定,從左眼角開始,圍繞該區域順時針旋轉,如圖1所示。

圖1 眼部特征點
(1)
P1~P6標定6個眼部坐標,根據坐標高度與寬度之間的關系,推導出式(1)。方程分母計算水平坐標之間的距離,分子計算垂直坐標之間的距離,由于垂直點有兩組,所以進行加權分母,確保距離不同的坐標差擁有不同的比例因子,計算得到的EAR值具有相同尺度。眼睛縱橫比隨時間剪輯的曲線圖如圖2所示。由圖2可知,正常時間內,眼睛縱橫比恒定在0.24左右。在一次眨眼動作中,閉眼時,EAR值會迅速下降至0,睜眼時,再迅速增加至0.24[5]。

圖2 EAR變化曲線
Ilse等人[6]研究,多巴胺的分泌與眨眼頻率成正比關系,多巴胺分泌不足,疲勞程度越高,眨眼頻率越低。
本文提出一種名為BFR的全新算法,該算法基于眨眼頻率,通過攝像頭采集單位時間內被測者的眨眼動作,如式(2)所示。
(2)


圖3 BFR原理圖
(3)
若采單位時間內平均眨眼次數α小于等于單位時間內最低眨眼次數,如式(4)所示,則判定疲勞駕駛。降低閾值,給之后的姿態單元預留判定空間,并起到防患于未然的效果。
「T·BFR?≥α
(4)
該方法首先檢測司機是否在位,因此面部檢測是算法的基礎。Viola和Jones[7]將Haar特征的概念引入了面部識別領域,Haar-like特征是一組數字圖像特征,反應圖像空間灰度值的變化,Haar-like特征分為三類,分別為邊緣特征、線性特征、中心特征。
在獲得Haar-like特征之后,需要利用積分圖來進行運算,積分圖定義為(x,y)左上角的所有像素之和。如圖4所示,若A、B、C、D區域左上角區域像素和分別為S1、S2、S3、S4。則A、B、C、D區域的像素和見式(5)

圖4 積分圖概念
S1=S(A)
S2=S(B)-S(A)
S3=S(C)-S(A)
S4=S(D)-S(C)-S(B)+S(A)
(5)
Adaboost(adaptive boosting)算法是一種自適應性增強算法。本次仿真利用Adaboost算法識別司機的面部,從而判斷是否落座。算法的核心思想是識別訓練,強化弱分類器的識別率,若訓練弱分類器出現錯誤樣本,則將錯誤樣本的權值增大,同樣,減小正確分類的樣本權值,將這些更新權重后的樣本進行迭代,來訓練下一個弱分類器,直到錯誤率達到所設定的最低閾值。或迭代次數已達最大值,則可以確定最終的強分類器,多個強分類器進行級聯,得到最終Haar分類器[8]。
本次仿真中,需要采集司機的頭部姿態,此單元利用偏航角、俯仰角、滾轉角對頭部姿態進行衡量。俯仰角反應仰視運動或者俯視運動,滾轉角反應左右擺頭運動,偏航角反應左右轉頭運動。當司機疲勞時,頭部會猛地下點或者向左右耷拉。以上分析表明,偏航角代表正常駕駛時的左右轉頭,俯仰角與滾轉角代表疲勞時候的頭部姿態[9]。
(6)
頭部姿態通過座椅前的攝像機采集,攝像機模型公式為式(6)所示。式中:u,v是圖像坐標系下的2D坐標,fx,fy,cx,cy是相機標定時設定的內參矩陣,rij,ti分別構成旋轉矩陣與平移向量;X,Y,Z為世界坐標系下的3D位置坐標。比例因子s、2D、3D坐標和內參矩陣均為已知參數,平移向量通過采集得到的信息進行計算,因此可以直接求解出旋轉矩陣R。歐拉角可用旋轉矩陣進行表示。且旋轉矩陣R=Rx(α)·Ry(β)·Rz(γ)。通過矩陣乘法運與R聯立。由于R已根據攝像機模型求出結果,可用已知旋轉矩陣的參數rij,聯立計算出歐拉角,如(7)式所示
(7)
使用python3.6+opencv3.4.1+dlib19.1的開發環境,python編譯器為Spyder,臉部模型采用shape_predictor_68_face_landmarks,眨眼閾值(threshold)設定為0.22,frames設定為3,表明眼睛長寬比小于0.22時,3個連續的幀一定發生眨眼動作,如圖5所示。

圖5 眨眼檢測
眼部特征采集是系統第1個重要模塊,為體現系統的自適應性,對不同對象生成不同的BFR值。本次實驗一共選取6位研究對象,如表1所示。采集單位時間1min內的眼部動態特征,生成眨眼時間序列。測試結果如表2所示。

表1 實驗對象

表2 BFR算法
A、B、D的眨眼間隔具有較大時間跨度,A的跨度為4s~7s,B、D的跨度為4s~8s,其調節因子擁有較大的調節范圍。現實測試中,A、B、D精神狀態良好,采集時眼部放松,眨眼自然,正常情況下,最低頻率至疲勞頻率的可調域大,因此乘以擁有較大的范圍的調節因子,與推理相符合。
C、E的間隔跨度比A、B、D小,但起始時間間隔遠大于A、B、D。C的起始間隔為6s,跨度是6s~8s,E的起始間隔為8s,跨度是8s~11s,其調節因子范圍較A、B、D稍小。現實測試中,C、E測試的時間分別為午餐后與晚上10點。午餐后容易產生食困,C與最低頻率同為1/8的B、D相比,C的疲勞頻率稍高,因此可達到閾值會稍低,即進入疲勞狀態的時間會更快,符合推理。E的起始間隔為9s,可直接判斷E已經進入疲勞狀態,與推理相符。
F的時間跨度比A、B、D小,起始時間間隔與A、B、D相同,都為4s。F的調節因子可調范圍較小,最低頻率為1/6。假設單位時間為1min,則單位時間乘BFR的值為9.06,表明1min眨眼九次就判定眼部疲勞。這不符合算法推理。在現實測試中,F精神狀況良好,但知道本次采集的目的,這導致了眨眼動作不自然,眨眼間隔下意識控制在4s~6s。正常情況下,單位時間內人的眨眼間隔不會在某一個固定值上下浮動,具有很大的差異性。因此設定,測定時需要一定的隱蔽性,且眨眼間隔的min值與max值相差應大于等于4s,否則在下一個單位時間周期內重新測定。
環境采用python3.6+opencv3.4.1+dlib19.1,Haar分類器使用haarcascade_frontalface_alt2,模型采用shape_predictor_68_face_landmarks。先進行面部檢測,可成功檢測面部[10],如圖6。

圖6 單個人臉檢測
攝像頭內參矩陣設定fx=653.678,fy=653.083,cx=319.5,cy=239.5,攝像頭的畸變系數與鏡頭的物理屬性和畸變模型有關,由MATLAB的相機標定工具箱計算得到,在此次的仿真中,畸變系數經計算得知:D=[0.07083,0.06914,0,0,-1.307]。攝像頭像素為720P。以一個邊長為20cm的正方體框定頭部,在正方體內,定義面部關鍵點3D坐標,部分坐標見表3。

表3 面部關鍵點3D坐標
得知這些已知變量后,可計算出旋轉矩陣R,從而得到歐拉角。正常姿態下仿真結果如圖7所示,非正常姿態下仿真結果如圖8所示。

圖7 正常姿態

圖8 疲勞姿態
實驗共采集2000個頭部姿態,1000個正常的頭部姿態,標簽為1,1000個疲勞的頭部姿態,標簽為0。仿真結果如圖9、圖10所示。

圖9 正常姿態三維坐標圖

圖10 疲勞姿態三維坐標圖
將正常姿態與疲勞姿態的歐拉角利用Matlab進行3D建模,分析正常姿態與疲勞姿態的關系。正常姿態下俯仰角的變化范圍大致為5°~7°。疲勞姿態下俯仰角范圍為10°~25°。正常姿態與疲勞姿態下,偏航角范圍大致在-10°~20°,表明司機查看路況的轉頭動作,與理論相符。正常姿態下,觀察縱軸,滾轉角變化的范圍呈小區域波浪狀,方向導數小,表明正常姿態下擺頭動作不明顯,疲勞姿態下,歐拉角曲面的方向導數大,具有不可預測性,表明此時多為不正常姿態。
最終選用Keras深度學習框架,并用TensorFlow作為后端引擎[11]。輸入到含有8個隱藏單元的Dense層,該層激活函數使用relu,最后一層使用含有1個隱藏單元的Dense層,該層的激活函數使用sigmoid,優化器為rmsprop,損失函數使用binary_crossentropy,指標函數為accuracy,驗證集采集2000個頭部進行驗證,經過實驗,模型精度為91.7%。滿足實驗需求。
最終結果見表4,實驗對象A、C、D到達BFR閾值的時間在2小時30分左右,檢測姿態疲勞時間大致在第3個小時,比法定4個小時少1個小時,可以起到提前預警的作用。C調節因子的調節范圍較小,提前達到BFR閾值時間,判定疲勞時間在2小時14分,表明飯后駕駛更易到達疲勞狀態。E的起始眨眼間隔為9s,可直接判斷處于疲勞狀態。F到達BFR閾值的時間為4小時15分,與法定疲勞駕駛時間相符,但判定眼疲勞后立馬檢測出姿態疲勞,表明司機已提前進入疲勞駕駛狀態,此時已無法起到預警的作用。故采集眼部特征時,需做到隱蔽性,采集駕駛員自然狀態下的眼部動作。

表4 試驗結果
6位實驗對象中5位可成功預警,實驗精度為83.3%,考慮F的特殊性,真實精度還會略高。
導入python的time庫進行效率測試,見表5。人臉檢測模塊調用Haar分類器,執行時間為7.968ms,dlib68點模型具有很強的魯棒性與高效性,耗時0.534ms,BFR計算耗時0.012ms。總耗時約為8.5ms。

表5 系統的執行效率分析
胡卓[12]對面部圖像進行預處理,利用PERCLOS檢測,采集10段視頻數據,識別率為80%,低于本方法。王小帆[13]使用瞳孔分割進行眨眼檢測,精度為92%,其疲勞檢測受姿態方位與攝像機角度的影響,檢測率最高可達到85.6%,略高于本方法,但執行效率為62ms,不利于實時檢測。蔡伽[14]使用改進的Adaboost算法進行人臉檢測,并使用PERCLOS檢測疲勞,Adaboost算法經過優化后,執行效率有所提高,但仍未優于本文方法。

表6 系統和精度對比
本文提出一種基于BFR算法與頭部姿態的綜合判別系統,BFR算法可檢測駕駛員視疲勞,針對不同駕駛對象生成不同的疲勞閾值。頭部姿態經采集計算,輸入到神經網絡形成個體樣本集,判定駕駛員是否疲勞駕駛。采集過程對攝像頭的安裝不限固定方位,具有自適應性。實驗表明,該系統對疲勞駕駛擁有提前預警作用,道路安全法規定連續駕駛機動車超過4小時未停車休息,可視為疲勞駕駛,本文判定時間較4小時略短,為駕駛員提供充分的預警時間,提高駕駛安全性。