趙如新, 宋春林
(同濟大學, 電子與信息工程學院, 上海 201804)
隨著人們生活水平的提高,中國機動車及機動車駕駛人員數量也隨之增高,同時也伴隨著更多的交通事故的發生。根據新聞報道,在交通事故中疲勞駕駛是最主要的原因之一。為了能夠有效減少此類事故的發生,目前已經有很多方法將人臉識別技術應用于監測駕駛員面部表情判斷其是否處于疲勞駕駛狀態而提醒其注意休息。主要思路為從原始駕駛員面部圖像中來識別疲勞面部表情。通常使用過濾響應,特征碼直方圖或字典原子分布等方法,如:2010年,Cao[1]等人提出一種基于學習的局部描述符和姿勢自適應匹配的人臉識別技術,通過學習局部濾波器來獲得更好的區別性,通過學習編碼以獲取更好的緊湊性。但由于針對于復雜的非線性面部外觀,局部描述符仍有無法避免的局限性并且提高人臉識別的準確性緩慢?;谠撗芯?,2013年,Chen[2]等人提出一種高維特征及其有效壓縮技術(HD-LBP)用于人臉識別,對傳統方法進行高維度映射。所提出的稀疏投影方法在不犧牲精度的前提下減少模型存儲及計算量。但該方法在實際應用中卻有諸多不足使其十分不穩定。隨著機器學習及深度學習研究的不斷深入,越來越多的研究通過采用深度學習模型的方法解決這一問題,并且期望能夠得到精度上的高度提升。針對人臉識別,常規的流程包括四個階段:檢測、對齊、表示及分類。2014年,Taigman[3]等人通過對3D人臉建模來重新實現對齊和表示步驟,以便應用分段仿射變換,經過九層深度神經網絡的特征點分析,對人臉特征點進行描述。該神經網絡使用面部數據集進行了訓練,其包含來自4000多個身份的400萬張面部圖片。經過實驗驗證,該模型可推廣至任意環境下的面部圖像。2009年,Balasubramanian等[4]提出一種使用徑向基函數神經網絡(RBFNN)的自動識別面部和嘴部方法。通過使用多尺度形態學進行面部和嘴部的特征提取。該方法利用運動信息對人臉區域進行定位,并通過對人臉區域的處理確定眼睛的位置。
根據以上基于人臉識別方法的描述,將人臉識別技術應用于駕駛員疲勞駕駛檢測的方法應運而生。2015年,Zhang等[5]根據經驗知識采用快速魯棒性面部檢測算法來描述和規范化面部表情圖像,基于局部特征,對面部采用局部二進制模式算子(Local Binary Pattern, LBP)方式表示,并且發現LBP功能在疲勞面部圖像內能穩定執行。2010年,Yang等[6]提出了一種基于動態貝葉斯網絡的駕駛員疲勞估計推斷方法,其中使用了多個特征,包括上下文特征,物理特征和非物理特征。主要思想將離散隨機過程的當前模型擴展到連續隨機過程以處理更多實際情況。實驗表明,物理特征類別可以有效地檢測出駕駛員疲勞駕駛的特征,具有更好的可靠性。2017年,Zhang等[7]提出一種基于眼睛狀態識別的駕駛員疲勞檢測方法。眼睛狀態識別方法提供了很高的準確性。通過使用眼睛的狀態計算PERCLOS和眨眼頻率參數,判別駕駛員是否處于疲勞狀態。該方法可以在戴眼鏡的情況下工作。然而,由于疲勞駕駛一般出現在深夜凌晨等駕駛艙光照條件較弱的時段,基于局部特征的算法誤差較大;同時由于車載設備性能的限制復雜度較高的算法,無法用于實時監測。
本文將基于駕駛艙實際環境,首先計算駕駛艙環境像素平均值判別當前狀態為日間或夜間。其中,在地下車庫等光線較差的地方統一認為為夜間狀態。針對不同的環境,采用不同的面部識別算法。在日間狀態下,本文基于AdaBoost算法,選取5個矩形特征組合作為模板進行特征訓練,以此得到適合疲勞監測系統所需的眼部及嘴部特征,并依據此特征計算眼部PERCLOS值用于判斷駕駛員疲勞狀態。
判斷夜間環境由于光照條件差,傳統利用深度網絡從圖像幀中提取時空間特征來進行微表情識別的誤差率較大。論文[8]中發現人的瞳孔反射光對于光變化較為敏感,而人臉的其他部分變化不大。依據此原理,本文采用相鄰幀間差分的方法確定眼部的特征,同時使用局部二進制特征(local Binary Patterns, LBP)算法來處理眼部的開合狀態。在已經定位眼睛的前提下,根據人臉部器官的分布來定位嘴部的位置。然后使用LBP算法進一步測試打哈欠行為,根據打哈欠的長度和頻率確定駕駛員的疲勞程度。
同時,為了評估眼部狀態信息和嘴部狀態信息對駕駛員是否處于疲勞駕駛狀態的比重,本文對其進行了實驗比對。實驗結果表明:當嘴部狀態信息權重β為0.44,系統判別精度最高。在日間清醒場景下最高精度可達93.6%,平均識別準確率為92.1%。
本文提出的基于AdaBoost及LBP算法的日間夜間疲勞駕駛檢測算法總體框架,如圖1所示。
該算法共分為兩部分:日間狀態和夜間狀態。在識別出面部信息后,對眼部信息進行PERCLOS值計算,對嘴部信息采用LBP算法估測其開合程度及頻率。最后根據眼部和嘴部的信息值加權判斷駕駛員當前狀態是否為疲勞駕駛。
為了能夠準確判別出攝像機所檢測到的圖像幀中的人臉輪廓,本文采用Canny邊緣檢測算法[8]對圖像幀進行輪廓檢測。相比于Sobel算子和Prewitt算子,Canny邊緣檢測算法具有更低的錯誤率,即所有邊緣都可以被找到;邊緣點定位更準確。Canny算法的主要步驟如下。
(1) 為了盡可能降低噪聲對圖像處理的影響,首先對圖像進行高斯平滑濾波,從而減少邊緣檢測器上的噪聲影響。式1表示當卷積核大小為(2k+1)(2k+1)時,卷積核每位計算式為

