Drowsiness Detection using Dlib

Share this post

One of the major causes behind the casualties of people in road accidents is driver’s drowsiness. After continuous driving for a long time, drivers easily get tired resulting in driver fatigue and drowsiness.

Every year many people lose their lives due to fatal road accidents around the world and drowsy driving is one of the primary causes of road accidents and death. Fatigue and micro sleep at the driving controls are often the root cause of serious accidents.

An important application of machine vision and image processing could be driver drowsiness detection system due to its high importance.

In this blog we are going to learn how me make a drowsiness detection by using dlib and opencv library.

First, you need to download the dlib for face point detections such as shape_predictor_68_face_landmarks

https://github.com/davisking/dlib-models/blob/master/shape_predictor_68_face_landmarks.dat.bz2

# =============================================================================
# 1. pip install dlib 
# 2. Download  this Dlib facial Recongination from
# https://github.com/davisking/dlib-models/blob/master/shape_predictor_68_face_landmarks.dat.bz2
# =============================================================================

import cv2
import dlib
from scipy.spatial import distance

def calculate_eye_aspect_ratio(eye):
	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

cap = cv2.VideoCapture(0)
hog_face_detector = dlib.get_frontal_face_detector()
dlib_facelandmark = dlib.shape_predictor("shape_predictor_68_face_landmarks.dat")

while True:
    _, frame = cap.read()
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

    faces = hog_face_detector(gray)
    for face in faces:

        face_landmarks = dlib_facelandmark(gray, face)
        leftEye = []
        rightEye = []

        for n in range(36,42):
        	x = face_landmarks.part(n).x
        	y = face_landmarks.part(n).y
        	leftEye.append((x,y))
        	next_point = n+1
        	if n == 41:
        		next_point = 36
        	x2 = face_landmarks.part(next_point).x
        	y2 = face_landmarks.part(next_point).y
        	cv2.line(frame,(x,y),(x2,y2),(0,255,0),1)

        for n in range(42,48):
        	x = face_landmarks.part(n).x
        	y = face_landmarks.part(n).y
        	rightEye.append((x,y))
        	next_point = n+1
        	if n == 47:
        		next_point = 42
        	x2 = face_landmarks.part(next_point).x
        	y2 = face_landmarks.part(next_point).y
        	cv2.line(frame,(x,y),(x2,y2),(0,255,0),1)

        left_ear = calculate_eye_aspect_ratio(leftEye)
        right_ear = calculate_eye_aspect_ratio(rightEye)

        EAR = (left_ear+right_ear)/2
        EAR = round(EAR,2)
        if EAR <= 0.20:
        	cv2.putText(frame,"Drowsiness Detection",(20,50),
        		cv2.FONT_HERSHEY_SIMPLEX,1,(255,0,0),4)
        	cv2.putText(frame,"Warning",(20,100),
        		cv2.FONT_HERSHEY_SIMPLEX,1,(0,0,255),4)
        	print("Drowsiness")
        print(EAR)

    cv2.imshow("Drowsiness Detection", frame)

    key = cv2.waitKey(1)
    if key == ord('q'):
        break
# release the file pointers    
cap.release()
cv2.destroyAllWindows()

Output


Share this post

Leave a Comment

Your email address will not be published. Required fields are marked *