潘志庚,劉榮飛,張明敏
1(杭州師范大學 數字媒體與人機交互研究中心,浙江 杭州 311121)
2(浙江大學 計算機科學與技術學院,浙江 杭州 310007)
隨著我國經濟的快速發展,汽車已成為主要的交通工具,疲勞駕駛已成為引發交通事故的主要原因之一.因此,研究疲勞駕駛檢測系統,實現對駕駛員疲勞狀態的監控具有重要意義.在各種疲勞檢測方法中,主要有基于傳感設備的接觸式檢測,如對駕駛員的腦電圖、心電圖等生理信號進行檢測[1]和基于模式識別、圖像處理的非接觸式檢測[2].目前,國外在這方面的研究主要偏向第1 種方法,利用各種傳感器采集駕駛員的生理數據進行疲勞檢測,例如美國研制的方向盤監視裝置S.A.M[3],通過安裝的傳感器檢測方向盤的異常來判斷駕駛員疲勞情況,歐洲研發的AWAKE 駕駛診斷系統[4],利用CCD 傳感器和力學傳感器獲取的信號以判斷駕駛員是否疲勞.
由于第2 種方法具有非侵入性、比較自然、實時的特點,已成為駕駛員疲勞檢測領域的研究熱點.在各種檢測機制中,基于人眼特征信息的研究是目前應用最廣泛的.Yang 提出了基于結構光傳感器應用于眼睛瞳孔位置的檢測[5];Chang 使用haar 特征和極限學習機算法對駕駛員的人眼進行檢測與追蹤[6];Zhang 等人使用Boost-LBP 特征和SVM 對疲勞面部表情學習與分析[7].在人眼定位研究中,文獻[8]使用圖像相減法,利用人眼視網膜對850nm 波長紅外線與940nm 的紅外線反射率存在差異(前者90%,后者40%)這一特征進行圖像差分即可得到大致的眼睛區域,但這一方法對相機要求較高.因此,又有人使用微軟的深度相機Kinect 對眼睛狀態進行分析[9].鄢黎明等人設計了基于DSP 的微處理器技術以實現對人眼進行檢測和跟蹤[10],也有采用基于主動形狀模型(ASM)算法對人眼區域粗定位,再引入平均合成精確濾波器(ASEF)算法與ASM 算法相結合的思路提高對眼睛區域的定位精度[11].近年來,隨著深度學習的火熱,唐杰等人使用CNN 對人臉關鍵點進行檢測[12],并采用OSTU 最大類間差法[13]分割人眼,雖然達到一定效果,但此類方法容易受到眉毛和頭發的干擾,對圖像質量要求高且系統開銷大.在對駕駛員疲勞檢測中,通常都是根據駕駛員眼睛閉合頻率與疲勞的相關性關系進行研究[14],即使用美國公路安全局(NHTSA)唯一認證的PERCLOS 原理[15]識別疲勞.因此,如何準確地判別出人眼的睜閉狀態是這類疲勞檢測的重點和難點,也直接決定了最終的檢測結果的準確性.
綜上所述,現有的基于計算機視覺的疲勞檢測機制中通常都是在對人眼精確定位后利用眼睛單一特征進行分析,判定出人眼狀態.該類算法易受外界環境干擾,如光線、眼鏡等因素,誤判率高,具有一定的局限性.本文提出一種基于模糊綜合評價算法,對人眼區域矩形長寬比、擬合橢圓面積、眼睛瞳孔區域黑色素所占比例這3個評價因素進行綜合分析,檢測出眼睛的睜開閉合狀態,再根據PERCLOS 原理,統計人眼每秒的閉合頻率,判別出駕駛員是否處于疲勞狀態并發出警報.相比于傳統方法,本文提出的算法不僅僅只局限于人眼某一特征信息,而是對多個人眼信息進行綜合分析,對人眼狀態的檢測可靠性高,具有較高的實用性和魯棒性.
疲勞檢測算法設計流程如圖1 所示.