1≤i;j≤(2k+1)
(1)
假設圖像描述為大小為(2k+1)×(2k+1)的矩陣M,則經過高斯濾波后,其像素點m的亮度值為
m=H*M
(2)
其中,*表示卷積。
(2) 計算梯度強度和方向,圖像的邊緣可以指向各個方向,在Canny算法中,選取水平、垂直和對角邊緣。首先通過Sobel等算子計算出水平Gx和垂直Gy方向的一階導數,則可得到像素點處的梯度的值G和方向θ:
(3)
θ=arctan(Gy/Gx)
(4)
(3) 若x和y方向的Sobel算子分別為sx和sy,圖像窗口為矩陣M,則在像素點m處的梯度值為
Gx=sx*M
(5)
Gy=sy*M
(6)
(4) 僅僅采用梯度值來提取邊緣像素點的結果仍非常模糊,為了能夠增強邊緣點強度,采用非極大值抑制技術來增強邊緣像素點。其主要思路為:將當前像素的梯度強度與沿正負梯度方向上的2個像素進行比較,若當前像素的梯度強度與另外2個像素相比最大,則該像素點保留為邊緣點,否則該像素點將被抑制;
(5) 使用雙閾值檢測進一步確定像素邊緣點。
如圖2所示,左側為相機采集到的圖像幀,右側為通過圖像預處理階段得到的完成邊緣檢測的圖片。人物的關鍵邊緣點均被檢測出,結果總能保證對人臉部邊緣點的信息檢測。


圖2 采用Canny算法進行圖像邊緣檢測
Adaboost算法[9]是Boosting族算法中最具代表性的算法。Boosting族算法的主要工作機制為:首先在初始訓練集中進行訓練,得出初始學習器。對初始學習器所預測出的樣本質量進行劃分,重點關注訓練錯誤的樣本?;谟柧氬e誤的樣本,進行下一輪學習器的訓練,不斷重復上述步驟,直至學習器數量達到期望閾值數S則停止學習。最后,對這S個學習器進行加權結合。其主要目的在于將弱學習器提升為強學習器。Adaboost算法步驟如下。
(1) 初始化第s個學習器樣本權重,其中0≤s≤S,
(7)
(2) 根據學習器的樣本權重分布Ds進行數據訓練得到Gs(x):
Gs(x):χ→{-1,+1}
(8)
(3) 計算Gs(x)在加權訓練數據集上的分類誤差率:
(9)
其中,I(·)為指示函數,同時判斷分類誤差率是否滿足基本條件,若不滿足則停止學習。
(4) 計算Gs(x)在全部學習器中的權重:
(10)
(5) 更新訓練樣本權重:
Ds+1=(wm+1,1,wm+1,2,…,wm+1,N)
(11)
(12)
其中,Zs是規范化因子。
基于以上集成學習的優勢,本文期望通過采用Adaboost算法中各個學習器的結合,使系統對于眼部及嘴部的位置識別結果更加精確。
夜間模式由于光照條件限制,傳統的基于特征提取的人臉識別方法誤差率較大。由于瞳孔對可見光反射相較于人臉其他部位變化明顯得多,并且相鄰幀間圖像的間隔不大,只有瞳孔反射光的變化較為明顯,由此采用幀間差分算法對瞳孔位置進行定位。具體步驟如下。
(1) 將當前幀灰度化,之后使用將當前幀圖像與上一幀處理過的圖像做差,最后利用取絕對值。
(2) 對差分圖像進行局部二進制特征處理,使得眼部特征更顯性地分離出來。具體做法是用雙峰法將原灰度圖轉化為二值圖。
駕駛艙圖像主要由前景和背景兩部分組成,在處理圖像的灰度直方圖上,前景及背景像素的灰度值分布會形成山峰狀態,而在兩峰之間的低谷就是圖像分割的閾值所在。從而得出夜間模式下的瞳孔信息。
為了能夠在夜間模式下獲取到嘴部信息,根據幀間差分算法估計出瞳孔位置后,本文將采用“三庭五眼”的規律來定位嘴部位置,具體來說:人臉上鼻尖和下巴將整個臉部在豎直方向上三等分,俗稱“三庭”。“五眼”是指左右眼的內外眼角將人臉從寬度上五等分。實際效果如圖3所示。


