Spaces:
Sleeping
Sleeping
| import streamlit as st | |
| import numpy as np | |
| import cv2 as cv | |
| from tensorflow.keras.models import load_model | |
| from tensorflow.keras.preprocessing.image import img_to_array | |
| import pygame | |
| import os | |
| import time | |
| # Load the pre-trained CNN model for drowsiness detection | |
| #model = load_model('drowsiness.h5') | |
| # Define labels | |
| labels = ['Closed', 'Open'] | |
| # Load face and eye cascade classifiers | |
| face_cascade = cv.CascadeClassifier(cv.data.haarcascades + "haarcascade_frontalface_default.xml") | |
| eye_cascade = cv.CascadeClassifier(cv.data.haarcascades + "haarcascade_eye.xml") | |
| # Function to initialize audio | |
| def initialize_audio(): | |
| try: | |
| if not os.environ.get("DISPLAY"): | |
| raise RuntimeError("No display found. Skipping audio initialization.") | |
| pygame.mixer.init() | |
| pygame.mixer.music.load("alarm.wav") | |
| except Exception as e: | |
| print(f"Audio initialization failed: {e}") | |
| initialize_audio() | |
| # Initialize webcam | |
| cam = cv.VideoCapture(0) | |
| FRAME_WINDOW = st.image([]) | |
| run = st.button("Start") | |
| stop = st.button("Stop") | |
| # Function to preprocess the frame for model input | |
| def preprocess_frame(frame): | |
| frame = cv.resize(frame, (24, 24)) # Resize to match model input shape | |
| frame = frame.astype("float") / 255.0 # Normalize | |
| frame = img_to_array(frame) | |
| frame = np.expand_dims(frame, axis=0) | |
| return frame | |
| running = False | |
| closed_start_time = None | |
| alarm_triggered = False | |
| if run: | |
| running = True | |
| while running: | |
| ret, frame = cam.read() | |
| if not ret: | |
| st.warning("Failed to access webcam.") | |
| break | |
| frame = cv.flip(frame, 1) | |
| gray_frame = cv.cvtColor(frame, cv.COLOR_BGR2GRAY) # Convert to grayscale | |
| # Detect faces | |
| faces = face_cascade.detectMultiScale(gray_frame, scaleFactor=1.1, minNeighbors=5) | |
| eye_status = 'Closed' | |
| for (x, y, w, h) in faces: | |
| face_roi = frame[y:y+h, x:x+w] | |
| roi_gray = gray_frame[y:y+h, x:x+w] | |
| eyes = eye_cascade.detectMultiScale(roi_gray, scaleFactor=1.1, minNeighbors=5) | |
| # Draw rectangle around face | |
| cv.rectangle(frame, (x, y), (x+w, y+h), (255, 0, 0), 2) | |
| # Draw ellipses around detected eyes | |
| if len(eyes) > 0: | |
| eye_status = 'Open' | |
| for (ex, ey, ew, eh) in eyes: | |
| center = (x + ex + ew // 2, y + ey + eh // 2) | |
| axes = (ew // 2, eh // 2) | |
| cv.ellipse(frame, center, axes, 0, 0, 360, (0, 255, 0), 2) | |
| closed_start_time = None | |
| if alarm_triggered: | |
| pygame.mixer.music.stop() | |
| alarm_triggered = False | |
| else: | |
| if closed_start_time is None: | |
| closed_start_time = time.time() | |
| elif time.time() - closed_start_time >= 3: | |
| if not alarm_triggered: | |
| try: | |
| pygame.mixer.music.play() | |
| except Exception as e: | |
| print("Alarm triggered, but no audio device found.") | |
| alarm_triggered = True | |
| # Display eye status text | |
| cv.putText(frame, f'Eyes: {eye_status}', (30, 30), cv.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 0), 2) | |
| frame = cv.cvtColor(frame, cv.COLOR_BGR2RGB) | |
| FRAME_WINDOW.image(frame) | |
| # Stop condition | |
| if stop: | |
| running = False | |
| cam.release() | |
| cv.destroyAllWindows() | |
| break | |
| cam.release() | |
| cv.destroyAllWindows() | |