SecurityDemo / app.py
mkhodary101's picture
Rename CrowdDetection.py to app.py
2b5f029 verified
raw
history blame
2.38 kB
import gradio as gr
import torch
import cv2
from ultralytics import YOLO
import spaces
# Crowd Detection Class
class CrowdDetection:
def __init__(self, yolo_model_path="yolov8n.pt", crowd_threshold=10):
self.device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
self.model = YOLO(yolo_model_path).to(self.device) # Move to GPU
self.model.nms = 0.5 # Set NMS threshold
self.crowd_threshold = crowd_threshold
def detect_crowd(self, video_path):
cap = cv2.VideoCapture(video_path)
output_path = "output_crowd.mp4"
fourcc = cv2.VideoWriter_fourcc(*"mp4v")
out = cv2.VideoWriter(output_path, fourcc, int(cap.get(cv2.CAP_PROP_FPS)),
(int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)), int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))))
while cap.isOpened():
ret, frame = cap.read()
if not ret:
break
results = self.model(frame)
person_count = 0
for result in results:
boxes = result.boxes.xyxy.cpu().numpy()
classes = result.boxes.cls.cpu().numpy()
for box, cls in zip(boxes, classes):
if int(cls) == 0: # YOLO class ID 0 = "person"
person_count += 1
x1, y1, x2, y2 = map(int, box)
cv2.rectangle(frame, (x1, y1), (x2, y2), (0, 255, 0), 2)
cv2.putText(frame, "Person", (x1, y1 - 10),
cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 255, 0), 2)
alert_text = "Crowd Alert!" if person_count > self.crowd_threshold else f"People: {person_count}"
cv2.putText(frame, alert_text, (50, 50), cv2.FONT_HERSHEY_SIMPLEX, 1,
(0, 0, 255) if person_count > self.crowd_threshold else (0, 255, 0), 2)
out.write(frame)
cap.release()
out.release()
return output_path
# Gradio Function
def process_video(video):
detector = CrowdDetection()
return detector.detect_crowd(video)
# Gradio Interface
interface = gr.Interface(
fn=process_video,
inputs=gr.Video(label="Upload Video"),
outputs=gr.Video(label="Processed Video"),
title="Crowd Detection using YOLOv8"
)
if __name__ == "__main__":
interface.launch()