紀世雨
(解放軍總醫院醫療保障中心, 北京 100039)
根據現有資料顯示,世界上30%~40%的交通事故是由疲勞駕駛導致的。因此,疲勞駕駛是交通事故中的一個重大隱患。近年來,疲勞駕駛檢測系統已成為研究的熱點[1-7]。檢測方法分為主觀檢測和客觀檢測[8]。在主觀檢測方法中,駕駛員必須參與評價,評價通過自問、評價、填寫問卷等步驟與駕駛員的主觀感受相聯系。然后,這些數據被用來估計疲勞駕駛者駕駛的車輛,幫助駕駛員相應地計劃他們的時間表。然而,客觀檢測方法不需要駕駛員的反饋,因為它實時監測駕駛員的生理狀態和駕駛行為特征[9]。收集的數據用于評估駕駛員的疲勞程度。此外,目標檢測又分為接觸檢測和非接觸檢測。與接觸式相比,非接觸式更便宜、更方便,因為系統只需要利用計算機視覺技術和攝像頭即可,所以可以在更多的汽車上使用該種設備[10]。在本研究中,提出一種非接觸式的駕駛疲勞檢測方法,稱為Caring。該方法只使用車載攝像頭,使用每個幀圖像來分析和檢測駕駛員的狀態。
整個Caring檢測系統的構建是基于一個商用車載攝像設備,一個云端服務器,其作用用于處理上傳的數據,以及一部商業手機,用來接收云端傳回的處理結果。圖1顯示了整個Caring檢測系統的結構。

圖1 Caring檢測系統的整體架構
在開車的時候,車載攝像頭捕捉到司機的頭像,并將視頻流實時上傳到云服務器。然后,云服務器對視頻進行分析,檢測司機的疲勞程度。在這一階段,主要分析了三個部分:人臉跟蹤,人臉特征識別和駕駛員疲勞狀態。為了滿足系統的實時性要求,采用M-KCF算法對駕駛員的人臉進行跟蹤,并基于關鍵點檢測識別出人臉關鍵區域。然后,當眼睛和嘴巴的狀態發生變化時,云服務器評估司機的狀態。工作流如圖2所示。最后,云服務器將結果發送到司機的手機上或應用程序中,如果司機被檢測到處于昏昏欲睡狀態,則通過手機或應用程序發送警告音。

圖2 Caring工作流程
在本節中,將說明使用Caring進行駕駛員面部跟蹤的原理。由于真實環境的復雜性,視頻數據的每一幀都需要經過預處理才能滿足跟蹤要求。
在檢測過程中,駕駛室內的光照強度在駕駛過程中會發生變化,這會影響圖像的質量和人臉的特征。這種情況通常發生在陰天、下雨和夜晚。為了提高檢測精度,采用了光照增強的方法對圖像進行預處理,然后再對駕駛員的面部進行跟蹤。此外,使用直方圖均衡化(HE)算法來提高圖像幀的亮度。
為了確定圖像幀是否需要光增強,Caring首先會評估圖像的亮度。因此,第一步需要將RGB圖像轉換為YCbCr圖像,因為在YCbCr顏色空間中,Y表示亮度值[11-12]。在此利用公式(1)計算圖像中駕駛員面部周圍Y的平均值M,如下所示:
(1)
其中:L表示YCbCr空間中每個像素的亮度值,n和i分別表示圖像中駕駛員面部像素的第一和最后序列號。n-i是駕駛員面部像素的總數。如果M小于閾值,則圖像使用HE算法增強圖像亮度。否則,圖像將保持不變。在對大樣本進行計數后,將閾值設置為60。圖3顯示了對光照不足的圖像進行光照增強的前后對比。

圖3 光照增強前后對比
根據先前研究可知,KCF算法主要是基于HOG特征[13-15]。因此,在復雜的環境中,或者長時間運行,人臉檢測的窗口會出現漂移,這將導致后續檢測的失敗,如圖4(b)所示。為了改進這項缺點,在此提出了一種新的人臉跟蹤算法M-KCF,來取代原有的KCF算法。在M-KCF算法中,利用了一種新的CHOG特征,該特征是在原有的HOG特征的基礎上結合了CNN特征。接下來將具體解釋M-KCF的原理。

