武昆亮,禹素萍,許武軍,范 紅
(東華大學信息科學與技術學院,上海 201620)
疲勞是指對某體力勞動或者腦力勞動進行長時間重復作業(yè),所形成的一種生理阻礙[1]?!兜缆钒踩▽嵤l例》第六十二條表明,連續(xù)駕駛機動車超過4h未停車休息,可視為疲勞駕駛?,F(xiàn)實中由于多方面因素的影響,例如睡眠質量或者身體情況,4h的駕駛閾值會根據(jù)駕駛員的自身情況降低,因此需要一種自適應的疲勞駕駛評估標準。
University of Virginia的Walt研究表明,眼睛疲勞程度與眼睛的閉合時間成正比關系。此基礎上,Mellon[2]提出了PERCLOS算法測算眼部疲勞,通過計算單次的眨眼動作進行評估,容易漏判誤判,對于連續(xù)的時間序列無法判別。
人體頭部姿態(tài)由歐拉角評估,分別為偏航角(yaw)、俯仰角(pitch)、滾轉角(roll)。目前有兩種常用的頭部姿態(tài)算法[3],一種是基于頭部外觀的方法,一種是基于模型的方法。基于外觀的方法通常使用外觀模板與真實圖像比較,通過統(tǒng)計運算來推測具體的頭部姿態(tài),此方法過度依賴環(huán)境與精度,在實時環(huán)境下無法得到良好的應用?;谀P偷姆椒ň哂辛己玫膶崟r性與魯棒性,但采集姿態(tài)的范圍有限,經(jīng)過Ferrario等人[4]研究發(fā)現(xiàn),人體頭部的俯仰角范圍為-60.4°~69.6°,滾轉角的范圍為-40.9°~36.3°,偏航角的范圍為-79.8°~75.3°,上述角度均屬于姿態(tài)的極限范圍,現(xiàn)實中,基于模型的方法并不受姿態(tài)范圍的影響,本文使用該種方法采集頭部姿態(tài)。
本文提出一種全新的BFR算法來測量眼部特征。同時將頭部姿態(tài)與眼部特征引入算法框架,進行綜合判別。
眨眼頻率是一個人正常的生理狀態(tài)。車在駕駛時,眨眼頻率可作為衡量駕駛員疲勞狀態(tài)的生理指標。正常情況下,一個人每分鐘眨眼次數(shù)為10~15次,每兩次眨眼時間的間隔是4~5s,本文引入了EAR(眼睛縱橫比)來檢測眨眼動作。
每只眼睛由6個坐標標定,從左眼角開始,圍繞該區(qū)域順時針旋轉,如圖1所示。
圖1 眼部特征點
(1)
P1~P6標定6個眼部坐標,根據(jù)坐標高度與寬度之間的關系,推導出式(1)。方程分母計算水平坐標之間的距離,分子計算垂直坐標之間的距離,由于垂直點有兩組,所以進行加權分母,確保距離不同的坐標差擁有不同的比例因子,計算得到的EAR值具有相同尺度。眼睛縱橫比隨時間剪輯的曲線圖如圖2所示。由圖2可知,正常時間內(nèi),眼睛縱橫比恒定在0.24左右。在一次眨眼動作中,閉眼時,EAR值會迅速下降至0,睜眼時,再迅速增加至0.24[5]。
圖2 EAR變化曲線
Ilse等人[6]研究,多巴胺的分泌與眨眼頻率成正比關系,多巴胺分泌不足,疲勞程度越高,眨眼頻率越低。
本文提出一種名為BFR的全新算法,該算法基于眨眼頻率,通過攝像頭采集單位時間內(nèi)被測者的眨眼動作,如式(2)所示。
(2)
圖3 BFR原理圖
(3)
若采單位時間內(nèi)平均眨眼次數(shù)α小于等于單位時間內(nèi)最低眨眼次數(shù),如式(4)所示,則判定疲勞駕駛。降低閾值,給之后的姿態(tài)單元預留判定空間,并起到防患于未然的效果。
「T·BFR?≥α
(4)
該方法首先檢測司機是否在位,因此面部檢測是算法的基礎。Viola和Jones[7]將Haar特征的概念引入了面部識別領域,Haar-like特征是一組數(shù)字圖像特征,反應圖像空間灰度值的變化,Haar-like特征分為三類,分別為邊緣特征、線性特征、中心特征。
在獲得Haar-like特征之后,需要利用積分圖來進行運算,積分圖定義為(x,y)左上角的所有像素之和。如圖4所示,若A、B、C、D區(qū)域左上角區(qū)域像素和分別為S1、S2、S3、S4。則A、B、C、D區(qū)域的像素和見式(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算法識別司機的面部,從而判斷是否落座。算法的核心思想是識別訓練,強化弱分類器的識別率,若訓練弱分類器出現(xiàn)錯誤樣本,則將錯誤樣本的權值增大,同樣,減小正確分類的樣本權值,將這些更新權重后的樣本進行迭代,來訓練下一個弱分類器,直到錯誤率達到所設定的最低閾值。或迭代次數(shù)已達最大值,則可以確定最終的強分類器,多個強分類器進行級聯(lián),得到最終Haar分類器[8]。
本次仿真中,需要采集司機的頭部姿態(tài),此單元利用偏航角、俯仰角、滾轉角對頭部姿態(tài)進行衡量。俯仰角反應仰視運動或者俯視運動,滾轉角反應左右擺頭運動,偏航角反應左右轉頭運動。當司機疲勞時,頭部會猛地下點或者向左右耷拉。以上分析表明,偏航角代表正常駕駛時的左右轉頭,俯仰角與滾轉角代表疲勞時候的頭部姿態(tài)[9]。
(6)
頭部姿態(tài)通過座椅前的攝像機采集,攝像機模型公式為式(6)所示。式中:u,v是圖像坐標系下的2D坐標,fx,fy,cx,cy是相機標定時設定的內(nèi)參矩陣,rij,ti分別構成旋轉矩陣與平移向量;X,Y,Z為世界坐標系下的3D位置坐標。比例因子s、2D、3D坐標和內(nèi)參矩陣均為已知參數(shù),平移向量通過采集得到的信息進行計算,因此可以直接求解出旋轉矩陣R。歐拉角可用旋轉矩陣進行表示。且旋轉矩陣R=Rx(α)·Ry(β)·Rz(γ)。通過矩陣乘法運與R聯(lián)立。由于R已根據(jù)攝像機模型求出結果,可用已知旋轉矩陣的參數(shù)rij,聯(lián)立計算出歐拉角,如(7)式所示
(7)
使用python3.6+opencv3.4.1+dlib19.1的開發(fā)環(huán)境,python編譯器為Spyder,臉部模型采用shape_predictor_68_face_landmarks,眨眼閾值(threshold)設定為0.22,frames設定為3,表明眼睛長寬比小于0.22時,3個連續(xù)的幀一定發(fā)生眨眼動作,如圖5所示。
圖5 眨眼檢測
眼部特征采集是系統(tǒng)第1個重要模塊,為體現(xiàn)系統(tǒng)的自適應性,對不同對象生成不同的BFR值。本次實驗一共選取6位研究對象,如表1所示。采集單位時間1min內(nèi)的眼部動態(tài)特征,生成眨眼時間序列。測試結果如表2所示。
表1 實驗對象
表2 BFR算法
A、B、D的眨眼間隔具有較大時間跨度,A的跨度為4s~7s,B、D的跨度為4s~8s,其調節(jié)因子擁有較大的調節(jié)范圍?,F(xiàn)實測試中,A、B、D精神狀態(tài)良好,采集時眼部放松,眨眼自然,正常情況下,最低頻率至疲勞頻率的可調域大,因此乘以擁有較大的范圍的調節(jié)因子,與推理相符合。
C、E的間隔跨度比A、B、D小,但起始時間間隔遠大于A、B、D。C的起始間隔為6s,跨度是6s~8s,E的起始間隔為8s,跨度是8s~11s,其調節(jié)因子范圍較A、B、D稍小?,F(xiàn)實測試中,C、E測試的時間分別為午餐后與晚上10點。午餐后容易產(chǎn)生食困,C與最低頻率同為1/8的B、D相比,C的疲勞頻率稍高,因此可達到閾值會稍低,即進入疲勞狀態(tài)的時間會更快,符合推理。E的起始間隔為9s,可直接判斷E已經(jīng)進入疲勞狀態(tài),與推理相符。
F的時間跨度比A、B、D小,起始時間間隔與A、B、D相同,都為4s。F的調節(jié)因子可調范圍較小,最低頻率為1/6。假設單位時間為1min,則單位時間乘BFR的值為9.06,表明1min眨眼九次就判定眼部疲勞。這不符合算法推理。在現(xiàn)實測試中,F(xiàn)精神狀況良好,但知道本次采集的目的,這導致了眨眼動作不自然,眨眼間隔下意識控制在4s~6s。正常情況下,單位時間內(nèi)人的眨眼間隔不會在某一個固定值上下浮動,具有很大的差異性。因此設定,測定時需要一定的隱蔽性,且眨眼間隔的min值與max值相差應大于等于4s,否則在下一個單位時間周期內(nèi)重新測定。
環(huán)境采用python3.6+opencv3.4.1+dlib19.1,Haar分類器使用haarcascade_frontalface_alt2,模型采用shape_predictor_68_face_landmarks。先進行面部檢測,可成功檢測面部[10],如圖6。
圖6 單個人臉檢測
攝像頭內(nèi)參矩陣設定fx=653.678,fy=653.083,cx=319.5,cy=239.5,攝像頭的畸變系數(shù)與鏡頭的物理屬性和畸變模型有關,由MATLAB的相機標定工具箱計算得到,在此次的仿真中,畸變系數(shù)經(jīng)計算得知:D=[0.07083,0.06914,0,0,-1.307]。攝像頭像素為720P。以一個邊長為20cm的正方體框定頭部,在正方體內(nèi),定義面部關鍵點3D坐標,部分坐標見表3。
表3 面部關鍵點3D坐標
得知這些已知變量后,可計算出旋轉矩陣R,從而得到歐拉角。正常姿態(tài)下仿真結果如圖7所示,非正常姿態(tài)下仿真結果如圖8所示。
圖7 正常姿態(tài)
圖8 疲勞姿態(tài)
實驗共采集2000個頭部姿態(tài),1000個正常的頭部姿態(tài),標簽為1,1000個疲勞的頭部姿態(tài),標簽為0。仿真結果如圖9、圖10所示。
圖9 正常姿態(tài)三維坐標圖
圖10 疲勞姿態(tài)三維坐標圖
將正常姿態(tài)與疲勞姿態(tài)的歐拉角利用Matlab進行3D建模,分析正常姿態(tài)與疲勞姿態(tài)的關系。正常姿態(tài)下俯仰角的變化范圍大致為5°~7°。疲勞姿態(tài)下俯仰角范圍為10°~25°。正常姿態(tài)與疲勞姿態(tài)下,偏航角范圍大致在-10°~20°,表明司機查看路況的轉頭動作,與理論相符。正常姿態(tài)下,觀察縱軸,滾轉角變化的范圍呈小區(qū)域波浪狀,方向導數(shù)小,表明正常姿態(tài)下擺頭動作不明顯,疲勞姿態(tài)下,歐拉角曲面的方向導數(shù)大,具有不可預測性,表明此時多為不正常姿態(tài)。
最終選用Keras深度學習框架,并用TensorFlow作為后端引擎[11]。輸入到含有8個隱藏單元的Dense層,該層激活函數(shù)使用relu,最后一層使用含有1個隱藏單元的Dense層,該層的激活函數(shù)使用sigmoid,優(yōu)化器為rmsprop,損失函數(shù)使用binary_crossentropy,指標函數(shù)為accuracy,驗證集采集2000個頭部進行驗證,經(jīng)過實驗,模型精度為91.7%。滿足實驗需求。
最終結果見表4,實驗對象A、C、D到達BFR閾值的時間在2小時30分左右,檢測姿態(tài)疲勞時間大致在第3個小時,比法定4個小時少1個小時,可以起到提前預警的作用。C調節(jié)因子的調節(jié)范圍較小,提前達到BFR閾值時間,判定疲勞時間在2小時14分,表明飯后駕駛更易到達疲勞狀態(tài)。E的起始眨眼間隔為9s,可直接判斷處于疲勞狀態(tài)。F到達BFR閾值的時間為4小時15分,與法定疲勞駕駛時間相符,但判定眼疲勞后立馬檢測出姿態(tài)疲勞,表明司機已提前進入疲勞駕駛狀態(tài),此時已無法起到預警的作用。故采集眼部特征時,需做到隱蔽性,采集駕駛員自然狀態(tài)下的眼部動作。
表4 試驗結果
6位實驗對象中5位可成功預警,實驗精度為83.3%,考慮F的特殊性,真實精度還會略高。
導入python的time庫進行效率測試,見表5。人臉檢測模塊調用Haar分類器,執(zhí)行時間為7.968ms,dlib68點模型具有很強的魯棒性與高效性,耗時0.534ms,BFR計算耗時0.012ms??偤臅r約為8.5ms。
表5 系統(tǒng)的執(zhí)行效率分析
胡卓[12]對面部圖像進行預處理,利用PERCLOS檢測,采集10段視頻數(shù)據(jù),識別率為80%,低于本方法。王小帆[13]使用瞳孔分割進行眨眼檢測,精度為92%,其疲勞檢測受姿態(tài)方位與攝像機角度的影響,檢測率最高可達到85.6%,略高于本方法,但執(zhí)行效率為62ms,不利于實時檢測。蔡伽[14]使用改進的Adaboost算法進行人臉檢測,并使用PERCLOS檢測疲勞,Adaboost算法經(jīng)過優(yōu)化后,執(zhí)行效率有所提高,但仍未優(yōu)于本文方法。
表6 系統(tǒng)和精度對比
本文提出一種基于BFR算法與頭部姿態(tài)的綜合判別系統(tǒng),BFR算法可檢測駕駛員視疲勞,針對不同駕駛對象生成不同的疲勞閾值。頭部姿態(tài)經(jīng)采集計算,輸入到神經(jīng)網(wǎng)絡形成個體樣本集,判定駕駛員是否疲勞駕駛。采集過程對攝像頭的安裝不限固定方位,具有自適應性。實驗表明,該系統(tǒng)對疲勞駕駛擁有提前預警作用,道路安全法規(guī)定連續(xù)駕駛機動車超過4小時未停車休息,可視為疲勞駕駛,本文判定時間較4小時略短,為駕駛員提供充分的預警時間,提高駕駛安全性。