Drowsiness / app.py
elucidator8918's picture
Update app.py
ea7c227 verified
raw
history blame
2.32 kB
import cv2
import spaces
import numpy as np
import tensorflow as tf
import gradio as gr
import tempfile
import os
os.environ['CUDA_VISIBLE_DEVICES'] = "0"
print(tf.config.list_physical_devices("GPU"))
model = tf.keras.models.load_model('cnn.keras')
# Function to preprocess each frame
def preprocess_frame(frame):
resized_frame = cv2.resize(frame, (224, 224)) # Adjust size based on your model's input shape
normalized_frame = resized_frame / 255.0
return np.expand_dims(normalized_frame, axis=0) # Add batch dimension
@spaces.GPU(duration=120)
def predict_drowsiness(video_path):
# Open the video file
cap = cv2.VideoCapture(video_path)
frame_width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
frame_height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
fps = int(cap.get(cv2.CAP_PROP_FPS))
# Create a temporary file for the output video
with tempfile.NamedTemporaryFile(suffix='.mp4', delete=False) as temp_output:
temp_output_path = temp_output.name
# Output video settings
out = cv2.VideoWriter(temp_output_path, cv2.VideoWriter_fourcc(*'mp4v'), fps, (frame_width, frame_height))
while cap.isOpened():
ret, frame = cap.read()
if not ret:
break
# Preprocess frame
preprocessed_frame = preprocess_frame(frame)
# Use the model to predict drowsiness
prediction = model.predict(preprocessed_frame)
drowsiness = np.argmax(prediction)
# Add label to frame
label = 'Drowsy' if drowsiness == 0 else 'Alert'
cv2.putText(frame, label, (50, 50), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 0), 2)
# Write the frame with label to the output video
out.write(frame)
# Release resources
cap.release()
out.release()
return temp_output_path # Return the path to the temporary output video
# Gradio interface
interface = gr.Interface(
fn=predict_drowsiness,
inputs=gr.Video(), # Video input from webcam or upload
outputs="video", # Return a playable video with predictions
title="Drowsiness Detection in Video",
description="Upload a video or record one, and this tool will detect if the person is drowsy.",
)
# Launch the app
if __name__ == "__main__":
interface.launch()