徐 蓮, 任小洪, 陳閏雪
(1.四川輕化工大學自動化與信息工程學院,宜賓 644000;2.人工智能四川省重點實驗室,自貢 643000;3.四川輕化工大學計算機學院,宜賓 644000)
據中國統計年鑒數據顯示,1995—2014年平均每年有38.2萬起交通事故發生,而35%~40%的交通事故都是由疲勞駕駛引起的,及時檢測疲勞并作出預警是降低交通事故的有效方法之一。疲勞駕駛檢測技術大致可分為行為檢測、生理檢測和視覺檢測3類[1-3],視覺檢測具有非入侵性和準確率高等特點,在疲勞檢測領域得到廣泛應用。
視覺檢測主要是通過眼睛狀態、頭部姿態和面部表情3個方面來確定疲勞程度,其中眼睛包括豐富的信息,不易受外界干擾和人為抑制。閆河等[4]采用194個特征點的人臉主動形狀模型,結合harr級聯定位眼睛區域,通過光流法跟蹤眼瞼特征點識別眼睛狀態,進而實現駕駛員面部疲勞檢測。該方法對光照變化有較好的適應性,但是眼睛狀態識別的準確率還有待改善。Wang等[5]提出一種基于Adaboost和等高線圓的眨眼疲勞檢測算法,先采用Adaboost算法對人臉與眼睛區域進行檢測,用網格方法去除瞳孔區域的像素,然后用最小二乘法對上眼瞼輪廓進行擬合,最后根據PERCLOSE判斷疲勞。李長勇等[6]對駕駛員人臉進行建模,提取駕駛員的視線、眼部PERCLOSE特征,建立基于貝葉斯置信網絡的多信息融合疲勞檢測方法。羅元等[7]結合灰度投影與級聯卷積神經網絡定位眼睛,利用人眼6個特征點識別眼睛開閉度,根據PERCLOSE比值進行疲勞判斷。該類方法在正面能夠達到較好的檢測精度,但易受光照與頭部姿態的影響。在實際駕駛環境中,駕駛員會有多種頭部姿態,如抬頭、低頭、偏頭等,最常見的頭部姿態為左右偏轉。當駕駛員左右偏頭幅度過大時,會出現部分臉部及眼睛的遮擋。綜上所述,減小頭部姿態引起的誤差和提高疲勞駕駛檢測精度是至關重要的。而且疲勞駕駛引發的交通事故反應時間非常短暫,設計一個能夠快速檢測出駕駛員疲勞的模型具有重要意義。
針對以上問題,設計一種眼睛狀態識別網絡(Gabor and LBP-convolutional neural networks,GL-CNN),該網絡將眼睛圖像的gabor特征和LBP特征相結合,通過遷移學習將傳統的圖像處理技術與深度學習結合起來,能夠更有主觀意識地學習特征,有效提高模型分類準確率。用單眼檢測代替傳統的雙眼檢測,增加駕駛員頭部姿態的檢測范圍,旨在提高疲勞駕駛的智能監控能力。
基于眼態識別的疲勞檢測流程如圖1所示。首先將采集的視頻圖像通過MTCNN(multi-task convolutional neural networks)檢測出駕駛員的人臉,并對左右眼睛的位置進行定位,然后經過眼睛篩選機制獲取待檢測的左眼或右眼圖像,將眼睛圖片的Gabor 特征與LBP特征結合到CNN中構造GL-CNN模型,再用訓練好的眼睛狀態分類模型GL-CNN來判斷待檢測眼睛的睜閉狀態,最后通過PERCLOSE等準則判斷駕駛員疲勞或清醒的狀態。

圖1 基于眼態識別的疲勞檢測流程Fig.1 Fatigue detection process based on eye state recognition
人臉檢測和眼睛定位是眼睛狀態識別的關鍵部分。近年來深度學習[8-9]在圖像處理中取得了驚人的成就,在疲勞駕駛檢測中也有涉及。卷積神經網絡(convolutional neural networks,CNN)的多層結構能夠自動學習特征,并且可以學到多個層次的特征。在復雜的實際駕駛環境中,單個CNN模型已經不能滿足人臉關鍵點定位的要求,現參考Zhang等[10]的MTCNN訓練好的模型,網絡結構如圖2所示,主要由PNet、RNet、ONet三層網絡網絡構成,網絡結構由簡單到復雜。

圖2 MTCNN網絡結構Fig.2 The network structure of MTCNN
PNet采用全卷積網絡訓練得到人臉候選框和回歸框向量,然后對人臉候選框進行校準,用非極大值抑制(nonmaximum suppression,NMS)去除掉高度重合的候選框。
RNet將PNet預測的候選窗作為輸入,濾除大量效果較差的候選框,然后對候選框進行校準和NMS進一步優化預測結果。
ONet通過更多的監督來識別面部的區域,最終輸出人臉框和5個特征點(左右眼睛瞳孔、鼻尖、左右嘴角)坐標。
由于只需要定位人臉與眼睛,人臉檢測與眼睛定位如式(1)所示。

