基于 OpenCV 的實時睡意檢測系統(tǒng)
該系統(tǒng)可以檢測一個人在開車時是否困倦,如果有的話,可以通過使用語音消息實時提醒他。該系統(tǒng)使用網(wǎng)絡(luò)攝像頭和電話攝像頭進行實時數(shù)據(jù)傳輸。
研究目的
根據(jù)國家公路交通安全管理局的數(shù)據(jù),每年均涉及疲勞駕駛事故中導(dǎo)致超過1,550人死亡和71,000人受傷,但是實際數(shù)字可能要高得多[1]。因此,為了避免這類事故的發(fā)生,我們制作了這個系統(tǒng)。它通過檢查人的眼睛是否閉合或正在打哈欠來預(yù)測眼睛和嘴巴的標(biāo)志,從而確定一個人是否正處于疲勞駕駛。
主要內(nèi)容
該系統(tǒng)的工作可以分為兩個部分:
- 檢測或定位面部。
- 預(yù)測檢測到的面部中重要區(qū)域的地標(biāo)。
一旦預(yù)測出結(jié)果,我們僅使用眼睛地標(biāo)和嘴部地標(biāo)來確定人的眼睛長寬比(EAR)和嘴部長寬比(MAR),以檢查人是否困倦。EAR和MAR的計算如下所示:
from scipy.spatial import distance as dist
def eye_aspect_ratio(eye):
# Vertical eye landmarks
A = dist.euclidean(eye[1], eye[5])
B = dist.euclidean(eye[2], eye[4])
# Horizontal eye landmarks
C = dist.euclidean(eye[0], eye[3])
# The EAR Equation
EAR = (A + B) / (2.0 * C)
return EAR
def mouth_aspect_ratio(mouth):
A = dist.euclidean(mouth[13], mouth[19])
B = dist.euclidean(mouth[14], mouth[18])
C = dist.euclidean(mouth[15], mouth[17])
MAR = (A + B + C) / 3.0
return MAR
現(xiàn)在,既然有了代碼,讓我們了解一下代碼是如何工作的:
dlib庫內(nèi)部的預(yù)訓(xùn)練面部界標(biāo)檢測器用于估計映射到面部面部結(jié)構(gòu)的68-(x,y)坐標(biāo)的位置[2]。這些68-(x,y)坐標(biāo)表示臉部的重要區(qū)域,例如嘴巴,左眉,右眉,左眼,右眼,鼻子和下巴。其中,我們只需要左眼,右眼和嘴巴的(x,y)坐標(biāo):
# Grab the indexes of the facial landamarks for the left and right eye respectively
(lstart, lend) = face_utils.FACIAL_LANDMARKS_IDXS["left_eye"]
(rstart, rend) = face_utils.FACIAL_LANDMARKS_IDXS["right_eye"]
(mstart, mend) = face_utils.FACIAL_LANDMARKS_IDXS["mouth"]
現(xiàn)在,每只眼睛都由一組6-(x,y)坐標(biāo)表示,該坐標(biāo)從眼睛的左上角開始(就像您在看那個人一樣),然后圍繞該區(qū)域的其余部分順時針旋轉(zhuǎn)[3]。:
左上:當(dāng)眼睛睜開時,眼睛界標(biāo)的可視化。右上:閉上眼睛時的眼睛地標(biāo)。底部:繪制隨時間變化的眼睛縱橫比。眼睛縱橫比的下降表示眨眼[3](Soukupová和?ech的圖1)。[4]
基于論文Real-Time Eye Blink Detection using Facial Landmarks[5],我們可以得出一個反映這種關(guān)系的方程,稱為眼睛縱橫比(EAR):
眼睛縱橫比(EAR)公式。
使用這個概念,我們計算了嘴長寬比:
用68-(x,y)坐標(biāo)表示人臉
正如我們看到的,嘴由一組20-(x,y)坐標(biāo)表示。因此,我們已使用坐標(biāo)62、64、66和68來計算兩者之間的距離,方法與EAR計算相同。
結(jié)果:
在人員困倦或打哈欠時發(fā)出警報
另外,為了保留證據(jù),我們保存了讓人昏昏欲睡的框架。
框架存儲在單獨的文件夾中作為證明:
該圖顯示了EAR和MAR隨時間的變化
源代碼的GitHub鏈接可在此處獲得:https://github.com/fear-the-lord/Drowsiness-Detection
參考文獻
- [1]Drivers are falling asleep behind the wheels. Prevalence of drowsy driving crashes: https://www.nsc.org/road-safety/safety-topics/fatigued-driving
- [2]Facial landmarks with dlib, OpenCV and Python: https://www.pyimagesearch.com/2017/04/03/facial-landmarks-dlib-opencv-python/
- [3]Eye blink detection with OpenCV, Python, and dlib: https://www.pyimagesearch.com/2017/04/24/eye-blink-detection-opencv-python-dlib/
- [4]Drowsiness Detection with OpenCV: https://www.pyimagesearch.com/2017/05/08/drowsiness-detection-opencv/
- [5]Real-Time Eye Blink Detection using Facial Landmarks: http://vision.fe.uni-lj.si/cvww2016/proceedings/papers/05.pdf