需要源碼的朋友可以私信我
基于Dlib的疲勞檢測系統(tǒng)
1、設計背景及要求
隨著經(jīng)濟的飛速發(fā)展,貨運行業(yè)的發(fā)展趨勢愈加迅猛,貨車駕駛員24h都留在車上的現(xiàn)象已成為行業(yè)常態(tài)。據(jù)國家統(tǒng)計局數(shù)據(jù)顯示,近幾年的特大事故中,有超40%的事故是由于駕駛員疲勞駕駛造成的。為了減少疲勞駕駛導致的交通安全問題,本系統(tǒng)旨在設計一款可以自動實時檢測駕駛員是否疲勞駕駛并發(fā)出警報的系統(tǒng)。
設計要求
(1) 設計并實現(xiàn)一個軟件界面,能夠實時獲取人臉視頻;
(2) 使用OpenCV或Dlib庫實現(xiàn)人臉檢測和特征點標定;
(3) 定義并提取與疲勞駕駛相關的人臉特征;
(4) 合理設計算法,實現(xiàn)駕駛員疲勞狀態(tài)檢測,檢測到疲勞時發(fā)出預警;
(5) 測試系統(tǒng)性能,并分析
2、系統(tǒng)分析
通過攝像頭實時采集駕駛員的行為表情狀態(tài),判斷駕駛員的頭部姿態(tài),眼睛閉合頻率和單位時間打哈欠的次數(shù)來判斷駕駛員的疲勞程度。
3、系統(tǒng)設計
3.1功能結構圖
功能結構圖設計:
本系統(tǒng)通過收集人臉朝向、人臉位置、瞳孔朝向、眼睛開合度、眨眼頻率等數(shù)據(jù),提取駕駛員面部68個特征點及其坐標,準確定位駕駛員人臉的位置,并利用眼部的12個特征點計算眼部長寬比EAR,根據(jù)嘴部的6個特征點計算嘴巴的MAR,利用其他坐標結合HPE算法計算頭部轉動的歐拉角。將這些數(shù)據(jù)分別與對應的閾值比較,從而統(tǒng)計出駕駛員眨眼、打哈欠和點頭的次數(shù)。通過對駕駛員眨眼、打哈欠、點頭次數(shù)的統(tǒng)計,可實時判斷駕駛員的注意力集中程度,分析駕駛員是否疲勞駕駛,并及時作出安全提示。
3.2基于EAR、MAR和HPE算法的疲勞檢測
3.2.1基于EAR算法的眨眼檢測
當人眼睜開時,EAR在某個值域范圍內(nèi)波動,當人眼閉合時,EAR迅速下降,理論上接近于0。當EAR低于某個閾值時,眼睛處于閉合狀態(tài);當EAR由某個值迅速下降至小于該閾值,再迅速上升至大于該閾值,則判斷為一次眨眼。為檢測眨眼次數(shù),需要設置同一次眨眼的連續(xù)幀數(shù)。眨眼速度較快,一般1~3幀即可完成眨眼動作。
3.2.2基于MAR算法的哈欠檢測
基于MAR算法的哈欠檢測,利用Dlib提取嘴部的6個特征點,通過這6個特征點的坐標(51、59、53、57的縱坐標和49、55的橫坐標)來計算打哈欠時嘴巴的張開程度。當一個人說話時,點51、59、53、57的縱坐標差值增大,從而使MAR值迅速增大,反之,當一個人閉上嘴巴時,MAR值迅速減小。
3.3.3基于HPE算法的點頭檢測
HPE(Head Pose Estimation, HPE)算法步驟 :2D人臉關鍵點檢測,3D人臉模型匹配,求解 3D點和對應2D點的轉換關系,根據(jù)旋轉矩陣求解歐拉角。檢測過程中需要使用世界坐標系(UVW)、相機坐標系(XYZ)、圖像中心坐標系(uv)和像素坐標系(xy)。
世界坐標系轉換到相機坐標系:
相機坐標系轉換到像素坐標系:
像素坐標系與世界坐標系的關系為:
圖像中心坐標系轉換到像素坐標系:
4、系統(tǒng)實現(xiàn)與調(diào)試
4.1初步實現(xiàn)
系統(tǒng)的關鍵就是對駕駛員的面部進行識別,然后計算并統(tǒng)計出疲勞值,通過顯示屏把數(shù)據(jù)顯示在屏幕上給駕駛員看,如果駕駛員被判定為疲勞駕駛或者危險駕駛系統(tǒng)就會立即進行語音提醒。想要成功獲得人臉面部的68個特征點,就必須先檢測到人臉的存在。調(diào)用Dlib中的正向人臉檢測器API,如果沒有檢測到人臉就會在屏幕上顯示“No Face”,控制臺輸出“沒有檢測到人臉”,這里用手遮住臉、臉轉向左右兩邊的幅度太大、人臉不在攝像頭的攝像范圍里,人臉距離攝像頭太遠都算沒有檢測到人臉。
從視頻流進行循環(huán),讀取圖片,并對圖片做維度擴大,并進灰度化,使用dlib獲得臉部位置以及臉部特征位置,將臉部特征信息轉換為數(shù)組array的格式,從而提取左眼和右眼坐標。構造函數(shù)計算左右眼的EAR值,使用平均值作為最終的EAR。類似的,獲得嘴部MAR值。分別計算左眼、右眼和嘴部的評分求平均作為最終的評分,如果小于閾值,則加1,如果連續(xù)3次都小于閾值,則表示進行了一次眨眼活動;如果嘴部評分大于閾值,則表示一次打哈欠。
4.2具體實現(xiàn)過程
基于上述程序基礎,添加可視化界面,增加系統(tǒng)交互性。利用wx進行界面搭建,設置視頻源,可選擇攝像頭或視頻文件導入,提供實時檢測和文件檢測功能;添加疲勞檢測參數(shù)設置,可自行勾選檢測參數(shù)以及疲勞時間調(diào)整,檢測條件更加靈活;狀態(tài)輸出欄可查看歷史狀態(tài),追溯用戶歷史數(shù)據(jù),為事故調(diào)查提供條件。如圖7為 UI界面。
后添加點頭檢測增加系統(tǒng)精度,本系統(tǒng)根據(jù)計算歐拉角判斷駕駛員的點頭次數(shù),這里涉及歐拉角的三個角,分別是 Pitch(繞X軸旋轉),Yaw(繞Y軸旋轉),Roll(繞Z軸旋轉),一個物體對于相機的姿態(tài)可以用旋轉矩陣(R)和平移矩陣(T)來表示。人臉2D與3D之間的仿射變換矩陣包含了頭部旋轉和平移信息,可以直接調(diào)用OpenCV的solvePnp()函數(shù)求解得出旋轉和平移向量,最終利用得到的旋轉矩陣來求解歐拉角。當在某一個時間段10s內(nèi),駕駛員的|Pitch|≥20或者|Roll|≥20的時間占比超過0.3時,則判定駕駛員處于疲勞狀態(tài)。
5、系統(tǒng)實現(xiàn)與調(diào)試
本系統(tǒng)采用人臉追蹤和圖像處理相結合的方式采集面部圖像處理疲勞信息,利用面部疲勞特征判斷疲勞狀態(tài),以采集到的人臉圖像信息作為輸入,通過檢測算法輸出判斷結果,判斷為疲勞狀態(tài)后,系統(tǒng)發(fā)出警告。
本系統(tǒng)通過Dlib庫中的人臉識別和dat模型中的68個關鍵點,結合EAR、MAR和HPE算法,判斷駕駛員是否眨眼、打哈欠、點頭,不僅實現(xiàn)了檢測指標多樣化,還實現(xiàn)了實時檢測駕駛員疲勞狀態(tài)的目的,可用于貨車、汽車、出租車等機動車輛,為駕駛員的生命安全增加一份保障。本系統(tǒng)的不足之處在于當駕駛員面部有部分遮擋時就無法準確判斷駕駛員是否處于疲勞駕駛狀態(tài),只會發(fā)出提示,提醒駕駛員“您已脫離攝像范圍”。因此,下一步的工作重點是如何解決在有遮擋情況下也能正確識別駕駛員精神狀態(tài)的問題。
博客主頁:https://blog.csdn.net/weixin_51141489,需要源碼或相關資料實物的友友請關注、點贊,私信吧!