圖4 KCF算法跟蹤漂移
2.2.1 對CHOG特征的提取
2.2.1.1 HOG特征提取
在M-KCF算法中,CHOG特征是人臉跟蹤的基本要素,其中在CHOG特征中,HOG是其重要組成部分。所以需要先對HOG特征進行提取。為了便于計算,在首先需要將原始圖像轉化為灰度圖像。然后,利用公式(2)計算圖像中每個像素點的水平梯度和垂直梯度,從而得到該像素點的梯度值,最后同時得到該點的方向,公式(2)如下所示:
(2)
在公式中,h,Gx以及Gy分別表示點(x,y)的像素值,水平梯度值和垂直梯度值。在得到計算結果后,接下來利用公式(3)計算點(x,y)的最終梯度值和其方向,具體公式入下:
(3)
在公式(3)中G為像素點在(x,y)位置的梯度值,α為在該位置的方向角度。

圖5 SqueezeNet 1.1網絡模型結構
接下來通過參考文獻[16]可知,需要計算特征直方圖。梯度方向按照敏感程度分為敏感和不敏感方向,其中敏感方向一共有9個,不敏感方向有18個。為了計算對應的直方圖,需要將圖像分割成若干個單元格。如果單元中的像素點屬于對應的梯度方向,那么此方向的計數值將增加1,最終每個單元都有九維和十八維特征直方圖。
更重要的是,每個單元的梯度還與周圍4個相鄰單元的梯度值有關。所以需要進行歸一化和截斷操作,才能將這些梯度特征串聯起來。具體公式如公式(4)和(5)所示:
Na,b(j,k)=(C(j,k)2+C(j+a,k)2+
C(j+a,k+b)2+C(j,k+b)2)1/2
(4)
在公式(4)中,C(j,k)表示在(j,k)處的單元所對應的特征向量,該向量可能為9或18維。Na,b(j,k)是歸一化結果,a和b是不同歸一化的相關編號,共有4種組合,分別為{-1,-1},{+1,-1},{+1,+1},{-1,+1}。
(5)
公式(5)為截斷處理,在公式中F是在(j,k)處的特征向量,Tα(x)表示截斷操作。如果x中的值大于α,則將該值指定給α。
經過以上操作以后,一共可以得到108維特征向量,其中原來的9維特征向量擴展成36維。同理,18維特征向量擴展到72維。然后將這些特征向量排列維陣,整個矩陣共有4行27列。接下來通過矩陣加法可以得到最后的HOG特征,該HOG特征共有31維。
2.2.1.2 CNN特征的提取
由于單一的HOG特征會限制算法性能,造成KCF算法在復雜環境中,跟蹤結果較差。因此M-KCF中還選用了CNN特征。相對于HOG特征,常規CNN模型提取特征的速度較慢,所以為了滿足系統實時性以及保證人臉跟蹤速度等相關要求,所以在此需要選用小型的CNN模型,在此使用的是SqueezeNet 1.1網絡模型,整個網絡模型的結構如圖5所示。
從圖5中可以知道,squeezeNet的輸入為227*227的圖像。輸出為1 000。整個網絡包括2個卷積層,4個池化層,以及8個Fire層,其中Fire層代替了傳統網絡中的卷積層。在M-KCF算法中,為了避免大量冗余的CNN特征,主要是選用了Fire 5和 Fire 9層進行CNN的特征提取,具體圖像如圖6所示。

圖6 基于CNN的特征
2.2.2 HOG和CNN特征融合
首先利用C-KCF算法對D1×G1原始圖像進行特征提取,得到D2×G2的HOG特征和D3×G3,D4×G4的CNN特征。顯然,這三個特征的大小不同。為了方便后續處理,所以需要我們對它們的尺寸進行調整,使它們具有相同的尺寸。因此,調整公式如公式(6)所示。
(6)
在公式(6)中,D和G分別表示標準長度和寬度。Da和Ga分別表示三個特征的原始長度和寬度。θ和φ是尺寸因子。
類似于KCF算法的結構,在M-KCF算法中,使用通過使用核嶺回歸和結合每一個特征去訓練它們的分類器,具體如公式(7)所示。
(7)