圖3 “三庭五眼”嘴部位置估計
在日間模式或夜間模式提取到臉部的眼部信息后,需要計算獲得眼部的高寬比v用于判斷當前眼部狀態是否處于疲憊狀態。具體公式如:
(13)
其中,we、le分別為讀取到的眼部寬度和眼部長度。當眼部高寬比小于270時,可以視為閉合狀態;當高寬比大于400時,視為打開狀態。將高寬比用于計算PERCLOS(單位時間內眼睛閉合時間所占的百分率)來衡量駕駛員的疲勞程度。PERCLOS值計算式如下:
(14)
PERCLOS度量的是單位時間內駕駛員眼睛閉合程度超過某一閾值(本文所用為70%)的時間占總駕駛時間的百分比。在美國聯邦道路局的研究中,PERCLOS被證明是九種現有與疲勞駕駛有關的指標中相關性最好的。
在確定的嘴部的大致區域后,本文使用LBP算法來檢測打哈欠的行為。首先將整個區域劃分為16×16的cell,在每個cell中,對于每一個像素,將自己的灰度值作為閾值,周圍8個相鄰像素點的灰度值若大于該閾值,則標記為1,否則標記為0。這樣,與中心像素相鄰的8個點就產生了一個8位二進制數,即為該中心點的LBP值。如,該矩陣的紋理信息即為(11010011)10= 211。之后計算每個cell的LBP直方圖(即統計LBP值出現的頻率),對直方圖進行歸一化處理。最后將得到的每個cell的統計直方圖連接成為特征向量,也就是整個圖像的LBP特征向量。圖4為經過LBP處理后的矩陣。

圖4 LBP處理過程
在獲得駕駛員嘴部特征后,根據嘴部高寬比o來判斷當前嘴巴是否處于張開狀態,具體計算式如下:
(15)
由實驗結果發現,當o大于1 200時,嘴部處于閉合或正常說話裝填;當o小于700時,嘴巴處于張大狀態。為了將駕駛員因受驚而嘴巴張開和打哈欠的狀態區分開來,如果最近的6幀圖像中有超過5幀嘴部處于張大狀態,則判斷駕駛員在打哈欠。最終,采用如下等式計算fyawn:
(16)
基于前文,本文已針對攝像機采集到的圖像幀經過處理并針對不同模式下的臉部及嘴部進行識別。但我們知道,在現實場景中,駕駛員可能會說話。在這種情況下,嘴部信息可能會導致結果的誤判,為了考慮這一點,本文提出一種基于權重的嘴部和眼部信息融合估計算法,得出最終用于判別駕駛員疲勞狀態的FV(Fatigue Value)。以提高算法的穩定性。主要計算式如下:
FV=PERCLOS+β×fyawn
(17)
在具體判別過程中,若FV大于1 500,則判斷駕駛員當前為疲勞駕駛狀態,同時給予駕駛員及周圍車輛警告。若FV小于700,則表明駕駛員精神狀態良好。
實驗環境:訓練模型所用計算機配備I9-9900K CPU、RTX 2070 SUPER顯卡。視頻錄制設備為羅技C270網絡攝像頭,視頻分辨率為1 280×720,采樣頻率為60fps。實驗平臺為Win10操作系統下的MATLAB2020a。
本文模擬了不同人員在清醒以及疲勞狀態下駕駛過程并錄制成視頻作為數據集。視頻錄制場景分為白天自然光環境以及夜晚弱燈光環境,并要求模擬人員晃動頭部以模擬實際行車過程中觀察路面的動作,所有錄制均在室內完成。其中包含白天自然光環境與夜晚弱燈光環境各200段視頻,每段視頻長度為30 s。
經驗表明,人在疲勞時會伴隨眼睛的打盹及打哈欠狀態。為了能夠更好的預測出駕駛員是否處于疲勞狀態及嘴部行為權重β在判別駕駛員疲勞程度中發揮的作用,本文將β從0開始(0即為不考慮嘴部行為)以0.05的步長增加到1,同時在夜晚及白天數據集下測試算法總準確度。結果如圖5所示。

