張伯辰,施鑫杰,霍梅梅
(浙大城市學院,計算機與計算科學學院,杭州310015)
現(xiàn)代社會,隨著經濟的發(fā)展和道路交通的日趨完善,汽車出行成為了人們生活不可或缺的組成部分。同時,人們對生活質量的要求與日俱增,為了達成目標不得不在疲勞的狀態(tài)下工作奔波,而駕駛人的疲勞狀態(tài)會大大增加車禍發(fā)生的概率。為了避免許多因疲勞駕駛造成的車禍,構建智能交通系統(tǒng)[1],做好對駕駛人的注意力監(jiān)控十分必要。理論上,駕駛輔助系統(tǒng)可以依靠監(jiān)控駕駛人的生理信號、操作行為、車輛狀態(tài)以及面部表情判定其疲勞程度,一般地,面部行為的判定最直接有效反映駕駛人狀態(tài)。
一個疲勞駕駛檢測系統(tǒng)需要滿足對駕駛人的實時監(jiān)控、疲勞判定、實時告警等,本文在系統(tǒng)的軟硬件架構設計方面采用輕量化方案。原型系統(tǒng)的設計基于Python腳本語言,選擇OpenCV跨平臺機器視覺庫[2],在圖像處理、計算機視覺等方面均有豐富的第三方開發(fā)支持,為系統(tǒng)的實現(xiàn)提供了輕量化構建的基礎。選擇樹莓派(Raspberry Pi)作為基礎硬件載體,樹莓派在滿足該系統(tǒng)的功能需求的同時大大降低了系統(tǒng)的成本,此外,硬件良好的性能能夠保證疲勞監(jiān)控的靈活性,給未來的系統(tǒng)功能拓展奠定了良好基礎。
疲勞駕駛檢測系統(tǒng)在樹莓派平臺上進行開發(fā),通過I/O引腳能夠方便地控制具備特殊功能的底層硬件。硬件組成主要包括攝像頭模塊和語音模塊,其中,攝像頭模塊選用motionEyeOS紅外夜視攝像頭。
在樹莓派上搭建OpenCV運行環(huán)境,下載mo?tionEyeOS系統(tǒng)鏡像文件并完成配置。在對駕駛人進行疲勞檢測時,將攝像頭安裝在駕駛人上方,開啟攝像頭,運行算法,系統(tǒng)會自動實時采集臉部圖像,并對圖像做灰度化、關鍵點檢測、3D特征提取等操作進行人臉識別。如圖1所示,系統(tǒng)將眨眼頻率[3]、哈欠頻率[4]和頭部姿勢[5]作為疲勞判定依據,當系統(tǒng)實時判定駕駛人處于疲勞狀態(tài)時,通過語音模塊告警。
圖1 軟件工作流程
(1)利用OpenCV提供的框架提取視頻文件;
(2)從視頻流循環(huán)中讀取圖像,對圖像做維度擴大,并進灰度化;
(3)2D人臉關鍵點檢測,獲取臉部位置特征信息,并轉換為數(shù)組格式;
(4)設置閾值;
(5)分別提取左右眼坐標,構造函數(shù)計算眼部特征EAR值,并使用平均值作為最終的EAR;
(6)提取嘴部坐標,構造函數(shù)計算嘴部特征MAR值;
(7)3D人臉模型匹配,求解3D點與對應原2D點的轉換關系,求解頭部旋轉姿態(tài)歐拉角,結合眼部和嘴部特征判定瞌睡點頭;
(8)獲得規(guī)定時間內眨眼頻率、打哈欠頻率,點頭頻率,超過閾值則發(fā)出疲勞示警。
(1)提取幀圖像檢測人臉,進行畫圖操作,用矩形框標注人臉,并對2D人臉圖像標識68個關鍵特征點。
(2)分別計算左眼和右眼的EAR值求平均作為最終的EAR值,若小于閾值,則記眨眼一次;每三秒計算眨眼頻率若大于1.5倍的正常眨眼頻率,則判定為疲勞狀態(tài);同理可通過打哈欠判斷是否疲勞。
(3)通過計算頭部上下旋轉的歐拉角度,若角度小于-30°則判定為低頭行為,同時若眨眼頻率或打哈欠頻率比正常情況高則判定為疲勞狀態(tài)。
(4)若觸發(fā)疲勞示警,控制顯示器和蜂鳴器發(fā)出提示,則所有計算結果清零。
圖2 軟件功能實現(xiàn)
3.1.1 人臉位置信息獲取
首先,利用OpenCV讀寫視頻流,循環(huán)出圖像幀,初始化DLIB的人臉檢測器(HOG),然后創(chuàng)建面部標志物預測。引入并使用人臉識別算法應用中的開源檢測器工具[6]dlib.get_frontal_face_detector和dlib.shape_predictor構建人臉位置檢測器,再獲取人臉特征關鍵點。
對從視頻流中循環(huán)讀取出的幀圖像做維度擴大,并通過OpenCV進灰度化。使用detector(gray,0)進行人臉位置檢測,使用predictor(gray,0)獲取人臉特征關鍵點的位置信息,其中,gray表示灰度圖。將獲取的信息轉換為array數(shù)組格式。
3.1.2 畫圖操作
使用cv2.convexHull獲取array數(shù)組的凸包位置,并使用drawContours畫出輪廓位置,進行畫圖操作。使用shape_predictor_68_face_landmarks.dat,可以得到68個特征點位置的坐標。結果如圖3所示,標識出68個特征關鍵點,并用矩形框標注人臉。
圖3 關鍵點標識
3.2.1 人眼信息識別
根據已經得到的68個特征點位置的坐標,分別獲取所圖4所示的左右眼面部標志的索引E1、E2、E3、E4、E5、E6,并計算眼睛長寬比[7]EAR值:
圖4 人眼標志坐標
當人眼處于正常睜開狀態(tài)時,EAR值在某個值上下波動。閉眼過程中,EAR值迅速下降,理論上,當完全閉合后,EAR值將為零。由于視頻檢測存在誤差,因此本文認為當EAR值低于某個閾值時,判定眼睛處于閉合狀態(tài)。
人眼眨眼速度較快,一般情況下,1~3幀就可以完成一次眨眼動作,而在疲勞狀態(tài)下,眨眼頻率會下降。實際過程下,根據EAR值的變化,若EAR值小于閾值,則記一次眨眼。在判定疲勞時,計算三秒內的眨眼頻率,若大于1.5倍的正常眨眼頻率,則判定為疲勞。其中包含的兩個閾值都要根據實際情況設置。
3.2.2 嘴部信息識別
同眨眼判定過程理,本文利用嘴部關鍵點計算嘴部長寬比[8]MAR值:
一般情況下的張嘴行為持續(xù)的時間較短,而在打哈欠過程中張嘴時間會延長,根據MAR值的變化來判斷張嘴及張嘴的時間,從而確定是否在打哈欠。記錄規(guī)定時間內的MAR值,若連續(xù)三次小于閾值,則判定人體處于疲勞狀態(tài)。打哈欠判定的關鍵在于通過大量模型訓練區(qū)分打哈欠和唱歌等非疲勞行為。
3.2.3 頭部信息識別
眨眼和打哈欠的判定只需要通過2D人臉關鍵點檢測,幀與幀之間的對比就可以得到效果,而點頭的判定需要引入3D人臉模型匹配,并求解3D點和對應2D點的轉換關系,來判定點頭行為。
首先,引入相機模型中四個坐標系,世界坐標系、相機坐標系、圖像中心坐標系和像素坐標系。攝像頭成像過程是三維的,通過構建這四個坐標系,就可以得到旋轉矩陣,從而求解頭部姿勢旋轉的歐拉角,若角度小于-30°,則判定低頭行為。
實際情況下,駕駛人的點頭行為不僅發(fā)生在疲勞狀態(tài)下,也可能是主動行為。因此,本算法規(guī)定當駕駛人連續(xù)出現(xiàn)低頭行為的同時,若眨眼頻率和張嘴頻率均較正常情況低,則判定為瞌睡點頭。
本文選擇的語音模塊是有源蜂鳴器,這種蜂鳴器與樹莓派配套使用,其內部帶震蕩源,單片機一個高低電平就可以發(fā)出聲音。系統(tǒng)既定疲勞判定標準,駕駛人一出現(xiàn)疲勞狀態(tài),該語音模塊就會發(fā)出提示,直至駕駛人不再處于疲勞狀態(tài)。
疲勞駕駛檢測如圖5所示,圖中紅色立方體為根據頭部姿勢重新建立的空間姿態(tài)立方體,將它與圖像中的標準坐標對比后的結果見圖中X、Y、Z,由右上角圖可見當眨眼頻率和哈欠頻率較高時該算法能及時給出警告。本文使用采集了100組含疲勞狀態(tài)的駕駛視頻對本系統(tǒng)算法進行準確率檢驗,由于算法中的參數(shù)因人而異因此檢測到疲勞行為的準確率在87%左右。
圖5 系統(tǒng)性能測試
本文首先選擇樹莓派作為硬件架構,采用OpenCV、Dlib等開源資源對駕駛人進行人臉識別,實現(xiàn)了實時疲勞告警的功能需求,因其設備便攜度高,可以廣泛應用于汽車出行。該系統(tǒng)圍繞深度學習和物聯(lián)網知識體系,具備良好的可維護性和可拓展性。經過進一步訓練與改進,能夠成為一個功能更加完備,人機交互更加舒適的疲勞駕駛檢測系統(tǒng)。