王 秀,周楓曉,劉保羅,霍文怡
(洛陽理工學(xué)院 計算機與信息工程學(xué)院,河南 洛陽 471023)
隨著經(jīng)濟的飛速發(fā)展,貨運行業(yè)的發(fā)展趨勢愈加迅猛,貨車駕駛員24 h都留在車上的現(xiàn)象已成為行業(yè)常態(tài)。據(jù)國家統(tǒng)計局?jǐn)?shù)據(jù)顯示,近幾年的特大事故中,有超40%的事故是由于駕駛員疲勞駕駛造成的[1]。為了減少疲勞駕駛導(dǎo)致的交通安全問題,本項目旨在設(shè)計一款可以自動實時檢測駕駛員是否疲勞駕駛并發(fā)出警報的系統(tǒng)。
20世紀(jì)60年代,世界各地已開始對疲勞駕駛進行初步研究,到20世紀(jì)90年代,疲勞程度測量方法已有較大進展,具有代表性的是美國的DDDS(The Drowsy Driver Detection System)系統(tǒng)、日本的DAS2000型路面警報系統(tǒng)(The DAS2000 Road Alert System)等[2],但目前仍缺少被廣泛認(rèn)可并普遍適用的系統(tǒng),究其原因,可能在于系統(tǒng)檢測指標(biāo)單一且無法實時檢測駕駛員的狀態(tài)。
經(jīng)查閱資料[1,3-5],疲勞在人體面部表情中表現(xiàn)出大致3個類型:眨眼、打哈欠、點頭,本系統(tǒng)通過樹莓派調(diào)用攝像頭統(tǒng)計駕駛員眨眼、打哈欠、點頭的次數(shù),當(dāng)任意一項超過設(shè)定值時,即發(fā)出警報,同時將統(tǒng)計的數(shù)據(jù)通過MQTT協(xié)議上傳到云平臺和Web端,再利用APP實時獲取Web端的數(shù)據(jù),便于駕駛員的家人通過APP實時掌握駕駛員的開車狀態(tài),并獲取車輛的準(zhǔn)確位置。一旦駕駛員處于疲勞狀態(tài),APP可通過控制移動端振動、響鈴等方式通知駕駛員,以便及時采取措施應(yīng)對突發(fā)狀況。
本系統(tǒng)主要由樹莓派SCI攝像頭模塊、GPRS模塊、語音報警模塊和博通BCM2711芯片組成,系統(tǒng)框架如圖1所示。由于本系統(tǒng)對人臉識別算法要求較高,且需要在短時間內(nèi)處理大量的圖像數(shù)據(jù),所以在經(jīng)過分析比較之后,最終選用博通BCM2711芯片作為系統(tǒng)的核心處理器。
圖1 系統(tǒng)框架
本系統(tǒng)的主要功能如下:
(1)信息采集。通過攝像頭采集視頻流與駕駛員眨眼、打哈欠、點頭等信息。
(2)GPRS定位。定位該系統(tǒng)所在車輛的實時位置。
(3)通信功能。將采集到的信息和實時位置通過MQTT協(xié)議上傳到云平臺和Web端,再通過MQTT協(xié)議傳輸給手機APP端。
(4)語音報警。當(dāng)判斷駕駛員疲勞駕駛時,控制語音模塊提示駕駛員停車休息,同時警報信息也將上傳云平臺。
本系統(tǒng)通過收集人臉朝向、人臉位置、瞳孔朝向、眼睛開合度、眨眼頻率、瞳孔收縮率等數(shù)據(jù),提取駕駛員面部68個特征點及其坐標(biāo),準(zhǔn)確定位駕駛員人臉的位置,并利用眼部的12個特征點計算眼部長寬比EAR,根據(jù)嘴部的6個特征點計算嘴巴的MAR,利用其他坐標(biāo)結(jié)合HPE算法計算頭部轉(zhuǎn)動的歐拉角。將這些數(shù)據(jù)分別與對應(yīng)的閾值比較,從而統(tǒng)計出駕駛員眨眼、打哈欠和點頭的次數(shù)。通過對駕駛員眨眼、打哈欠、點頭次數(shù)的統(tǒng)計,可實時判斷駕駛員的注意力集中程度,分析駕駛員是否疲勞駕駛,并及時作出安全提示。
Dlib庫是一個開源的工具箱,包括機器學(xué)習(xí)模塊、深度學(xué)習(xí)模塊、圖像處理模塊等[6]。該系統(tǒng)采用Dlib庫中人臉68個關(guān)鍵點檢測shape_predictor_68_face_landmarks.dat的dat模型庫及視頻中的人臉,之后返回人臉特征點坐標(biāo)、人臉框及人臉角度等。本系統(tǒng)利用這68個關(guān)鍵點對駕駛員的疲勞狀態(tài)進行檢測,算法如下:
(1)初始化Dlib的人臉檢測器(HOG),然后創(chuàng)建面部標(biāo)志物預(yù)測;
(2)使用dlib.get_frontal_face_detector() 獲得臉部位置檢測器;
(3)使用dlib.shape_predictor獲得臉部特征位置檢測器;
(4)分別獲取左、右眼面部標(biāo)志的索引;
(5)打開cv2本地攝像頭。
算法程序如下所示:
對視頻流每幀圖片進行處理,獲取連續(xù)3幀內(nèi)眼睛、嘴巴的長寬比和瞌睡點頭時的歐拉角,本系統(tǒng)閾值初步設(shè)為0.2、0.5和0.5。因每個人的眼睛、嘴巴和頭部大小比例不同,系統(tǒng)采取平均值計算方法:先采集30次數(shù)據(jù),取其平均值作為默認(rèn)的閾值(為保證數(shù)據(jù)的準(zhǔn)確性,采集數(shù)據(jù)時應(yīng)平視攝像頭)。分別計算左眼和右眼的眼睛長寬比(EAR),求平均值后作為最終的EAR,如果EAR小于閾值0.2,則計數(shù)加1;若連續(xù)3次都小于閾值,則表示進行了一次眨眼活動;若連續(xù)采集到20次眨眼數(shù)據(jù),則說明駕駛員在疲勞駕駛。同理,如果嘴巴長寬比(MAR)連續(xù)3次大于0.5,說明駕駛員打哈欠;若連續(xù)采集到20次打哈欠數(shù)據(jù),則說明駕駛員在疲勞駕駛。
計算程序如下所示:
2.2.1 基于EAR算法的眨眼檢測
當(dāng)人眼睜開時,EAR在某個值域范圍內(nèi)波動,當(dāng)人眼閉合時,EAR迅速下降,理論上接近于0。當(dāng)EAR低于某個閾值時,眼睛處于閉合狀態(tài);當(dāng)EAR由某個值迅速下降至小于該閾值,再迅速上升至大于該閾值,則判斷為一次眨眼。為檢測眨眼次數(shù),需要設(shè)置同一次眨眼的連續(xù)幀數(shù)。眨眼速度較快,一般1~3幀即可完成眨眼動作。眼部特征點如圖2所示。EAR計算公式[3]見式(1):
圖2 眼部特征點
當(dāng)后幀眼睛寬高比與前一幀差值的絕對值(EAR)大于0.2時,認(rèn)為駕駛員在疲勞駕駛。Dlib庫68個特征點模型如圖3所示。
圖3 Dlib庫68個特征點模型
左右眼開合度可通過公式(2)得到:
眼睛睜開度從大到小為進入閉眼期,從小到大為進入睜眼期,計算最長閉眼時間(可用幀數(shù)來代替)。閉眼次數(shù)為進入閉眼、進入睜眼的次數(shù)。
2.2.2 基于MAR算法的哈欠檢測
基于MAR算法的哈欠檢測,利用Dlib提取嘴部的6個特征點,通過這6個特征點的坐標(biāo)(51、59、53、57的縱坐標(biāo)和49、55的橫坐標(biāo))來計算打哈欠時嘴巴的張開程度。當(dāng)一個人說話時,點51、59、53、57的縱坐標(biāo)差值增大,從而使MAR值迅速增大,反之,當(dāng)一個人閉上嘴巴時,MAR值迅速減小。
通過公式(3)計算MAR來判斷是否張嘴及張嘴時間,從而確定駕駛員是否在打哈欠。閾值應(yīng)經(jīng)過大量實驗,能夠與正常說話或哼歌區(qū)分開來。為提高判斷的準(zhǔn)確度,可采用雙閾值法進行哈欠檢測,即對內(nèi)輪廓進行檢測:結(jié)合張口度與張口時間進行判斷。Yawn為打哈欠的幀數(shù),N為1 min內(nèi)總幀數(shù),設(shè)雙閾值法哈欠檢測的閾值為10%,當(dāng)打哈欠頻率Freq>10%時,則認(rèn)為駕駛員打了1個深度哈欠或者至少連續(xù)2個淺哈欠,此時系統(tǒng)進行疲勞提醒。
2.2.3 基于HPE算法的點頭檢測
HPE(Head Pose Estimation, HPE)算法步驟:2D人臉關(guān)鍵點檢測,3D人臉模型匹配,求解3D點和對應(yīng)2D點的轉(zhuǎn)換關(guān)系,根據(jù)旋轉(zhuǎn)矩陣求解歐拉角。檢測過程中需要使用世界坐標(biāo)系(UVW)、相機坐標(biāo)系(XYZ)、圖像中心坐標(biāo)系(uv)和像素坐標(biāo)系(xy)。
世界坐標(biāo)系轉(zhuǎn)換到相機坐標(biāo)系:
相機坐標(biāo)系轉(zhuǎn)換到像素坐標(biāo)系:
像素坐標(biāo)系與世界坐標(biāo)系的關(guān)系為:
圖像中心坐標(biāo)系轉(zhuǎn)換到像素坐標(biāo)系:
得到旋轉(zhuǎn)矩陣后,求歐拉角:
設(shè)定參數(shù)閾值為0.3,在一個時間段,如10 s內(nèi),當(dāng)?shù)皖^歐拉角|Pitch|≥20°或者頭部傾斜歐拉角|Roll|≥20°的時間比例超過0.3時,則認(rèn)為駕駛員處于瞌睡狀態(tài),發(fā)出預(yù)警。
檢測視頻截圖如圖4所示,圖中顯示的數(shù)據(jù)有EAR、MAR、Z、Blinks、Yowning、Nod,分別表示眼睛長寬比、嘴巴長寬比、頭部傾斜角度、眨眼、打哈欠、點頭的統(tǒng)計次數(shù)。SLEEP表示瞌睡警告,當(dāng)判斷駕駛員處于瞌睡狀態(tài)時,系統(tǒng)屏幕會顯示SLEEP。
圖4 檢測視頻截圖
由于駕駛員在駕駛過程中經(jīng)常會受到光照和外力干擾等因素的影響,所以在實驗中使用了一定數(shù)量不同環(huán)境下的圖像數(shù)據(jù)來測試系統(tǒng)的人臉檢測性能[7]。測試結(jié)果如圖5所示。
圖5 人臉檢測結(jié)果
隨機選取實驗視頻中的30段視頻,每段視頻的時長為1 min,檢測結(jié)果見表1所列。
表1 疲勞駕駛檢測結(jié)果
以上是30組數(shù)據(jù)中的4組,綜合所有數(shù)據(jù),有27組數(shù)據(jù)判斷結(jié)果基本準(zhǔn)確。剩下的4組中,有1組因駕駛員面部有遮擋,導(dǎo)致一些數(shù)據(jù)不準(zhǔn)確,有1組將正常駕駛誤判,另外1組將疲勞駕駛判斷為輕度疲勞。
為了實現(xiàn)實時遠(yuǎn)程監(jiān)測與控制,本系統(tǒng)通過WiFi通信模塊[8]將采集的數(shù)據(jù)上傳至阿里云平臺,采用MQTT協(xié)議與阿里云平臺通信,通信協(xié)議如圖6所示。
圖6 通信協(xié)議
本系統(tǒng)對疲勞駕駛的判定依靠3項指標(biāo),分別是眼睛長寬比、嘴巴長寬比和頭部的變化角度,標(biāo)識符分別為EAR、MAR、Z,數(shù)據(jù)類型為浮點型float。EAR、MAR的取值范圍為0.00~1.00,Z的取值范圍為-90°~90°。疲勞駕駛語音警報的標(biāo)識符為DriveWarning,數(shù)據(jù)類型為int,取值為0、1,其中0代表未達到疲勞標(biāo)準(zhǔn),無需語音提醒;1代表達到疲勞標(biāo)準(zhǔn),開啟語音提醒。
通過三元組實現(xiàn)與云平臺的連接,采用Python語言開發(fā),利用MQTT協(xié)議、Json格式將數(shù)據(jù)發(fā)布到云平臺。數(shù)據(jù)上報程序如下所示:
self.__linkkit.thing_answer_service("attack", self.__call_service_request_id, 200, {})
通信程序如下所示:
將數(shù)據(jù)上報到云平臺后,在云平臺上可以顯示如圖7所示的采集和計算后數(shù)據(jù)。
圖7 云平臺數(shù)據(jù)顯示
本系統(tǒng)通過Dlib庫中的人臉識別和dat模型中的68個關(guān)鍵點,結(jié)合EAR、MAR和HPE算法,判斷駕駛員是否眨眼、打哈欠、點頭,不僅實現(xiàn)了檢測指標(biāo)多樣化,還實現(xiàn)了實時檢測駕駛員疲勞狀態(tài)的目的,可用于貨車、汽車、出租車等機動車輛。本系統(tǒng)與云平臺和Web端通信,可將駕駛員的實時精神狀態(tài)和實時位置通過APP告知其家人,為駕駛員的生命安全增加一份保障[9-10]。本系統(tǒng)的不足之處在于當(dāng)駕駛員面部有部分遮擋時就無法準(zhǔn)確判斷駕駛員是否處于疲勞駕駛狀態(tài),只會發(fā)出語音提示,提醒駕駛員“您已脫離攝像范圍”。因此,下一步的工作重點是如何解決在有遮擋情況下也能正確識別駕駛員精神狀態(tài)的問題。
注:本文通訊作者為劉保羅。