Architecture : Inférence par Batch Distribuée
Le Système de Vision FirstBreath est conçu pour résoudre un problème critique d'évolutivité : Les threads Python ne peuvent pas gérer efficacement les boucles d'inférence IA lourdes en parallèle à cause du GIL (Global Interpreter Lock).
Pour contourner cela, nous avons implémenté un pipeline Producteur-Consommateur utilisant Redis comme courtier (broker) haute vitesse.
Le Pipeline en 3 Étapes
1. 📷 Camera Manager (Le Producteur)
- Service :
services/camera-manager - Rôle : Lié aux E/S (I/O Bound)
- Logique :
- Se connecte aux flux RTSP via OpenCV (Décodé matériellement).
- Redimensionne les images à la taille d'entrée du modèle (640x640) immédiatement.
- Sérialise les images (Binaire/JPEG) et les pousse dans la liste Redis
batch_frames.
- Pourquoi ? : Garde les opérations lourdes d'E/S loin du processus GPU. Peut s'adapter horizontalement (plusieurs managers pour des centaines de caméras).
2. 🧠 Batch Inference (Le Worker)
- Service :
services/batch-inference - Rôle : Lié au Calcul (GPU Bound)
- Logique :
- Récupère N images de Redis en une fois (Batching Dynamique).
- Construit un Tensor unique
[BatchSize, 3, 640, 640]. - Exécute l'inférence une seule fois sur le GPU.
- Sépare les résultats par ID de caméra.
- Pousse les boîtes englobantes brutes vers
batch_results.
- Performance : Augmente le débit de ~400% par rapport au traitement séquentiel.
3. ⚙️ Redis Worker (Le Logicien)
- Service :
services/redis-worker - Rôle : Lié au CPU / Logique
- Logique :
- Consomme les résultats de détection.
- Post-traitement : Suppression des non-maxima (NMS), filtrage de faible confiance.
- Logique Métier : "Le cheval est-il couché ?", "Bouge-t-il trop vite ?".
- Lissage : Applique des filtres à fenêtre glissante pour éviter les faux positifs.
- Persistance : Envoie des alertes au Backend.
Technologies Clés
🚀 TensorRT & YOLOv11
Nous utilisons ONNX Runtime (GPU) avec le fournisseur TensorRT. Le modèle YOLOv11 est exporté avec le support de taille de batch dynamique pour permettre le traitement de 1 à 32 caméras en une seule passe.
⚡ Redis & Serialization
Pour atteindre une latence minimale (<50ms) :
- Les images sont encodées en JPEG (Qualité 85) avant transmission pour réduire la bande passante.
- Redis est configuré comme un stockage éphémère en mémoire (pas de persistance pour les files d'attente d'images).