python + dlib 实现简单疲劳驾驶检测
引言
本文章實現的疲勞駕駛功能比較單一,僅對眼部進行一個眨眼閾值的檢測,并沒有對人臉其它部位(瞌睡會點頭、嘴部微張等)進行檢測,需要在疲勞駕駛這個方向上深究的hxd可以自己對代碼進行迭代更新。
這篇文章會很啰嗦,想看代碼的hxd可以跳到后邊去看。。。
僅供參考— 因為Github上已經有開源的項目了
需要用到的環境及配置文件
python3.8
dlib
opencv
定位人臉關鍵點模型(注:進入頁面后拖到最下邊,下載 shape_predictor_68_face_landmarks.dat.bz2 這個文件)
本次項目實現的理論來源–論文
裝dlib及人臉關鍵點模型有問題的可以參考這篇文章,再不會可以給我留言,有問必答。
實現思路
1、獲取到人臉,計算機攝像頭獲取到的圖像是一張大畫布,人臉在上邊顯得很小,這時候按照傳統的方法需要寫一些回歸算法來定位到人臉,而dlib的內置函數會幫我們解決這一問題。
2、獲取到人臉關鍵點,在上邊的基礎上,定位到人臉之后,再利用我們上述說到的68個關鍵點模型對關鍵點進行定位
利用68個關鍵點模型獲取到人臉的關鍵點坐標后,仔細觀察可以看到左眼坐標是(42-48),右眼坐標是(36-42) ,得到關鍵點坐標之后就可以開擼了
3、最后參考上邊的論文算法基礎對本項目進行最后的實現,簡單說一下這篇論文算法的核心思想。
這篇論文提到了兩個關鍵的參數,EAR(眨眼最小閾值)、ratio(連續眨眼的最小連續幀)。
這里解釋一下這個ratio,因為計算讀取視頻其實就是將視頻分為一幀一幀的來播放,這里你可以理解為PPT放映,就是當閉眼超過多少幀之后,判定為瞌睡疲勞駕駛。
代碼實現
import cv2 import dlib import pygame import time from scipy.spatial import distance from collections import OrderedDict from imutils import face_utils# 讀取音樂 pygame.mixer.init() pygame.mixer.music.load('../img/audio.mp3')# 加載dlib人臉分類器 detection = dlib.get_frontal_face_detector() # 讀取68點模型文件 predictor = dlib.shape_predictor('shape_predictor_68_face_landmarks.dat')# 開攝像頭 video_capture = cv2.VideoCapture(0) time.sleep(2)# 求er值 def calculate_EAR(eye):# 計算眼睛之間的距離,利用scipy distance 計算上眼皮和下眼皮之間歐氏距離A = distance.euclidean(eye[1], eye[5])B = distance.euclidean(eye[2], eye[4])C = distance.euclidean(eye[0], eye[3])ear_aspect_ratio = (A + B) / (2.0 * C)return ear_aspect_ratio# 眨眼最小閾值 觸發報警的眼睛縱橫比的最小閾值 eyes_blink = 0.3 # 眼睛比率低于觸發警報閾值的最小連續幀 eyes_ratio = 50 # 眨眼次數檢測 count = 0 SHAPE_68_INDEX = OrderedDict([("left_eye", (42, 48)),("right_eye", (36, 42)) ]) # 拿坐標 (lstart,lend) = SHAPE_68_INDEX['left_eye'] (rstart,rend) = SHAPE_68_INDEX['right_eye']while (True):# 讀取每個幀并將其翻轉,然后轉換為灰度ret, frame = video_capture.read()frame = cv2.flip(frame,1)gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)# 利用模型文件對臉型上的68個點進行定位尋找faces = detection(gray,0)for face in faces:shape = predictor(gray, face)shape = face_utils.shape_to_np(shape)# 左右眼坐標leftEye = shape[lstart:lend]rightEye = shape[rstart:rend]# 調用參數計算上眼皮和下眼皮的距離leftEyeDistance = calculate_EAR(leftEye)rightEyeDistance = calculate_EAR(rightEye)# 計算均值ER = (leftEyeDistance+rightEyeDistance) / 2# 利用cv2.convexhull 尋找圖像凸包(凸包就是:打比方一個五角星,每一個尖點相連)leftEyeHull = cv2.convexHull(leftEye)rightEyeHull = cv2.convexHull(rightEye)# 將眼睛畫線cv2.drawContours(frame, [leftEyeHull], -1, (0, 255, 0), 1)cv2.drawContours(frame, [rightEyeHull], -1, (0, 255, 0), 1)# 眨眼檢測if (ER < eyes_blink):count += 1if count >= eyes_ratio:pygame.mixer.music.play(-1)# 因為編碼格式原因,中文顯示不了cv2.putText(frame, "you are tired", (150, 200), cv2.FONT_HERSHEY_SIMPLEX, 1.5, (0, 0, 255), 2)else:pygame.mixer.music.stop()count = 0cv2.imshow('Video', frame)if(cv2.waitKey(1) & 0xFF == ord('q')):breakvideo_capture.release() cv2.destroyAllWindows()總結
為了方便大家看得更清晰一點,我加了很多注釋,還有什么問題歡迎大家點贊留言
總結
以上是生活随笔為你收集整理的python + dlib 实现简单疲劳驾驶检测的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mamp 下载安装php扩展,mamp安
- 下一篇: 录屏工具推荐