訓練后,我們使用每個分類器來評估每個圖像樣本z的回歸函數f(z),f(z)的最大值是每個特征的目標預測位置。具體計算公式如公式(8)所示。
(8)
在這里F-1表示逆DFT。 因此,一共獲得了三個跟蹤結果。 為了獲得MC-KCF算法的最終結果,我們為δ1,δ2和δ3這三個特征的結果設置了不同的權重。 使用權重和基于HOG和CNN特征的預測位置來計算MC-KCF算法T的整個響應值。計算公式如下:
T=δ1×f(zhog)+δ2×f(zfire5)+δ3×f(zfire9)
(8)
在公式(8)中,δ的共域為[0,1]。當δ=0時,對應特征的響應值不是最終結果;否則,當δ=1時,對應特征的響應值是整個響應值。從響應值中,我們得到了駕駛員面部的位置。三種特征的權重不同會影響跟蹤精度。因此,統計了1 000個不同權重比的三個特征的結果,結果如圖(7)所示。從圖中可知,當δ1:δ2:δ3的比值分別為0.57:0.14:0.29時,性能最佳。所以在Caring系統中,比率設置為0.57:0.14:0.29。

圖7 不同權重比的結果
由于CNN維數為384,是大于HOG維數的。并且由于在視頻中,檢測對象連續兩幀的變化較小。所以為了提高實時性,間隔N幀更新一次模型。從而提高系統的實時性。在Caring系統中,N的值設為3,整個過程如圖8所示。

圖8 M-KCF算法流程
2.2.3 M-KCF算法校準
如上所述,KCF算法無法自動獲得第一視頻幀的跟蹤目標。除此以外,由于存在被檢測者不在攝像機范圍內,所以需要對M-KCF算法進行校準,以防算法無法跟蹤駕駛員的面部。在此使用MTCNN定期校準M-KCF算法。
云服務器對視頻幀進行預處理后,判斷當前圖像是否為第一幀。如果是,云服務器將使用MTCNN算法在圖像中定位人臉;否則,云服務器將繼續判斷跟蹤時間跨度是否超過10 s;如果回答是,云服務器將使用MTCNN算法重新定位人臉并重置跟蹤時間。如果系統評估當前圖像不是第一幀并且跟蹤時間的持續時間小于10 s,則Caring將使用MC-KCF算法使用結果來跟蹤駕駛員的面部,以更新下一幀對駕駛員面部的搜索范圍。整個算法流程如圖9所示。

圖9 M-KCF算法校準過程
Caring在用M-KCF算法對人臉進行實時追蹤后,接下來需要進行司機疲勞狀態的判斷。在Caring中主要是通過臉部關鍵點確定嘴巴和眼睛狀態,從而實現對疲勞的檢測。具體方法將在本節中詳細說明。
疲勞檢測的第一步是對每幀圖像進行人臉關鍵點檢測。在此使用了基于OpenCV自帶的Dlib庫,該庫在人臉地標識別過程中使用了方向梯度直方圖和線性支持向量機。從面部提取68個坐標,包括眼睛、眉毛、鼻子、嘴和下頜的點。在IBUG300-W數據集[17]上訓練了一個預先訓練過的檢測器,以從任何一張臉上找到68個點,如圖10所示。

圖10 人臉68個點示意圖
使用圖11中的眼睛標記檢測哈欠,使用圖12中的嘴巴坐標檢測眼睛睜閉,分別利用公式(9)和(10)計算眼睛長寬比(EAR)和嘴巴長寬比(MAR)。

圖11 眼睛標記

(9)

圖12 嘴巴標記

