|
import gradio as gr |
|
from collections import defaultdict |
|
import cv2 |
|
import numpy as np |
|
import tempfile |
|
from ultralytics import YOLO |
|
import os |
|
import telegram |
|
import asyncio |
|
|
|
|
|
|
|
TELEGRAM_BOT_TOKEN = "8489885905:AAFoNtXgszbL28yX8ogvQdL6lBHXa9lwHHI" |
|
TELEGRAM_CHAT_ID = "-1002689269933" |
|
|
|
|
|
print("Chargement du modèle YOLOv8...") |
|
model = YOLO("yolov11n.pt") |
|
print("Modèle chargé.") |
|
|
|
|
|
def track_objects(video_in_path): |
|
cap = cv2.VideoCapture(video_in_path) |
|
if not cap.isOpened(): |
|
raise gr.Error("Erreur : Impossible d'ouvrir la vidéo d'entrée.") |
|
|
|
width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)) |
|
height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)) |
|
fps = cap.get(cv2.CAP_PROP_FPS) |
|
|
|
video_out_path = tempfile.NamedTemporaryFile(suffix=".mp4", delete=False).name |
|
fourcc = cv2.VideoWriter_fourcc(*'mp4v') |
|
out = cv2.VideoWriter(video_out_path, fourcc, fps, (width, height)) |
|
|
|
track_history = defaultdict(lambda: []) |
|
|
|
total_frames = int(cap.get(cv2.CAP_PROP_FRAME_COUNT)) |
|
print(f"Début du traitement de {total_frames} images.") |
|
|
|
while cap.isOpened(): |
|
success, frame = cap.read() |
|
if not success: |
|
break |
|
|
|
results = model.track(frame, persist=True) |
|
annotated_frame = results[0].plot() |
|
|
|
if results[0].boxes is not None and results[0].boxes.id is not None: |
|
boxes = results[0].boxes.xywh.cpu() |
|
track_ids = results[0].boxes.id.int().cpu().tolist() |
|
|
|
for box, track_id in zip(boxes, track_ids): |
|
x, y, w, h = box |
|
track = track_history[track_id] |
|
track.append((float(x), float(y))) |
|
if len(track) > 30: |
|
track.pop(0) |
|
|
|
points = np.hstack(track).astype(np.int32).reshape((-1, 1, 2)) |
|
cv2.polylines(annotated_frame, [points], isClosed=False, color=(230, 230, 230), thickness=3) |
|
|
|
out.write(annotated_frame) |
|
|
|
cap.release() |
|
out.release() |
|
print("Traitement vidéo terminé.") |
|
return video_out_path |
|
|
|
|
|
async def send_to_telegram(video_path): |
|
if not TELEGRAM_BOT_TOKEN or not TELEGRAM_CHAT_ID: |
|
error_msg = "Erreur : Les variables d'environnement TELEGRAM_BOT_TOKEN et TELEGRAM_CHAT_ID ne sont pas configurées." |
|
print(error_msg) |
|
return error_msg |
|
|
|
try: |
|
print("Initialisation du bot Telegram...") |
|
bot = telegram.Bot(token=TELEGRAM_BOT_TOKEN) |
|
print(f"Envoi de la vidéo {video_path} au chat ID {TELEGRAM_CHAT_ID}...") |
|
|
|
|
|
async with bot: |
|
with open(video_path, 'rb') as video_file: |
|
await bot.send_video( |
|
chat_id=TELEGRAM_CHAT_ID, |
|
video=video_file, |
|
caption="Voici la vidéo traitée avec le suivi d'objets YOLOv8." |
|
) |
|
|
|
success_msg = "Vidéo envoyée avec succès sur Telegram !" |
|
print(success_msg) |
|
return success_msg |
|
except Exception as e: |
|
error_msg = f"Une erreur est survenue lors de l'envoi sur Telegram : {e}" |
|
print(error_msg) |
|
return error_msg |
|
|
|
|
|
async def process_and_send(video_in_path): |
|
if video_in_path is None: |
|
raise gr.Error("Veuillez d'abord uploader une vidéo.") |
|
|
|
|
|
gr.Info("Le traitement de la vidéo a commencé...") |
|
processed_video_path = track_objects(video_in_path) |
|
|
|
|
|
gr.Info("Traitement terminé. Envoi sur Telegram...") |
|
telegram_status = await send_to_telegram(processed_video_path) |
|
|
|
|
|
return processed_video_path, telegram_status |
|
|
|
|
|
with gr.Blocks() as demo: |
|
gr.Markdown("# Démonstration de Suivi d'Objets avec YOLOv8 et envoi sur Telegram") |
|
gr.Markdown("Uploadez une vidéo. Une fois le traitement terminé, le résultat s'affichera ici et sera envoyé sur votre chat Telegram.") |
|
|
|
with gr.Row(): |
|
video_input = gr.Video(label="Vidéo d'entrée") |
|
video_output = gr.Video(label="Vidéo avec suivi") |
|
|
|
status_textbox = gr.Textbox(label="Statut de l'envoi Telegram", interactive=False) |
|
|
|
btn = gr.Button("Lancer le suivi et Envoyer sur Telegram") |
|
btn.click( |
|
fn=process_and_send, |
|
inputs=video_input, |
|
outputs=[video_output, status_textbox] |
|
) |
|
|
|
|
|
if __name__ == "__main__": |
|
demo.launch() |