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()