1.2.1 眼睛篩選機制
在實際駕駛環境中,駕駛員的頭部姿態是多樣化的,當某只眼睛由于偏轉被遮擋時很難實現同時正確檢測雙眼的狀態,一旦某只眼睛出現錯檢,就判斷為錯檢,對實驗結果的干擾很大。針對這種情況,提出一種眼睛篩選機制。當頭部大幅度偏轉、傾斜時,檢測未被遮擋的單只眼睛圖片,而當雙眼均未被遮擋時,同樣檢測單只眼睛。具體如圖3所示,圖3中fw和fh分別表示MTCNN檢測出人臉框的寬和高,d表示MTCNN定位雙眼瞳孔連線的中點到人臉右邊框的垂直距離,當d大于fw/2時,檢測圖片右眼(實際駕駛員的左眼),否則檢測圖片左眼(實際駕駛員的右眼)。

圖3 眼睛篩選機制示意圖Fig.3 Schematic diagram of the eye screening mechanism
對于檢測到的人臉大小不一,采用一種自適應的方法進行眼睛圖片切割。根據MTCNN檢測出來的眼睛位置分布和人臉大小來剪裁眼睛,即

式(2)中:w和h分別表示剪切后眼睛的寬和高。
1.2.2 遷移學習
遷移學習有域(Domain)和任務(Task)兩個概念[11],域D={X,P(X)}是由特征空間X與邊緣概率分布P(X)(X∈{x1,x2,…,xn})兩部分組成,任務T={Y,H(·)}是由標簽空間Y和目標預測函數H(·)兩部分組成。定義源域為DS,源任務為TS,目標域為DT,目標任務為TT,對于給定的DT、DS、TS、TT,遷移學習是指當DS≠DT或TS≠TT時,用DS和TS的相關信息提高TT中目標預測函數H(·)的學習效率。
根據源域、目標域和任務之間的不同情況,將遷移學習分為歸納遷移學習、傳遞遷移學習和無監督遷移學習3類?,F采用傳遞遷移學習,將眼睛的Gabor特征、LBP特征數據集作為源域,原眼睛圖片作為目標域,當對原眼睛圖片分類訓練時,將特征圖像訓練獲得的模型參數作為模型初始參數。
局部二值模式(LBP)是用來描述圖像局部紋理特征,具有旋轉不變性和灰度不變性等優點。Gabor濾波器可以提取圖像不同方向上的紋理信息,對光照、姿態具有一定的魯棒性。Gabor特征圖與LBP特征圖如圖4所示,原圖經過局部二值化得到眼睛的LBP特征圖,Gabor濾波器從原圖提取0°、45°和90° 3個方向上的特征圖,然后將3個特征圖像映射合成一個新的3通道圖像,最后經過灰度化得到Gabor特征圖。

圖4 Gabor特征圖與LBP特征圖Fig.4 Gabor feature map and LBP feature map
眼睛的Gabor特征、LBP特征圖與原圖有一定的相似性,但是比原圖更凸顯邊緣輪廓。將Gabor特征融合圖與LBP算子結合不僅能夠保留圖像紋理變化表征能力,還能有效降低特征冗余。
1.2.3 眼睛分類模型GL-CNN
眼睛狀態識別方法主要有基于特征分析[12]和模式分類[13]兩類方法,這兩類方法各有所長,但是在實際環境中,光照變化和圖像分辨率低的情況下不能達到理想的效果。為此通過遷移學習將Gabor特征與LBP特征加入到CNN網絡中構造GL-CNN網絡。GL-CNN網絡結構如圖5所示,先將gabor特征圖和LBP特征圖加入到CNN中進行預訓練,再訓練與預訓練采用相同的CNN網絡結構,將預訓練好的模型參數作為再訓練過程的初始參數,然后對原始圖片進行再訓練,最后判斷眼睛的狀態open(睜眼)或close(閉眼)。
CNN網絡結構如圖5虛線框內所示,該網絡層包含2個卷積層、2個池化層、2個全連接層。在每個卷積層后都采用relu激活函數,分別在第二層卷積層和第一個全連接層后面接比例為0.25和0.5的Dropout層防止過擬合。經過兩個全連接層之后,通過一個softmax層完成最后的分類,softmax函數為

圖5 GL-CNN網絡結構Fig.5 The network structure of GL-CNN

式(3)中:Pm表示分類為m的概率,m為0表示睜眼,m為1表示閉眼;xm為全連接層的輸出。全連接層計算公式為

式(4)中:xn表示上一層輸出;wn,m和bm分別表示全連接的權重和偏置。CNN采用二值交叉熵損失函數,公式為