Fig.1 Fatigue detection algorithm flow chart圖1 疲勞檢測算法流程圖
本文從視覺角度出發,在駕駛員處于非常自然的狀態下(不需要佩戴任何傳感設備)進行非接觸式疲勞檢測.首先采用機器學習方法Adaboost 分類器檢測人臉[16],然后對圖像進行一系列預處理,分割跟蹤人眼并利用積分投影值消除眉毛干擾區域.再根據模糊綜合評價法判別出眼睛的睜閉狀態,最后利用PERCOLS 算法原理對駕駛員的閉眼頻率進行統計,從而實現疲勞檢測功能.
人臉檢測目前比較常用的方法有基于深度神經網絡的學習方法,還有一些是基于傳統的膚色分割、模板匹配、概率統計、馬爾可夫隨機域等方法[17].考慮到實時性和系統開銷,本文使用了級聯分類器Adaboost 算法,Adaboost 是一種迭代算法,其核心思想是針對同一個訓練集訓練不同的分類器(弱分類器),然后把這些弱分類器集合起來,構成一個更強的最終分類器(強分類器).檢測過程中,通過計算Haar 特征(Haar-like features)并和Adaboost 結合,大大提高了檢測的速度和精確率.圖2 所示為通過上面的方法在白天正常光線和夜晚紅外光線下的人臉檢測結果.

Fig.2 Face detection effect image圖2 人臉檢測效果圖
在人臉檢測的基礎上,根據人臉的先驗知識“三庭五眼”分布特征[18]分割出大致的人眼區域,再根據對稱性分別得到包含左右眼睛的圖像子窗口.由于光照對圖像處理產生很大的影響,對后面的檢測算法帶來很大的干擾,所以前面需要對圖像做一些預處理工作,以降低噪聲的干擾.首先,對輸入的圖像進行平滑濾波和非線性點運算,作圖像增強處理,其次,把圖像作灰度化處理并進行直方圖均衡,從而使圖像像素在每個灰度級上的分布相對均勻,降低了光照對圖像處理結果的影響.最后,采用Ostu 最大類間方差法,找到最優閾值,實現圖像二值化操作.考慮到各種復雜情況,特別是對于夜晚紅外圖像,效果并不是很理想,因此,在程序中又設置了一個常數CONST 作為閾值分割補償.最終,根據實驗效果取CONST=50,圖3 為人眼粗定位和預處理后的左右眼效果圖.

Fig.3 Pre-processing effect map圖3 預處理后效果圖
本文最后是根據一段時間內眼睛閉合持續時間所占百分比,即PERCOLS 算法來對疲勞進行檢測,因此,對人眼能否準確地定位,直接影響了最后的疲勞狀態的判斷結果.從圖3 可以看到,粗定位后的左右眼區域明顯還存在眉毛部分,如果不去除眉毛,就會對后面的眼睛睜閉狀態判斷產生干擾,造成誤判,因此,要在實驗前消除眉毛區域.本文采用的方法是對上述處理得到的包含眉毛的二值化圖像進行垂直積分投影,然后以2 行像素的和為單位依次進行遍歷比較,找到最小單位值,再以該單位為搜索起點找到第1 個極大值點作為眼睛眉毛的分割點,即圖4(a)所示箭頭位置.去除分割點以上部分就剔除了眉毛區域,從而可以精確地定位到人眼,去除眉毛后的左右眼效果圖如圖4(b)所示.

Fig.4 圖4
由上述操作可以精確地定位到只包含人眼區域的二值圖像,這樣就能夠很方便地對眼睛信息進行分析,然后對駕駛員的眼睛狀態做出判別.實驗過程中,將眼睛分為3 種狀態,分別為睜開狀態、閉合狀態、半閉半睜狀態.使用基于模糊數學里的模糊綜合評價方法,對判斷眼睛睜閉的評價因子進行分析,最終判斷出眼睛的睜閉狀態.其中,當眼睛處于半閉半睜狀態時,分別計算出睜開評價值和閉合評價值進行比較,以剔除這種模棱兩可的情況.判斷流程圖如圖5 所示.

