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