式(5)中:Ln表示第n個樣本的交叉熵;N表示分類數量;yc∈(0,1)表示眼睛樣本的標簽,0表示睜眼,1表示閉眼;Pc表示樣本預測為c的概率。
采集數據、訓數和測試都是基于Python3.6和Tensorflow 1.2.1平臺上實現的,采用普通攝像頭(640×480),顯卡型號為Tesla T4,顯存為15 G。MTCNN對于偏轉一定角度的人臉有較高的準確率,且魯棒性好,為眼睛狀態識別奠定了基礎。
默認眼睛只有開閉兩種狀態,定義一個標準:如果虹膜和眼白部分可見定義為睜眼,否則定義為閉眼。不同的眼睛狀態如圖6所示,如圖6(c)所示,眼睛實際上是睜開的,但是虹膜看不見,將這種近似閉眼的情況定義為閉眼。

圖6 不同狀態的眼睛示例Fig.6 Examples of eyes in different states
眼睛狀態分類網絡GL-CNN訓練和測試數據為自主采集,綜合考慮到實際駕駛環境的復雜性,采集的眼睛圖像包括戴眼鏡、不戴眼鏡、正面、側面和光照不均勻等多種情況。對數據集進行篩選(不區分左右眼),選擇可用于訓練或測試的睜閉眼圖片共12 000張。
GL-CNN采用隨機梯度下降法(stochastic gradient descent,SGD)和動量(momentum)的優化器進行訓練,為了能更好地評估模型的性能和避免過擬合,采用十折交叉驗證原則劃分數據集,訓練集與驗證集比例為7∶3。GL-CNN再訓練損失函數如圖7 所示,再訓練的初始損失率約0.1,在經過1 000次迭代損失函數曲線基本收斂于0.05,在自采集數據集測試準確率為98.2%。

圖7 GL-CNN再訓練損失函數曲線Fig.7 Retraining loss function curve of GL-CNN
通過遷移學習將Gabor濾波器加入CNN調制稱為G-CNN(Gabor-convolutional neural networks ),同理將LBP特征加入CNN調制稱為L-CNN(LBP-convolutional neural networks ),基于CNN的不同算法對比如表1所示。相對于經典C-NN算法,分別加入Gabor特征和LBP特征提升了分類準確率,而將Gabor特征和LBP特征相結合加入CNN人工調制,比單獨加入一種特征圖的準確率高。將傳統的圖像處理技術與深度學習結合起來,不僅能擴展數據集,而且能有效提高模型分類準確率。不同算法在自采集數據測試集上的分類準確率及算法速率如表2所示,本文算法分類準確率最高且速率最快。

表1 基于CNN的不同算法分類對比Table 1 Comparison of classification of different algorithms based on CNN
ZJU(Zhejiang University dataset)[14]是浙江大學采集的眨眼視頻集,共獲取有效圖片8 681幀,本文的眼睛狀態識別算法在ZJU上的測試準確率為97.51%。文獻[15]提出一種新的特征描述子,主方向梯度多尺度直方圖,將MultiHPOG、LTP、Gabor與SVM結合起來檢測眼睛狀態,該方法準確率較高,但耗時較長。對比文獻[15]在ZJU數據集上的性能檢測如表3所示,本文的眼睛狀態識別算法準確率比文獻[15]更高,而且大大縮短了檢測時間。

表2 不同算法在自采集數據集的分類對比Table 2 Comparison of classification of different algorithms in self-acquired datasets

表3 與文獻[15]在ZJU上眼睛狀態識別性能對比Table 3 Comparison of eye state recognition performance with ZJU in[15]
以駕駛員的正前方為中心軸,頭部向各個方向偏轉較小范圍內,雙眼檢測能達到較好的檢測效果。圖8給出了部分具有代表性的5種頭部狀態實驗圖,當駕駛員疲勞時會精神恍惚,頭部會偏轉或者出現頻繁點頭現象,這樣采集到的人臉大面積被遮擋,從而造成眼睛狀態的錯檢。
由圖8可知,頭部偏轉極端時,被遮擋的眼睛出現錯檢,但沒有被遮擋的眼睛檢測正確。因此提出一種眼睛篩選機制,用未被遮擋的單只眼睛替代雙眼檢測。這里測試了450張人臉圖像,分別在轉動角(pitch)方向-30°~30°、滾動角(roll)方向-30°~30°、平動角(yaw)方向-75°~75°范圍內偏轉,考慮到駕駛員白天頭部左右偏轉比較頻繁,重點檢測平動角方向上的效果,視頻流檢測部分結果如圖9所示。

圖8 雙眼檢測結果示例Fig.8 Example of binocular test results

