|
import cv2 |
|
import dlib |
|
import pyttsx3 |
|
from scipy.spatial import distance |
|
import streamlit as st |
|
import numpy as np |
|
|
|
|
|
|
|
engine = pyttsx3.init() |
|
|
|
|
|
|
|
face_detector = dlib.get_frontal_face_detector() |
|
|
|
|
|
|
|
dlib_facelandmark = dlib.shape_predictor("shape_predictor_68_face_landmarks.dat") |
|
|
|
|
|
|
|
def Detect_Eye(eye): |
|
poi_A = distance.euclidean(eye[1], eye[5]) |
|
poi_B = distance.euclidean(eye[2], eye[4]) |
|
poi_C = distance.euclidean(eye[0], eye[3]) |
|
aspect_ratio_Eye = (poi_A + poi_B) / (2 * poi_C) |
|
return aspect_ratio_Eye |
|
|
|
|
|
def process_frame(frame): |
|
gray_scale = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) |
|
faces = face_detector(gray_scale) |
|
|
|
for face in faces: |
|
face_landmarks = dlib_facelandmark(gray_scale, face) |
|
leftEye = [] |
|
rightEye = [] |
|
|
|
|
|
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 else 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) |
|
|
|
|
|
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 else 36 |
|
x2 = face_landmarks.part(next_point).x |
|
y2 = face_landmarks.part(next_point).y |
|
cv2.line(frame, (x, y), (x2, y2), (255, 255, 0), 1) |
|
|
|
|
|
right_Eye = Detect_Eye(rightEye) |
|
left_Eye = Detect_Eye(leftEye) |
|
Eye_Rat = (left_Eye + right_Eye) / 2 |
|
|
|
|
|
if round(Eye_Rat, 2) < 0.25: |
|
cv2.putText(frame, "DROWSINESS DETECTED", (50, 100), |
|
cv2.FONT_HERSHEY_PLAIN, 2, (21, 56, 210), 3) |
|
cv2.putText(frame, "Alert!!!! WAKE UP DUDE", (50, 450), |
|
cv2.FONT_HERSHEY_PLAIN, 2, (21, 56, 212), 3) |
|
engine.say("Alert!!!! WAKE UP DUDE") |
|
engine.runAndWait() |
|
|
|
return frame |
|
|
|
|
|
st.title("Drowsiness Detection App") |
|
run = st.checkbox('Run Drowsiness Detection') |
|
|
|
|
|
cap = cv2.VideoCapture(0) |
|
|
|
while run: |
|
ret, frame = cap.read() |
|
if not ret: |
|
st.write("Failed to grab frame") |
|
break |
|
|
|
processed_frame = process_frame(frame) |
|
|
|
|
|
processed_frame = cv2.cvtColor(processed_frame, cv2.COLOR_BGR2RGB) |
|
st.image(processed_frame, channels="RGB", use_column_width=True) |
|
|
|
cap.release() |