(10)
在公式(9)和公式(10)中,AB,CD,EF,GH分別為圖11和圖12中的點的坐標之間的距離。可以用公式(11)進行計算。
(11)
當眼睛睜開時,EAR的值幾乎是恒定的,當眼睛閉上時,EAR值變為零。當嘴閉上時,MAR值為空,但當嘴大開時,MAR值增加。
支持向量機(SVM)是一種有監督的學習方法,它從一組標記的訓練數據中生成輸入輸出映射函數。在開始的時候,我們使用EAR和MAR的閾值來測試睡意系統:如果EAR值小于EAR閾值或者如果MAR值大于MAR閾值的幀數,那么Caring系統會認為駕駛員處于疲勞狀態。雖然由于人臉特征在不同用戶之間是不同的,設置全局閾值并不容易,但一旦自然的表情如說話、微笑、驚訝等,往往會使EAR變小、MAR增加,因此采用支持向量機(SVM)代替閾值作為分類學習算法。
然后利用EAR和MAR特征對支持向量機進行訓練,對駕駛員的狀態進行分類,可以檢測出清醒、打呵欠和閉目3類。為了避免在駕駛員閉目時將眨眼視為駕駛員的微睡眠狀態,計算了一個新的特征,即閉眼持續時間,并給出了眨眼和微睡眠兩類。因此,我們可以識別每一個眨眼,并將其與午睡或瞌睡區分開來。如果預測到打哈欠或微睡眠,則會激活警報提醒駕駛員,并在手機屏幕上顯示通知。
圖13展示Caring系統的原型,整個系統是由一臺型號為S650的360行車記錄儀充當車載攝像頭,一臺Alienware M15筆記本充當云服務器,其配置為英特爾I7 處理器,16GB的DDR4內存,以及英偉達GTX 2060OC 6G顯卡,一臺iPhone 7手機充當接收端。

圖13 Caring系統展示
整個實驗中,采集了10名志愿者的駕駛數據,每段視頻時長2小時。其中志愿者需要在視頻中模擬疲勞,清醒等狀態,盡可能接近真實駕駛中司機會有的狀態。同時采用原始KCF算法的數據集來評估M-KCF算法。
M-KCF算法檢測結果如圖14所示,從圖14中可以發現M-KCF算法比原始KCF算法在檢測過程中更加契合人臉,效果較好。

圖14 M-KCF和KCF檢測結果對比
此外為了進一步評估M-KCF算法性能,在此還利用目標邊界的預測值與實際值之間的歐氏距離來進對算法進行評估。將M-KCF算法與其他使用不同場景的跟蹤算法進行了比較。主要的測試場景是快速運動,目標在視野中消失,目標旋轉。如圖15(a)所示,將每個場景中的平均測試結果計算為最終實驗結果。
從圖15(a)可以看出,M-KCF算法具有最佳的跟蹤精度。在復雜環境下,M-KCF的準確度接近90%。駕駛環境中的人臉跟蹤比其他環境中的人臉跟蹤更簡單,因為駕駛員的面部移動更少,速度也更平均。此外,面部在視野中是可見的。圖15(b)顯示了M-KCF測試性能和其他跟蹤算法的結果,顯示當歐氏距離在20px內時,M-KCF算法產生最佳性能,精度達到約95%。

圖15 M-KCF算法與其他算法對比
如表1所示,進一步比較了不同方法的速度。KCF算法雖然速度最快,但其精度比M-KCF和KCF+CNN算法差。M-KCF算法對人臉跟蹤的精度最高,比struck算法的精度高出近20%,但速度略低于KCF算法。M-KCF算法每秒可處理26幀視頻,滿足了系統的要求。因此,認為M-KCF算法性能更好,并提供了速度和精度的實際要求。

表1 與其他算法的性能對比
由于目前沒有公開的疲勞駕駛數據集,所以在此只能利用現在有的最新相似的疲勞檢測手段與Caring對比,對比結果如表2所示。

表2 疲勞駕駛檢測方法對比結果
從表中可以看到,Caring是所有4種檢測方法中,精確度最高的,尤其是相對于文獻[11],精確度提高了近4%。所以Caring檢測方法能夠滿足日常檢測需求。
為了實現對駕駛員的疲勞程度檢測,因此基于人臉跟蹤和關鍵點檢測的基礎上,提出了一個實時疲勞檢測方法Caring。在該方法中設計了一種新人臉跟蹤算法M-KCF來跟蹤駕駛員的面部,該算法主要是利用CNN和MTCNN對原有的KCF算法進行了改進。然后Caring基于人臉關鍵點提取了駕駛員疲勞特征,利用SVM進行分類,最終實現了對疲勞的檢測。