import cv2 import dlib import pyttsx3 from scipy.spatial import distance import streamlit as st import numpy as np # INITIALIZING THE pyttsx3 SO THAT # ALERT AUDIO MESSAGE CAN BE DELIVERED engine = pyttsx3.init() # FACE DETECTION OR MAPPING THE FACE TO # GET THE Eye AND EYES DETECTED face_detector = dlib.get_frontal_face_detector() # PUT THE LOCATION OF .DAT FILE (FILE FOR # PREDICTING THE LANDMARKS ON FACE ) dlib_facelandmark = dlib.shape_predictor("shape_predictor_68_face_landmarks.dat") # FUNCTION CALCULATING THE ASPECT RATIO FOR # THE Eye BY USING EUCLIDEAN DISTANCE FUNCTION 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 # Function to process each frame 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 = [] # LEFT EYE points 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) # RIGHT EYE points 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) # ASPECT RATIO right_Eye = Detect_Eye(rightEye) left_Eye = Detect_Eye(leftEye) Eye_Rat = (left_Eye + right_Eye) / 2 # DROWSINESS ALERT 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 # Streamlit app st.title("Drowsiness Detection App") run = st.checkbox('Run Drowsiness Detection') # Open webcam 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) # Convert BGR to RGB processed_frame = cv2.cvtColor(processed_frame, cv2.COLOR_BGR2RGB) st.image(processed_frame, channels="RGB", use_column_width=True) cap.release()