Fig.5 Flow chart of eye state judgment圖5 眼睛狀態判斷流程圖
通過前面的步驟獲得了眼睛的精準位置,并分別提取出了左右兩只眼睛的圖像子窗口.接著便是對包含單只(左右)眼睛的圖像窗口進行睜眼及閉眼的判斷.在實驗過程中,根據人眼睜閉時的一些特征變化,本文對眼睛狀態的判斷劃分出以下3 個影響因子.
(1)人眼矩形長寬比R.根據Ostu 最大類間差法,得到了只包含人眼的二值圖像,然后分別對人眼灰度圖和二值圖利用sobel 算子在整體方向進行邊緣檢測,得到了眼睛輪廓圖像.考慮到實際應用中光照和抖動的影響,使用形態學開運算消除邊緣周圍干擾噪聲點,使檢測到的邊緣連續.最后再根據輪廓數據計算出眼睛的外接矩形的寬度與高度,計算出長寬比如圖6 所示.

Fig.6 Edge detection results and eye aspect ratio R=H/W,where R∈(0,+∞)圖6 邊緣檢測結果及眼睛長寬比其中,R∈(0,+∞)
(2)擬合橢圓的面積S.觀察發現,眼睛的輪廓區域接近一個橢圓形狀,因此利用最小二乘法進行橢圓的曲線擬合操作,擬合結果如圖7 所示.最小二乘法的主要任務就是尋找一組有效參數,從而使數據點與橢圓之間的距離度量最小化.在二維平面直角坐標系中,橢圓的一般方程如式(1)所示.


Fig.7 Ellipse fitting result圖7 橢圓擬合結果
由于檢測到邊緣上的離散點不可能完全吻合,落在橢圓上,根據最小二乘法原理,將橢圓擬合的最優問題轉換為代數距離平方和最小化問題,即求平方和L的最小值,見公式(2).再由二元函數極值原理可得公式(3),由此得到一個線性方程組,利用消元法并結合約束條件可求得方程系數A,B,C,D,E,F的值,從而得到了橢圓方程.
小李暗笑了幾聲,丁主任接住話:我的確有,而且營業部所有人里,就我和張大爺才有這倉庫和大門的鑰匙,所以我和張大爺好像給大家添麻煩了。

然后再根據橢圓的幾何關系式(4)、關系式(5)便可得到橢圓的長短軸,單位像素為(px),最后由橢圓的面積公式(6)即可求得擬合橢圓的面積S.

實驗中,取φ=2e-3,π=3.1416.
(3)眼睛矩形區域瞳孔黑色素點占總像素比例Φ.在眼睛睜開和閉合時,瞳孔的大小存在差異,所占比例也存在明顯的變化,如圖8 所示.對只包含左右兩只眼睛的二值圖像分別計算出該圖像直方圖在水平和垂直方向的投影,然后以垂直方向的投影結果在矩形寬度上進行遍歷求和,統計出矩形區域黑色像素總個數,從而可以計算出眼睛矩形區域黑色素點所占的比例Φ.

Fig.8 Changes of pupil melanin in different states of the human eye圖8 人眼在不同狀態下瞳孔黑色素變化
模糊綜合評價法是一種基于模糊數學里的綜合評價方法.本文利用模糊綜合評價算法對人眼矩形區域長寬比R、擬合橢圓的面積S、人眼瞳孔黑色素所占比例Φ這3 個評價因子進行分析.根據大量測試,我們將這3個評價因素各自的取值區間劃分了相同的4 個級別,并賦予不同的權值,見表1.然后組合成一個綜合評價函數,計算該函數值與設置的閉眼閾值進行比較,當綜合評價值大于閾值時,可以認為眼睛處于睜開狀態,否則,認為眼睛處于閉合狀態.

