Spaces:
Configuration error
🎥 Guide de Détection Vidéo
✅ Fonctionnalité Ajoutée
Une page dédiée pour traiter les vidéos a été créée avec :
- Upload drag & drop de vidéos (MP4, AVI, MOV)
- Traitement frame par frame avec YOLO
- Vidéo annotée téléchargeable
- Statistiques complètes (FPS, durée, nombre de détections)
- Historique des vidéos traitées
🚀 Comment utiliser
1. Accéder à la page Vidéo
Dans l'application web (http://localhost:3000), cliquez sur "Vidéos" dans le menu de navigation.
2. Uploader une vidéo
Option 1 - Drag & Drop:
- Glissez-déposez votre vidéo dans la zone de dépôt
Option 2 - Sélection:
- Cliquez sur la zone de dépôt
- Sélectionnez votre fichier vidéo
Formats acceptés: MP4, AVI, MOV
Taille maximale: 100 MB
3. Lancer la détection
- Une fois la vidéo uploadée, une prévisualisation s'affiche
- Cliquez sur "Détecter sur Vidéo"
- Attendez le traitement (peut prendre quelques minutes selon la durée)
- Une barre de progression s'affiche
4. Voir les résultats
Une fois le traitement terminé, vous obtenez :
📹 Vidéo Annotée
- Chaque frame annotée avec les bounding boxes
- Compteur de frames
- Player vidéo intégré
📊 Statistiques
- Total frames: Nombre de frames traitées
- FPS: Frames par seconde de la vidéo
- Durée: Durée totale en secondes
- Temps de traitement: Temps pris pour traiter la vidéo
🎯 Résumé des détections
- Nombre total de détections
- Répartition par classe (poubelle_pleine / poubelle_vide)
- Nombre de frames où chaque classe apparaît
5. Télécharger la vidéo annotée
Cliquez sur "Télécharger Vidéo Annotée" pour enregistrer la vidéo avec les annotations.
🔧 Architecture Technique
Backend (API)
Endpoint: POST /api/predict/video
Traitement:
- Reçoit la vidéo uploadée
- Ouvre avec OpenCV (
cv2.VideoCapture) - Pour chaque frame :
- Exécute YOLO inference
- Annote le frame avec bounding boxes
- Ajoute compteur de frames
- Collecte les détections
- Écrit vidéo annotée avec
cv2.VideoWriter - Encode en base64
- Retourne JSON avec vidéo + statistiques
Code API (api.py):
@app.post("/api/predict/video")
async def predict_video(file: UploadFile = File(...)):
# Traitement frame par frame
while cap.isOpened():
ret, frame = cap.read()
if not ret:
break
# Inférence YOLO sur frame
results = model.predict(source=frame, conf=0.25, device='cpu')
annotated_frame = results[0].plot()
# Écrire frame annoté
out.write(annotated_frame)
# Retourner vidéo encodée + stats
return {
"video_base64": video_base64,
"stats": {...},
"detections": [...]
}
Frontend (React)
Composant: VideoPage.jsx
Fonctionnalités:
- React Dropzone pour upload
- Axios pour requête API (timeout 5 minutes)
- Barre de progression simulée
- Décodage base64 → Blob → URL pour lecture
- LocalStorage pour historique
Flow:
- User drop vidéo →
onDrop() - Prévisualisation avec
<video> - Click "Détecter" →
handleDetect() - POST
/api/predict/videoavec FormData - Affichage résultats + vidéo annotée
- Download via blob URL
⚡ Optimisations Possibles
1. Traitement par lots de frames
Au lieu de traiter frame par frame, traiter par batch de 10-30 frames :
batch_frames = []
for i in range(batch_size):
ret, frame = cap.read()
if ret:
batch_frames.append(frame)
# Inférence sur batch
results = model.predict(source=batch_frames, batch=True)
2. Réduire la résolution
Redimensionner les frames avant inférence :
frame_resized = cv2.resize(frame, (640, 480))
results = model.predict(source=frame_resized)
3. Sauter des frames (frame skipping)
Ne traiter que 1 frame sur N :
skip_frames = 2 # Traiter 1 frame sur 3
if frame_count % skip_frames == 0:
results = model.predict(source=frame)
4. GPU Acceleration
Si disponible, utiliser GPU :
model.to('cuda') # Au lieu de 'cpu'
results = model.predict(source=frame, device='cuda')
5. Codec H.264 (plus efficace)
Utiliser codec H.264 au lieu de mp4v :
fourcc = cv2.VideoWriter_fourcc(*'H264') # ou 'avc1', 'x264'
6. WebSocket pour progression en temps réel
Au lieu de simuler, envoyer vraie progression :
# Backend
from fastapi import WebSocket
@app.websocket("/ws/video_progress")
async def websocket_endpoint(websocket: WebSocket):
await websocket.accept()
# Envoyer progression pendant traitement
await websocket.send_json({"progress": frame_count / total_frames})
7. Celery pour tâches asynchrones
Pour vidéos longues, utiliser Celery :
from celery import Celery
celery = Celery('tasks', broker='redis://localhost:6379')
@celery.task
def process_video(video_path):
# Traitement long
pass
# API retourne task_id
# Frontend poll status avec GET /task/{task_id}
📊 Performances Attendues
Exemple avec vidéo 30s @ 30 FPS
Spécifications:
- Durée: 30 secondes
- FPS: 30
- Total frames: 900
- Résolution: 1920x1080
Sans optimisation (CPU):
- Temps par frame: ~50-100ms
- Temps total: 45-90 secondes
- Ratio: 1.5-3x temps réel
Avec GPU (CUDA):
- Temps par frame: ~10-20ms
- Temps total: 9-18 secondes
- Ratio: 0.3-0.6x temps réel
Avec optimisations (skip 2 frames, résolution 640x480):
- Frames traitées: 300
- Temps par frame: ~30ms
- Temps total: 9 secondes
- Ratio: 0.3x temps réel
🐛 Dépannage
Erreur: "connect ECONNREFUSED 127.0.0.1:8000"
Cause: API backend non démarrée
Solution:
cd /home/mouhammad/Bureau/nourrou/projet-poubelle/trash_full_detection
source .venv/bin/activate
python api.py
Erreur: "Request Timeout"
Cause: Vidéo trop longue, timeout atteint (5 min)
Solutions:
- Augmenter timeout dans
VideoPage.jsx:
timeout: 600000 // 10 minutes
Réduire durée/résolution vidéo
Utiliser frame skipping
Erreur: "File too large"
Cause: Vidéo > 100 MB
Solutions:
- Augmenter limite dans
VideoPage.jsx:
maxSize: 200 * 1024 * 1024 // 200 MB
- Compresser vidéo avec ffmpeg :
ffmpeg -i input.mp4 -vcodec h264 -crf 28 output.mp4
Vidéo annotée ne se télécharge pas
Cause: Erreur décodage base64
Solution: Vérifier que le backend retourne bien video_base64
Test API direct:
curl -X POST "http://localhost:8000/api/predict/video" \
-F "file=@test.mp4" \
-o result.json
# Extraire vidéo
jq -r '.video_base64' result.json | base64 -d > output.mp4
Vidéo noire/corrompue
Cause: Codec incompatible
Solutions:
- Changer codec dans API :
fourcc = cv2.VideoWriter_fourcc(*'XVID') # Tester différents codecs
- Convertir vidéo source :
ffmpeg -i input.mp4 -c:v libx264 -preset fast output.mp4
📝 Exemple d'utilisation avec le notebook
Si vous voulez tester en dehors de l'app web, utilisez le notebook 2_yolo_inference_app.ipynb :
# Cellule : Traitement vidéo
video_path = "chemin/vers/votre/video.mp4"
output_path = "outputs/video/annotated_video.mp4"
cap = cv2.VideoCapture(video_path)
fourcc = cv2.VideoWriter_fourcc(*'mp4v')
out = cv2.VideoWriter(output_path, fourcc, 30, (width, height))
while cap.isOpened():
ret, frame = cap.read()
if not ret:
break
results = model_detect.predict(source=frame, conf=0.25, device='cpu')
annotated = results[0].plot()
out.write(annotated)
cap.release()
out.release()
print(f"Vidéo sauvegardée: {output_path}")
🎯 Résumé
Vous pouvez maintenant :
✅ Uploader des vidéos (MP4, AVI, MOV)
✅ Traiter frame par frame avec YOLO
✅ Voir vidéo annotée avec détections
✅ Télécharger la vidéo annotée
✅ Consulter statistiques détaillées
✅ Historique des vidéos traitées
Endpoints API disponibles :
POST /api/predict/image→ ImagesPOST /api/predict/video→ Vidéos ✨ NOUVEAUGET /api/health→ StatusGET /api/stats→ Métriques modèle
Navigation app :
/→ Accueil/upload→ Images/video→ Vidéos ✨ NOUVEAU/history→ Historique/stats→ Statistiques/about→ À propos
Votre application est maintenant complète avec support Images ET Vidéos ! 🎥🎉