圖9 基于眼睛篩選機制的單眼檢測結果示例Fig.9 Example of monocular detection results based on eye screening mechanism
由圖8、圖9可知,單眼檢測比雙眼檢測適應的頭部姿態更多,單眼檢測在不同的平動角范圍內檢測結果如表4所示。本文算法對于頭部左右大幅度偏轉情況下具有較高的準確率,而且能適應一定范圍內的光照變化,不同光照情況下檢測結果示例如圖10所示。

表4 對比平動角(-75°~75°)范圍內檢測結果Table 4 Compare test results in the range of yaw (-75°~75°)

圖10 不同光照檢測結果示例Fig.10 Example of different lighting detection results

圖11 本文算法在YawDD數據集測試圖片示例Fig.11 Example of the algorithm in the YawDD dataset test image
采用YawDD(yawning detection dataset)[16]來測試單眼檢測與雙眼檢測準確率,YawDD是在駕駛環境中拍攝的視頻數據。男女各占一半,其中20人不戴眼鏡,10人帶眼鏡,共獲取20 005幀圖片,檢測結果如表5所示,單眼檢測比雙眼檢測準確率更高,單眼檢測方法在YawDD數據集上準確率達91.28%,比雙眼檢測方法高出3.37個百分比,由于有色眼鏡框對眼睛區域有不同程度的遮擋,對眼睛狀態檢測增加了難度,戴眼鏡的檢測準確率較不戴眼鏡準確率低,本文算法在YawDD數據集上部分檢測圖片如圖11所示。

表5 單眼檢測與雙眼檢測眼態識別結果對比Table 5 Comparison between monocular detection and binocular detection
由此可見,基于眼睛篩選機制的單眼檢測方法,可以在不擴展數據集的情況下,提高眼睛狀態的識別精度,檢測更多種頭部姿態下的眼睛狀態。
當駕駛員疲勞時面部會出現疲勞特征,如長時間持續閉眼、緩慢眨眼等現象,為此通過獲取駕駛員眼睛的狀態信息判斷駕駛員的疲勞程度。PERCLOSE 表示一段時間內眼睛閉合幀數占該段時間總幀數的占比率,即

式(6)中:m表示閉眼幀數;M表示該段時間內檢測眼睛總幀數,當PERCLOSE大于某個閾值時,判定駕駛員為疲勞狀態。采集了20名志愿者的模擬駕駛的過程,每個人錄10個視頻,每個視頻30 s,共100次疲勞狀態,100次清醒狀態。經過檢測得知,其中清醒狀態PERCLOSE范圍為0~0.3,疲勞狀態的PERCLOSE范圍為0.2~1.0,由此可見當PERCLOSE 在0.2~0.3范圍內是介于清醒與疲勞的過度狀態,為此針對不同閾值PERCLOSE做了對比測試,測試結果如表6所示。當PERCLOSE取值為0.25時,總體錯檢個數最少,檢測的準確率最高,可達到97.5%。
文獻[17]采用動感模擬駕駛儀和ASL眼動儀等設備提取眼部特征參數,建立了基于SVM的疲勞檢測模型。文獻[18]提出一種利用駕駛員眼睛的時空特征檢測疲勞的方法,先采用深度級聯多任務框架提取眼睛區域,然后通過深度卷積層學習眼睛的空間特征,再通過LSTM單元分析相鄰幀間的關系,最后對眼睛疲勞狀態做序列級預測。不同算法疲勞檢測如表7所示,與文獻[17]相比,本文算法準確率更高。對比于文獻[18],本文算法的精度和召回率更高,檢測速度更快。

表6 不同PERCLOS值的疲勞測試準確率對比Table 6 Accuracy comparison of fatigue test with different PERCLOS values

表7 與文獻[17-18]的疲勞檢測性能比較Table 7 Comparison with fatigue testing performance in[17-18]
一般情況下,駕駛員的眨眼頻率為15~30次/min,對于400×300的圖像,本文提出的方法在CPU上運行每分鐘可以檢測視頻圖像700幀左右,平均每次眨眼0.25~0.3 s,本文算法在CPU上運行每張圖片檢測只需要0.096 s。所以,本文算法可以滿足駕駛員的實時疲勞狀態的判斷。
提出一種眼部狀態的疲勞駕駛狀態識別方法,傳統的基于特征提取的疲勞檢測方法簡單有效,基于神經網絡的疲勞檢測方法準確率高、魯棒性強。通過將傳統的特征提取方法與深度學習結合起來,不僅可以學習到更多的特征,而且還可以提高眼睛狀態識別率,可以實時輸出駕駛員的疲勞狀態。實驗結果表明,本文算法在實際駕駛環境中對于駕駛員多姿態疲勞檢測有較高的準確率,而且能夠適應一定的光照變化。本文算法在白天具有較好的檢測效果,在后續工作中,嘗試用紅外圖像檢測晚上的疲勞狀態。