Table 1 Fuzzy comprehensive evaluation table表1 模糊綜合評價表
實驗中,為了給各個評價因子分配最優的權重,在控制測試樣本和運行環境不變的情況下進行單因素統計對比實驗,從而找出各自最優的權重,如圖9 所示,最佳閉眼閾值也是同理得到.

Fig.9 The relationship between the weight of each evaluation factor and the discriminant accuracy圖9 各評價因素權值與判別準確度的關系
當人出現疲勞狀態時,眼睛從睜開到閉合再到睜開這個過程需要消耗較長的時間,經過大量實驗,結果表明,疲勞程度與眼睛閉合時間長短有著密切關系,閉合時間越長,其疲勞的程度越嚴重[19].PERCLOS 方法是對一定時間內人眼閉合時間占總時間的比例進行測量,相對于其他方法,PERCLOS 更能直觀、準確地反映出駕駛員的疲勞程度,是目前公認的判定疲勞的最優方法.被美國公路安全局(NHTSA)推薦為車載的、非接觸式的、實時的疲勞程度檢測方法[20].通常,PERCLOS 常用標準有以下3 種.
P70,表示眼皮蓋過瞳孔面積超過70%所占的時間比例.
P80,表示眼皮蓋過瞳孔面積超過80%所占的時間比例.
EM,表示眼皮蓋過瞳孔面積超過一半所占的時間比例.
其中,P80 是被公認的最能反映人的疲勞程度的指標,這也正與本文前面提出的眼睛睜閉狀態的檢測相一致.PERCLOS 值的計算公式如式(7)所示.

在實際實驗過程中,系統處理每一幀圖像大概消耗時間是33ms,即系統處理圖像的速度為30fps.因此,我們只需知道每秒時間內眼睛的閉合頻率f(close),就可以計算出每秒的PERCLOS 值,見公式(8).接著就可以計算出一段測試周期時間內的PERCLOS 值,計算公式見式(9),T表示一個計時周期的時間,取T=30s,當PERCLOS>0.2時,則認為駕駛員處于疲勞狀態,發出報警.

本文的實驗環境為一般的實驗室環境,使用Visual Studio 2015 作為開發工具,opencv3.0 和C++開發語言進行.首先從攝像頭捕獲到的視頻序列圖像中利用Adaboost 分類器進行人臉檢測,然后對檢測到的人臉區域進行預處理,分割人眼并消除眉毛干擾,再使用模糊綜合評價方法對眼睛矩形區域長寬比、擬合橢圓面積、瞳孔黑色素所占比例這3 個評價因子進行分析,對眼睛睜閉狀態做出準確判斷,最后根據PERCLOS 算法原理,統計出每個檢測周期內駕駛員的閉眼頻率,從而判斷駕駛員是否處于疲勞駕駛狀態.圖10 所示為最后的疲勞檢測結果圖,圖10(a)所示為夜晚在紅外光線下的檢測結果,圖10(b)所示為白天正常光線下的檢測結果.

Fig.10 Fatigue test result image圖10 疲勞檢測結果圖
為了驗證本文提出的基于模糊綜合評價的疲勞駕駛檢測算法的準確性和魯棒性,本文分別從眼睛狀態判別和疲勞程度檢測兩個方面進行實驗以驗證該算法.同時,本文又對該算法的各個模塊的運行時間進行了統計,對算法的實時性進行了分析.
實驗1:直接模擬駕駛環境采集幾組測試視頻進行實驗,對本文檢測人眼睜閉狀態算法進行準確性測試,測試結果見表2,眼睛狀態的判斷準確率最高可達97%,但是由于采集的視頻序列中存在測試者頭部姿勢過度偏移的情況,離開了相機捕獲區域,造成了誤判和漏測情況.另外,為了驗證該算法的魯棒性,我們又采樣了800 幀不同環境下的駕駛員測試圖集,分白天戴眼鏡、白天不戴眼鏡、夜晚戴眼鏡、夜晚不戴眼鏡4 種情況,測試結果見表3.同時,在此測試集的基礎上,又分別與文獻[12]及文獻[14]中的只利用單因素的方法進行了對比,比較結果見表4,可以看出,本文提出的多因子綜合評價方法具有一定的優勢.從表2~表4 的測試結果來看,本文提出的算法對判別眼睛的睜閉狀態具有較高的準確性和魯棒性.