圖5 權重β對實驗結果精度的影響
從圖5的結果可以看出,算法準確率在β=0.44處達到最高值,在β小于0.2及β大于0.55區間內算法準確率均以較大程度下滑。本文將采用=0.44作為系統的權值 。
夜晚場景如下表所示,為驗證幀間差分算法的有效性,本文實現了經典AdaBoost與SVM算法,并與本文算法進行對比,結果如表1所示。

表1 夜間環境算法準確率比較
實驗結果表明,幀間差分算法在夜晚疲勞狀態及夜晚清醒狀態下,識別準確率均高于經典AdaBoost算法及SVM算法。幀間差分算法比AdaBoost算法在兩種數據集上分別高了2.8%和4.1%,比SVM算法在兩種數據集上分別高了7.6%和11.1%。在整個夜晚場景數據上,幀間差分算法判別準確率比AdaBoost算法和SVM算法分別高了3.5%和9.4%。另外,3種算法均在疲勞數據集上有更好的表現。
為驗證算法整體準確性,將本文算法在全部數據集上與當前主流的駕駛員疲勞識別方法相比較,包括SVM方法、經典AdaBoost算法以及EGG腦電圖[10]、脈搏和HPM頭位置測量法[11]等接觸式判別方式,結果如表2所示。








圖6 本文算法在各場景下實際運行結果

表2 整體算法準確率比較 單位:%
實驗結果表明,本文算法在4個場景下均表現良好。具體來看,在夜晚清醒場景下,本文算法準確率為90.3%,相比于次高的HPM頭位置測量法有一定程度的提高,但相較于對比的AdaBoost算法準確率有4.1%的上升,在有挑戰性的夜晚環境中上升幅度明顯。其余算法在夜晚-疲勞環境下表現不理想。在日間清醒場景下,本文算法較之前夜晚環境下有3.3%的提升,達到了4個場景中最高的93.6%。其余算法中準確率最高的是經典AdaBoost算法,達到了91.7%。因此,將嘴部開合動作加入到判斷駕駛員疲勞模型中是有效的。在夜晚疲勞場景中,本文算法對比經典AdaBoost有2.8%的提升。HPM頭測量法依舊在夜晚場景上表現良好,達到90.4%。在日間疲勞場景上,本文算法正確率達到93.4%,相對于日間清醒場景的93.6%下降了0.2%。經典AdaBoost和HPM頭測量法對比本文算法分別下降了0.8%和1.7%。
整體上看,基于脈搏測量的判別方法在四個場景下表現均不理想,準確率保持在65%—70%范圍內?;谀槻孔R別的本文算法、經典AdaBoost和SVM方法在日間和夜間場景上有較大性能差異,日間場景準確率比夜間場景平均有4.0%的提升。其中經典AdaBoost方法相差最大,達到4.9%;SVM次之,為4.3%;本文算法在兩個場景之間相差最小,為2.8%。因此,幀間差分的識別方式增強了算法的魯棒性。此外,基于接觸式人體信號檢測的EGG腦電圖方法和脈搏測量法在日間和夜間場景上準確率變化分別為-0.6%和-1.7%,穩定性比基于人臉識別的方法好得多,說明夜間光照條件不佳仍是算法性能的主要瓶頸,之后的工作可以圍繞接觸式測量與人臉識別特征相結合的方向展開。
最后,本文所提出的算法可以在便攜式計算機上實時運行,能夠滿足車載設備實時監測算法的復雜度要求。
本文提出一種基于AdaBoost和LBP算法的實時疲勞駕駛預警監測系統,首先對攝像機采集到的視頻進行視頻關鍵幀提取,對視頻關鍵幀進行圖像預處理,采用Canny算法進行人臉邊緣檢測確定人臉位置。接下來主要用于識別眼睛和嘴巴,主要分為2種情況:在白天模式下,采用AdaBoost算法精確識別出臉部的眼睛和嘴巴;在夜間模式下,采用幀間差分算法獲取瞳孔信息再通過人臉面部構造估計出嘴部位置。當對眼部和嘴部進行精準定位后,提取眼部信息并計算PERCLOS值,采用LBP算法檢測嘴部開合程度及頻率。為了進一步明確眼部和嘴部對疲勞駕駛結果精度的影響,本文添加β參數用于眼部和嘴部的權重平衡,最終對駕駛員是否處于駕駛狀態進行預測并預警。相比于其他方法,本文所提出的方法在白天模式下可提高4%,在夜間模式下可提高3%,并且具有更好的穩定性。