abdoulayee's picture
Create app.py
6cc042b verified
import gradio as gr
import cv2
import numpy as np
from ultralytics import YOLO
# Chargement du modèle YOLOv8 personnalisé
detector = YOLO("My_best_model.pt")
# Noms de classes et couleurs pour l'affichage
CLASSES = {0: "valise", 1: "sac à dos", 2: "sac à main"}
COLORS = {
"valise": (255, 0, 0),
"sac à dos": (0, 255, 0),
"sac à main": (0, 0, 255)
}
def analyser_video(video_path):
cap = cv2.VideoCapture(video_path)
fps = int(cap.get(cv2.CAP_PROP_FPS))
width, height = int(cap.get(3)), int(cap.get(4))
output_path = "annotated_output.mp4"
writer = cv2.VideoWriter(output_path, cv2.VideoWriter_fourcc(*'mp4v'), fps, (width, height))
suivi_ids = set()
comptage = {nom: 0 for nom in CLASSES.values()}
while cap.isOpened():
ret, frame = cap.read()
if not ret:
break
resultat = detector.track(frame, persist=True, tracker="bytetrack.yaml")
if resultat[0].boxes.id is not None:
for box, track_id, classe_id, conf in zip(
resultat[0].boxes.xyxy.cpu().numpy().astype(int),
resultat[0].boxes.id.cpu().numpy().astype(int),
resultat[0].boxes.cls.cpu().numpy().astype(int),
resultat[0].boxes.conf.cpu().numpy()
):
nom_classe = CLASSES.get(classe_id)
if nom_classe is None:
continue
if track_id not in suivi_ids:
suivi_ids.add(track_id)
comptage[nom_classe] += 1
x1, y1, x2, y2 = box
couleur = COLORS.get(nom_classe, (255, 255, 255))
etiquette = f"{nom_classe} ID:{track_id} ({conf:.2f})"
cv2.rectangle(frame, (x1, y1), (x2, y2), couleur, 2)
cv2.putText(frame, etiquette, (x1, y1 - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.6, couleur, 2)
# Overlay des comptes
y = 25
cv2.rectangle(frame, (10, 10), (300, 150), (0, 0, 0), -1)
for nom, nb in comptage.items():
cv2.putText(frame, f"{nom}: {nb}", (20, y), cv2.FONT_HERSHEY_SIMPLEX, 0.7, COLORS[nom], 2)
y += 30
total = sum(comptage.values())
cv2.putText(frame, f"Total: {total}", (20, y), cv2.FONT_HERSHEY_SIMPLEX, 0.8, (0, 255, 255), 2)
writer.write(frame)
cap.release()
writer.release()
# Générer le résumé texte directement
resume = "\n".join([f"{k} : {v}" for k, v in comptage.items()])
resume += f"\nTotal : {sum(comptage.values())}"
return output_path, resume
# Gradio : Interface
gr.Interface(
fn=analyser_video,
inputs=gr.Video(label="Téléverser une vidéo"),
outputs=[
gr.Video(label="Vidéo annotée"),
gr.Textbox(label="Résumé du comptage")
],
title="Analyse intelligente de bagages avec YOLOv8",
description="Comptez automatiquement les valises, sacs à dos et sacs à main dans une vidéo. YOLO + ByteTrack intégré."
).launch()