Table 2 Accuracy test of fuzzy comprehensive evaluation algorithm表2 模糊綜合評價算法準確性測試

Table 3 Robustness evaluation of fuzzy comprehensive evaluation algorithm表3 模糊綜合評價算法魯棒性測試

Table 4 Comparison of eye state detection rate (%)表4 眼睛狀態檢測率對比(%)
實驗2:選取實驗室的4 名測試人員對正常和疲勞的駕駛狀態進行模擬,分別統計出4 名測試人員在檢測周期內的閉眼頻率,圖11 所示為4 名測試人員分別在一個周期內的閉眼頻率變化圖.從圖中可以看出,B,C 的閉眼頻率趨于穩定,為正常的眨眼過程,而A,D 的閉眼頻率較高,處于長時間閉眼狀態.最后,再根據上面的公式(6),計算出每名測試人員的PERCLOS值,檢測出每名測試人員的疲勞狀態并與實際模擬狀態相比加以驗證,其中,A,D的PERCLOS值大于0.2,可判定為疲勞狀態,B,C 的PERCLOS值較小,且小于0.2,可判定為正常狀態,檢測結果見表5.結果表明,檢測結果與實際模擬結果是相一致的.

Fig.11 Statistics on the frequency of eye closure in one cycle of 4 testers圖11 4 名測試人員在一個周期內的閉眼頻率統計

Table 5 Fatigue driving test table表5 疲勞駕駛檢測示意表
實驗3:實時性是疲勞駕駛檢測的一個十分重要的性能指標,只有做到實時跟蹤檢測駕駛員的狀態,才能及時避免因疲勞導致的交通事故的發生.在OpenCV 中,通過調用getTickCount 函數對本文算法各個模塊的運行時間進行統計,分別測試了5 段視頻,對各個模塊所消耗的時間進行分析,見表6.其中,疲勞檢測部分是基于連續時間段進行的,這里選取其均值作為參考.從表中可以看出,耗時最長的是眼睛狀態分析模塊,大約需要11ms,而處理一幀圖像總的運行時間在33ms 左右,足以滿足對疲勞的實時監控.

Table 6 Algorithm time consumption analysis table表6 算法各模塊消耗時間分析表
在實驗過程中,本文對圖像進行了預處理操作,減少了冗余數據干擾,提高了運行效率.從人眼定位結果來看,我們使用積分投影成功地消除了由于眉毛所帶來的干擾,有效地將眼睛從人臉區域分離出來,之后又采用模糊綜合評價算法對眼睛的睜閉狀態進行分析,并做出準確判斷,提高了PERCLOS 計算的準確性與可靠性.本文基于機器視覺方法,對連續幀圖像(video)進行處理,避免了與駕駛員的身體直接接觸,更加趨于自然化,具有較高的實用性.而且每秒能處理30 幀圖像,滿足了系統的實時性要求,適用于各種駕駛情況下對駕駛員狀態的監督與檢測.
同時也可以看到,本文提出的算法面臨著一個不可回避的問題,由于只使用了單一的眼睛狀態特性作為疲勞的判斷依據,當駕駛員配戴墨鏡時,人眼的信息就完全捕獲不到,此時算法就完全失效了.目前,我們正考慮將打哈欠、腦電信號和頭部姿勢等因素考慮進來,進行多疲勞特征綜合判別.在基于機器視覺的疲勞駕駛檢測方面,還有很長的路要走,還需要更多的優良算法來解決實際工程問題.