紀(jì)世雨
(解放軍總醫(yī)院醫(yī)療保障中心, 北京 100039)
根據(jù)現(xiàn)有資料顯示,世界上30%~40%的交通事故是由疲勞駕駛導(dǎo)致的。因此,疲勞駕駛是交通事故中的一個(gè)重大隱患。近年來,疲勞駕駛檢測(cè)系統(tǒng)已成為研究的熱點(diǎn)[1-7]。檢測(cè)方法分為主觀檢測(cè)和客觀檢測(cè)[8]。在主觀檢測(cè)方法中,駕駛員必須參與評(píng)價(jià),評(píng)價(jià)通過自問、評(píng)價(jià)、填寫問卷等步驟與駕駛員的主觀感受相聯(lián)系。然后,這些數(shù)據(jù)被用來估計(jì)疲勞駕駛者駕駛的車輛,幫助駕駛員相應(yīng)地計(jì)劃他們的時(shí)間表。然而,客觀檢測(cè)方法不需要駕駛員的反饋,因?yàn)樗鼘?shí)時(shí)監(jiān)測(cè)駕駛員的生理狀態(tài)和駕駛行為特征[9]。收集的數(shù)據(jù)用于評(píng)估駕駛員的疲勞程度。此外,目標(biāo)檢測(cè)又分為接觸檢測(cè)和非接觸檢測(cè)。與接觸式相比,非接觸式更便宜、更方便,因?yàn)橄到y(tǒng)只需要利用計(jì)算機(jī)視覺技術(shù)和攝像頭即可,所以可以在更多的汽車上使用該種設(shè)備[10]。在本研究中,提出一種非接觸式的駕駛疲勞檢測(cè)方法,稱為Caring。該方法只使用車載攝像頭,使用每個(gè)幀圖像來分析和檢測(cè)駕駛員的狀態(tài)。
整個(gè)Caring檢測(cè)系統(tǒng)的構(gòu)建是基于一個(gè)商用車載攝像設(shè)備,一個(gè)云端服務(wù)器,其作用用于處理上傳的數(shù)據(jù),以及一部商業(yè)手機(jī),用來接收云端傳回的處理結(jié)果。圖1顯示了整個(gè)Caring檢測(cè)系統(tǒng)的結(jié)構(gòu)。
圖1 Caring檢測(cè)系統(tǒng)的整體架構(gòu)
在開車的時(shí)候,車載攝像頭捕捉到司機(jī)的頭像,并將視頻流實(shí)時(shí)上傳到云服務(wù)器。然后,云服務(wù)器對(duì)視頻進(jìn)行分析,檢測(cè)司機(jī)的疲勞程度。在這一階段,主要分析了三個(gè)部分:人臉跟蹤,人臉特征識(shí)別和駕駛員疲勞狀態(tài)。為了滿足系統(tǒng)的實(shí)時(shí)性要求,采用M-KCF算法對(duì)駕駛員的人臉進(jìn)行跟蹤,并基于關(guān)鍵點(diǎn)檢測(cè)識(shí)別出人臉關(guān)鍵區(qū)域。然后,當(dāng)眼睛和嘴巴的狀態(tài)發(fā)生變化時(shí),云服務(wù)器評(píng)估司機(jī)的狀態(tài)。工作流如圖2所示。最后,云服務(wù)器將結(jié)果發(fā)送到司機(jī)的手機(jī)上或應(yīng)用程序中,如果司機(jī)被檢測(cè)到處于昏昏欲睡狀態(tài),則通過手機(jī)或應(yīng)用程序發(fā)送警告音。
圖2 Caring工作流程
在本節(jié)中,將說明使用Caring進(jìn)行駕駛員面部跟蹤的原理。由于真實(shí)環(huán)境的復(fù)雜性,視頻數(shù)據(jù)的每一幀都需要經(jīng)過預(yù)處理才能滿足跟蹤要求。
在檢測(cè)過程中,駕駛室內(nèi)的光照強(qiáng)度在駕駛過程中會(huì)發(fā)生變化,這會(huì)影響圖像的質(zhì)量和人臉的特征。這種情況通常發(fā)生在陰天、下雨和夜晚。為了提高檢測(cè)精度,采用了光照增強(qiáng)的方法對(duì)圖像進(jìn)行預(yù)處理,然后再對(duì)駕駛員的面部進(jìn)行跟蹤。此外,使用直方圖均衡化(HE)算法來提高圖像幀的亮度。
為了確定圖像幀是否需要光增強(qiáng),Caring首先會(huì)評(píng)估圖像的亮度。因此,第一步需要將RGB圖像轉(zhuǎn)換為YCbCr圖像,因?yàn)樵赮CbCr顏色空間中,Y表示亮度值[11-12]。在此利用公式(1)計(jì)算圖像中駕駛員面部周圍Y的平均值M,如下所示:
(1)
其中:L表示YCbCr空間中每個(gè)像素的亮度值,n和i分別表示圖像中駕駛員面部像素的第一和最后序列號(hào)。n-i是駕駛員面部像素的總數(shù)。如果M小于閾值,則圖像使用HE算法增強(qiáng)圖像亮度。否則,圖像將保持不變。在對(duì)大樣本進(jìn)行計(jì)數(shù)后,將閾值設(shè)置為60。圖3顯示了對(duì)光照不足的圖像進(jìn)行光照增強(qiáng)的前后對(duì)比。
圖3 光照增強(qiáng)前后對(duì)比
根據(jù)先前研究可知,KCF算法主要是基于HOG特征[13-15]。因此,在復(fù)雜的環(huán)境中,或者長時(shí)間運(yùn)行,人臉檢測(cè)的窗口會(huì)出現(xiàn)漂移,這將導(dǎo)致后續(xù)檢測(cè)的失敗,如圖4(b)所示。為了改進(jìn)這項(xiàng)缺點(diǎn),在此提出了一種新的人臉跟蹤算法M-KCF,來取代原有的KCF算法。在M-KCF算法中,利用了一種新的CHOG特征,該特征是在原有的HOG特征的基礎(chǔ)上結(jié)合了CNN特征。接下來將具體解釋M-KCF的原理。
圖4 KCF算法跟蹤漂移
2.2.1 對(duì)CHOG特征的提取
2.2.1.1 HOG特征提取
在M-KCF算法中,CHOG特征是人臉跟蹤的基本要素,其中在CHOG特征中,HOG是其重要組成部分。所以需要先對(duì)HOG特征進(jìn)行提取。為了便于計(jì)算,在首先需要將原始圖像轉(zhuǎn)化為灰度圖像。然后,利用公式(2)計(jì)算圖像中每個(gè)像素點(diǎn)的水平梯度和垂直梯度,從而得到該像素點(diǎn)的梯度值,最后同時(shí)得到該點(diǎn)的方向,公式(2)如下所示:
(2)
在公式中,h,Gx以及Gy分別表示點(diǎn)(x,y)的像素值,水平梯度值和垂直梯度值。在得到計(jì)算結(jié)果后,接下來利用公式(3)計(jì)算點(diǎn)(x,y)的最終梯度值和其方向,具體公式入下:
(3)
在公式(3)中G為像素點(diǎn)在(x,y)位置的梯度值,α為在該位置的方向角度。
圖5 SqueezeNet 1.1網(wǎng)絡(luò)模型結(jié)構(gòu)
接下來通過參考文獻(xiàn)[16]可知,需要計(jì)算特征直方圖。梯度方向按照敏感程度分為敏感和不敏感方向,其中敏感方向一共有9個(gè),不敏感方向有18個(gè)。為了計(jì)算對(duì)應(yīng)的直方圖,需要將圖像分割成若干個(gè)單元格。如果單元中的像素點(diǎn)屬于對(duì)應(yīng)的梯度方向,那么此方向的計(jì)數(shù)值將增加1,最終每個(gè)單元都有九維和十八維特征直方圖。
更重要的是,每個(gè)單元的梯度還與周圍4個(gè)相鄰單元的梯度值有關(guān)。所以需要進(jìn)行歸一化和截?cái)嗖僮?,才能將這些梯度特征串聯(lián)起來。具體公式如公式(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)處的單元所對(duì)應(yīng)的特征向量,該向量可能為9或18維。Na,b(j,k)是歸一化結(jié)果,a和b是不同歸一化的相關(guān)編號(hào),共有4種組合,分別為{-1,-1},{+1,-1},{+1,+1},{-1,+1}。
(5)
公式(5)為截?cái)嗵幚?,在公式中F是在(j,k)處的特征向量,Tα(x)表示截?cái)嗖僮?。如果x中的值大于α,則將該值指定給α。
經(jīng)過以上操作以后,一共可以得到108維特征向量,其中原來的9維特征向量擴(kuò)展成36維。同理,18維特征向量擴(kuò)展到72維。然后將這些特征向量排列維陣,整個(gè)矩陣共有4行27列。接下來通過矩陣加法可以得到最后的HOG特征,該HOG特征共有31維。
2.2.1.2 CNN特征的提取
由于單一的HOG特征會(huì)限制算法性能,造成KCF算法在復(fù)雜環(huán)境中,跟蹤結(jié)果較差。因此M-KCF中還選用了CNN特征。相對(duì)于HOG特征,常規(guī)CNN模型提取特征的速度較慢,所以為了滿足系統(tǒng)實(shí)時(shí)性以及保證人臉跟蹤速度等相關(guān)要求,所以在此需要選用小型的CNN模型,在此使用的是SqueezeNet 1.1網(wǎng)絡(luò)模型,整個(gè)網(wǎng)絡(luò)模型的結(jié)構(gòu)如圖5所示。
從圖5中可以知道,squeezeNet的輸入為227*227的圖像。輸出為1 000。整個(gè)網(wǎng)絡(luò)包括2個(gè)卷積層,4個(gè)池化層,以及8個(gè)Fire層,其中Fire層代替了傳統(tǒng)網(wǎng)絡(luò)中的卷積層。在M-KCF算法中,為了避免大量冗余的CNN特征,主要是選用了Fire 5和 Fire 9層進(jìn)行CNN的特征提取,具體圖像如圖6所示。
圖6 基于CNN的特征
2.2.2 HOG和CNN特征融合
首先利用C-KCF算法對(duì)D1×G1原始圖像進(jìn)行特征提取,得到D2×G2的HOG特征和D3×G3,D4×G4的CNN特征。顯然,這三個(gè)特征的大小不同。為了方便后續(xù)處理,所以需要我們對(duì)它們的尺寸進(jìn)行調(diào)整,使它們具有相同的尺寸。因此,調(diào)整公式如公式(6)所示。
(6)
在公式(6)中,D和G分別表示標(biāo)準(zhǔn)長度和寬度。Da和Ga分別表示三個(gè)特征的原始長度和寬度。θ和φ是尺寸因子。
類似于KCF算法的結(jié)構(gòu),在M-KCF算法中,使用通過使用核嶺回歸和結(jié)合每一個(gè)特征去訓(xùn)練它們的分類器,具體如公式(7)所示。
(7)
訓(xùn)練后,我們使用每個(gè)分類器來評(píng)估每個(gè)圖像樣本z的回歸函數(shù)f(z),f(z)的最大值是每個(gè)特征的目標(biāo)預(yù)測(cè)位置。具體計(jì)算公式如公式(8)所示。
(8)
在這里F-1表示逆DFT。 因此,一共獲得了三個(gè)跟蹤結(jié)果。 為了獲得MC-KCF算法的最終結(jié)果,我們?yōu)棣?,δ2和δ3這三個(gè)特征的結(jié)果設(shè)置了不同的權(quán)重。 使用權(quán)重和基于HOG和CNN特征的預(yù)測(cè)位置來計(jì)算MC-KCF算法T的整個(gè)響應(yīng)值。計(jì)算公式如下:
T=δ1×f(zhog)+δ2×f(zfire5)+δ3×f(zfire9)
(8)
在公式(8)中,δ的共域?yàn)閇0,1]。當(dāng)δ=0時(shí),對(duì)應(yīng)特征的響應(yīng)值不是最終結(jié)果;否則,當(dāng)δ=1時(shí),對(duì)應(yīng)特征的響應(yīng)值是整個(gè)響應(yīng)值。從響應(yīng)值中,我們得到了駕駛員面部的位置。三種特征的權(quán)重不同會(huì)影響跟蹤精度。因此,統(tǒng)計(jì)了1 000個(gè)不同權(quán)重比的三個(gè)特征的結(jié)果,結(jié)果如圖(7)所示。從圖中可知,當(dāng)δ1:δ2:δ3的比值分別為0.57:0.14:0.29時(shí),性能最佳。所以在Caring系統(tǒng)中,比率設(shè)置為0.57:0.14:0.29。
圖7 不同權(quán)重比的結(jié)果
由于CNN維數(shù)為384,是大于HOG維數(shù)的。并且由于在視頻中,檢測(cè)對(duì)象連續(xù)兩幀的變化較小。所以為了提高實(shí)時(shí)性,間隔N幀更新一次模型。從而提高系統(tǒng)的實(shí)時(shí)性。在Caring系統(tǒng)中,N的值設(shè)為3,整個(gè)過程如圖8所示。
圖8 M-KCF算法流程
2.2.3 M-KCF算法校準(zhǔn)
如上所述,KCF算法無法自動(dòng)獲得第一視頻幀的跟蹤目標(biāo)。除此以外,由于存在被檢測(cè)者不在攝像機(jī)范圍內(nèi),所以需要對(duì)M-KCF算法進(jìn)行校準(zhǔn),以防算法無法跟蹤駕駛員的面部。在此使用MTCNN定期校準(zhǔn)M-KCF算法。
云服務(wù)器對(duì)視頻幀進(jìn)行預(yù)處理后,判斷當(dāng)前圖像是否為第一幀。如果是,云服務(wù)器將使用MTCNN算法在圖像中定位人臉;否則,云服務(wù)器將繼續(xù)判斷跟蹤時(shí)間跨度是否超過10 s;如果回答是,云服務(wù)器將使用MTCNN算法重新定位人臉并重置跟蹤時(shí)間。如果系統(tǒng)評(píng)估當(dāng)前圖像不是第一幀并且跟蹤時(shí)間的持續(xù)時(shí)間小于10 s,則Caring將使用MC-KCF算法使用結(jié)果來跟蹤駕駛員的面部,以更新下一幀對(duì)駕駛員面部的搜索范圍。整個(gè)算法流程如圖9所示。
圖9 M-KCF算法校準(zhǔn)過程
Caring在用M-KCF算法對(duì)人臉進(jìn)行實(shí)時(shí)追蹤后,接下來需要進(jìn)行司機(jī)疲勞狀態(tài)的判斷。在Caring中主要是通過臉部關(guān)鍵點(diǎn)確定嘴巴和眼睛狀態(tài),從而實(shí)現(xiàn)對(duì)疲勞的檢測(cè)。具體方法將在本節(jié)中詳細(xì)說明。
疲勞檢測(cè)的第一步是對(duì)每幀圖像進(jìn)行人臉關(guān)鍵點(diǎn)檢測(cè)。在此使用了基于OpenCV自帶的Dlib庫,該庫在人臉地標(biāo)識(shí)別過程中使用了方向梯度直方圖和線性支持向量機(jī)。從面部提取68個(gè)坐標(biāo),包括眼睛、眉毛、鼻子、嘴和下頜的點(diǎn)。在IBUG300-W數(shù)據(jù)集[17]上訓(xùn)練了一個(gè)預(yù)先訓(xùn)練過的檢測(cè)器,以從任何一張臉上找到68個(gè)點(diǎn),如圖10所示。
圖10 人臉68個(gè)點(diǎn)示意圖
使用圖11中的眼睛標(biāo)記檢測(cè)哈欠,使用圖12中的嘴巴坐標(biāo)檢測(cè)眼睛睜閉,分別利用公式(9)和(10)計(jì)算眼睛長寬比(EAR)和嘴巴長寬比(MAR)。
圖11 眼睛標(biāo)記
(9)
圖12 嘴巴標(biāo)記
(10)
在公式(9)和公式(10)中,AB,CD,EF,GH分別為圖11和圖12中的點(diǎn)的坐標(biāo)之間的距離??梢杂霉?11)進(jìn)行計(jì)算。
(11)
當(dāng)眼睛睜開時(shí),EAR的值幾乎是恒定的,當(dāng)眼睛閉上時(shí),EAR值變?yōu)榱恪.?dāng)嘴閉上時(shí),MAR值為空,但當(dāng)嘴大開時(shí),MAR值增加。
支持向量機(jī)(SVM)是一種有監(jiān)督的學(xué)習(xí)方法,它從一組標(biāo)記的訓(xùn)練數(shù)據(jù)中生成輸入輸出映射函數(shù)。在開始的時(shí)候,我們使用EAR和MAR的閾值來測(cè)試睡意系統(tǒng):如果EAR值小于EAR閾值或者如果MAR值大于MAR閾值的幀數(shù),那么Caring系統(tǒng)會(huì)認(rèn)為駕駛員處于疲勞狀態(tài)。雖然由于人臉特征在不同用戶之間是不同的,設(shè)置全局閾值并不容易,但一旦自然的表情如說話、微笑、驚訝等,往往會(huì)使EAR變小、MAR增加,因此采用支持向量機(jī)(SVM)代替閾值作為分類學(xué)習(xí)算法。
然后利用EAR和MAR特征對(duì)支持向量機(jī)進(jìn)行訓(xùn)練,對(duì)駕駛員的狀態(tài)進(jìn)行分類,可以檢測(cè)出清醒、打呵欠和閉目3類。為了避免在駕駛員閉目時(shí)將眨眼視為駕駛員的微睡眠狀態(tài),計(jì)算了一個(gè)新的特征,即閉眼持續(xù)時(shí)間,并給出了眨眼和微睡眠兩類。因此,我們可以識(shí)別每一個(gè)眨眼,并將其與午睡或瞌睡區(qū)分開來。如果預(yù)測(cè)到打哈欠或微睡眠,則會(huì)激活警報(bào)提醒駕駛員,并在手機(jī)屏幕上顯示通知。
圖13展示Caring系統(tǒng)的原型,整個(gè)系統(tǒng)是由一臺(tái)型號(hào)為S650的360行車記錄儀充當(dāng)車載攝像頭,一臺(tái)Alienware M15筆記本充當(dāng)云服務(wù)器,其配置為英特爾I7 處理器,16GB的DDR4內(nèi)存,以及英偉達(dá)GTX 2060OC 6G顯卡,一臺(tái)iPhone 7手機(jī)充當(dāng)接收端。
圖13 Caring系統(tǒng)展示
整個(gè)實(shí)驗(yàn)中,采集了10名志愿者的駕駛數(shù)據(jù),每段視頻時(shí)長2小時(shí)。其中志愿者需要在視頻中模擬疲勞,清醒等狀態(tài),盡可能接近真實(shí)駕駛中司機(jī)會(huì)有的狀態(tài)。同時(shí)采用原始KCF算法的數(shù)據(jù)集來評(píng)估M-KCF算法。
M-KCF算法檢測(cè)結(jié)果如圖14所示,從圖14中可以發(fā)現(xiàn)M-KCF算法比原始KCF算法在檢測(cè)過程中更加契合人臉,效果較好。
圖14 M-KCF和KCF檢測(cè)結(jié)果對(duì)比
此外為了進(jìn)一步評(píng)估M-KCF算法性能,在此還利用目標(biāo)邊界的預(yù)測(cè)值與實(shí)際值之間的歐氏距離來進(jìn)對(duì)算法進(jìn)行評(píng)估。將M-KCF算法與其他使用不同場(chǎng)景的跟蹤算法進(jìn)行了比較。主要的測(cè)試場(chǎng)景是快速運(yùn)動(dòng),目標(biāo)在視野中消失,目標(biāo)旋轉(zhuǎn)。如圖15(a)所示,將每個(gè)場(chǎng)景中的平均測(cè)試結(jié)果計(jì)算為最終實(shí)驗(yàn)結(jié)果。
從圖15(a)可以看出,M-KCF算法具有最佳的跟蹤精度。在復(fù)雜環(huán)境下,M-KCF的準(zhǔn)確度接近90%。駕駛環(huán)境中的人臉跟蹤比其他環(huán)境中的人臉跟蹤更簡(jiǎn)單,因?yàn)轳{駛員的面部移動(dòng)更少,速度也更平均。此外,面部在視野中是可見的。圖15(b)顯示了M-KCF測(cè)試性能和其他跟蹤算法的結(jié)果,顯示當(dāng)歐氏距離在20px內(nèi)時(shí),M-KCF算法產(chǎn)生最佳性能,精度達(dá)到約95%。
圖15 M-KCF算法與其他算法對(duì)比
如表1所示,進(jìn)一步比較了不同方法的速度。KCF算法雖然速度最快,但其精度比M-KCF和KCF+CNN算法差。M-KCF算法對(duì)人臉跟蹤的精度最高,比struck算法的精度高出近20%,但速度略低于KCF算法。M-KCF算法每秒可處理26幀視頻,滿足了系統(tǒng)的要求。因此,認(rèn)為M-KCF算法性能更好,并提供了速度和精度的實(shí)際要求。
表1 與其他算法的性能對(duì)比
由于目前沒有公開的疲勞駕駛數(shù)據(jù)集,所以在此只能利用現(xiàn)在有的最新相似的疲勞檢測(cè)手段與Caring對(duì)比,對(duì)比結(jié)果如表2所示。
表2 疲勞駕駛檢測(cè)方法對(duì)比結(jié)果
從表中可以看到,Caring是所有4種檢測(cè)方法中,精確度最高的,尤其是相對(duì)于文獻(xiàn)[11],精確度提高了近4%。所以Caring檢測(cè)方法能夠滿足日常檢測(cè)需求。
為了實(shí)現(xiàn)對(duì)駕駛員的疲勞程度檢測(cè),因此基于人臉跟蹤和關(guān)鍵點(diǎn)檢測(cè)的基礎(chǔ)上,提出了一個(gè)實(shí)時(shí)疲勞檢測(cè)方法Caring。在該方法中設(shè)計(jì)了一種新人臉跟蹤算法M-KCF來跟蹤駕駛員的面部,該算法主要是利用CNN和MTCNN對(duì)原有的KCF算法進(jìn)行了改進(jìn)。然后Caring基于人臉關(guān)鍵點(diǎn)提取了駕駛員疲勞特征,利用SVM進(jìn)行分類,最終實(shí)現(xiàn)了對(duì)疲勞的檢測(cè)。