Aegis_Air / app.py
arieltoledo's picture
Upload folder using huggingface_hub
b2ab75b verified
import numpy as np
import supervision as sv
from ultralytics import YOLO
import gradio as gr
import torch
import spaces
import os
tracker = sv.ByteTrack()
box_annotator = sv.BoxAnnotator()
label_annotator = sv.LabelAnnotator()
trace_annotator = sv.TraceAnnotator()
device = "cuda" if torch.cuda.is_available() else "cpu"
model = YOLO("yolov8n.pt").to(device)
FRAME_INTERVAL = 35
LOW_RES_SIZE = (640,640)
MID_RES_SIZE = (1280,1280)
HIGH_RES_SIZE =(1088,1920)
MAX_PERSONS = 0
auth_users = [(os.getenv('USERNAME'), os.getenv('PASSWORD'))]
@spaces.GPU
def process_video(frame: np.ndarray, _: int) -> np.ndarray:
global MAX_PERSONS
results = model(frame, imgsz=HIGH_RES_SIZE)[0]
detections = sv.Detections.from_ultralytics(results)
person_detections = detections[detections.class_id == 0]
current_person_count = len(person_detections)
if current_person_count > MAX_PERSONS:
MAX_PERSONS = current_person_count
print(f'Personas detectadas: {current_person_count}, Máximo: {MAX_PERSONS}')
tracked_persons = tracker.update_with_detections(person_detections)
labels = [
f"#{tracker_id} {results.names[class_id]}"
for class_id, tracker_id
in zip(tracked_persons.class_id, tracked_persons.tracker_id)
]
annotated_frame = box_annotator.annotate(frame.copy(), detections=tracked_persons)
annotated_frame = label_annotator.annotate(annotated_frame, detections=tracked_persons, labels=labels)
return trace_annotator.annotate(annotated_frame, detections=tracked_persons)
def upload_video(video_path):
global MAX_PERSONS
MAX_PERSONS = 0 # Reiniciar el contador para cada video
output_video_path = "output_video.mp4"
if os.path.exists(output_video_path):
os.remove(output_video_path)
sv.process_video(source_path=video_path, target_path=output_video_path, callback=process_video)
return output_video_path, MAX_PERSONS
with gr.Blocks() as demo:
gr.Markdown("# Aegis Air Demo")
with gr.Row():
video_input = gr.Video(label="Sube tu video aquí")
video_output = gr.Video(label="Video Anotado")
persons_output = gr.Textbox(label="Total de Personas Detectadas", interactive=False)
def process_video_gradio(video):
if video is None:
return None, "No se ha subido ningún video"
processed_video, total_persons = upload_video(video)
return processed_video, f"Máximo número de personas detectadas: {total_persons}"
submit_button = gr.Button("Procesar")
submit_button.click(process_video_gradio, inputs=video_input, outputs=[video_output, persons_output])
demo.launch(auth=auth_users)