FEAT: Inférence YOLO/ONNX dans l'agent (FrameAnalyzerService réel) #2

Closed
opened 2026-08-10 21:02:17 +02:00 by nonobis · 1 comment
Owner

🎯 Contexte

FrameAnalyzerService.RunInference est un stub qui retourne []. Le package Microsoft.ML.OnnxRuntime n'est pas référencé. Aucune détection d'objet n'est produite — toute la chaîne IA de la plateforme est un squelette.

📚 Référence spec (MASTER_SPECIFICATION.md v2.0)

Phase 16 — IA Pipeline

  • YOLOv8 nano sur CPU (ONNX Runtime, intraOpNumThreads=2)
  • CameraDetectionProfile.YoloModel = "yolov8n" (défaut), MinConfidence = 0.4
  • Flux : snapshot JPEG → decode → resize 640×640 → normalisation → inférence ONNX → parsing tenseur (1×84×8400) → NMS → DetectionResult
  • COCO filtré aux classes utiles (person, vehicle, animal, package)
  • Mode passthrough si modèle absent (pas de crash)

🔍 État actuel (vérifié dans le code)

FrameAnalyzerService : queue bornée Channel (16, DropWrite), mode passthrough si models/yolov8m.onnx absent (MODEL_PATH), COCO 80 classes embarquées, WaitAsync(ct). RunInference → return [] (placeholder). Le service n'est pas enregistré dans le DI.

🧩 À faire

  • Ajouter Microsoft.ML.OnnxRuntime au projet agent
  • Implémenter decode JPEG → resize 640×640 → normalize → inférence
  • Parser le tenseur de sortie YOLOv8 (1×84×8400) + NMS
  • Filtrer les classes selon CameraDetectionProfile (person/vehicle/animal/package)
  • Respecter MinConfidence
  • Enregistrer le service dans le DI + intégrer au pipeline de l'agent
  • Embarquer le modèle yolov8n.onnx dans l'image Docker (Dockerfile.agent)

🧪 Critères d'acceptation

  • Une inférence réelle retourne des detections (pas []) avec un modèle présent
  • Passthrough OK sans modèle
  • intraOpNumThreads=2, queue DropWrite conservée
  • Tests d'inférence avec un petit modèle de test

📁 Fichiers concernés

src/Heimdall.Agent/Services/FrameAnalyzerService.cs, src/Heimdall.Agent/Heimdall.Agent.csproj, docker/Dockerfile.agent, tests/Heimdall.Agent.Tests/

📝 Notes (mise à jour 12/08/2026 — mutualisation GPU)

  • Support GPU à prévoir dès le départ : Microsoft.ML.OnnxRuntime.Gpu (CUDA pour NVIDIA) ; alternatives DirectML (AMD/Windows) et OpenVINO (Intel/iGPU) via Execution Providers — le backend choisi dépend de la machine (cf. ticket #77 docker GPU).
  • Ce service est le socle du worker GPU distant (ticket #76) : l'agent consommateur exécute les jobs du broker avec le même FrameAnalyzerService. L'implémentation doit rester derrière une abstraction (IInferenceEngine) réutilisable en local ET en mode worker.
  • La voie .NET pur (ONNX Runtime) est le backend unique de l'IA (cf. ticket #4 : circuit breaker générique).
## 🎯 Contexte `FrameAnalyzerService.RunInference` est un **stub** qui retourne `[]`. Le package `Microsoft.ML.OnnxRuntime` n'est pas référencé. Aucune détection d'objet n'est produite — toute la chaîne IA de la plateforme est un squelette. ## 📚 Référence spec (MASTER_SPECIFICATION.md v2.0) **Phase 16 — IA Pipeline** - YOLOv8 nano sur CPU (ONNX Runtime, `intraOpNumThreads=2`) - `CameraDetectionProfile.YoloModel` = "yolov8n" (défaut), `MinConfidence` = 0.4 - Flux : snapshot JPEG → decode → resize 640×640 → normalisation → inférence ONNX → parsing tenseur (1×84×8400) → NMS → `DetectionResult` - COCO filtré aux classes utiles (person, vehicle, animal, package) - Mode passthrough si modèle absent (pas de crash) ## 🔍 État actuel (vérifié dans le code) `FrameAnalyzerService` : queue bornée Channel (16, `DropWrite`), mode passthrough si `models/yolov8m.onnx` absent (`MODEL_PATH`), COCO 80 classes embarquées, `WaitAsync(ct)`. `RunInference` → `return []` (placeholder). Le service n'est pas enregistré dans le DI. ## 🧩 À faire - [ ] Ajouter `Microsoft.ML.OnnxRuntime` au projet agent - [ ] Implémenter decode JPEG → resize 640×640 → normalize → inférence - [ ] Parser le tenseur de sortie YOLOv8 (1×84×8400) + NMS - [ ] Filtrer les classes selon `CameraDetectionProfile` (person/vehicle/animal/package) - [ ] Respecter `MinConfidence` - [ ] Enregistrer le service dans le DI + intégrer au pipeline de l'agent - [ ] Embarquer le modèle yolov8n.onnx dans l'image Docker (`Dockerfile.agent`) ## 🧪 Critères d'acceptation - [ ] Une inférence réelle retourne des detections (pas `[]`) avec un modèle présent - [ ] Passthrough OK sans modèle - [ ] `intraOpNumThreads=2`, queue `DropWrite` conservée - [ ] Tests d'inférence avec un petit modèle de test ## 📁 Fichiers concernés src/Heimdall.Agent/Services/FrameAnalyzerService.cs, src/Heimdall.Agent/Heimdall.Agent.csproj, docker/Dockerfile.agent, tests/Heimdall.Agent.Tests/ ## 📝 Notes (mise à jour 12/08/2026 — mutualisation GPU) - **Support GPU à prévoir dès le départ** : `Microsoft.ML.OnnxRuntime.Gpu` (CUDA pour NVIDIA) ; alternatives DirectML (AMD/Windows) et OpenVINO (Intel/iGPU) via Execution Providers — le backend choisi dépend de la machine (cf. ticket #77 docker GPU). - **Ce service est le socle du worker GPU distant (ticket #76)** : l'agent consommateur exécute les jobs du broker avec le même `FrameAnalyzerService`. L'implémentation doit rester derrière une abstraction (`IInferenceEngine`) réutilisable en local ET en mode worker. - La voie .NET pur (ONNX Runtime) est le backend unique de l'IA (cf. ticket #4 : circuit breaker générique).
Author
Owner

Mise à jour (08/2026) : le service est désormais enregistré dans le DI et branché sur le pipeline de capture (Fixes #1). Le cœur du ticket reste valide : RunInference est toujours un stub retournant [], ONNX Runtime absent, et les frames passent réellement par AnalyzeFrameAsync sans produire de détection.

Mise à jour (08/2026) : le service **est désormais enregistré dans le DI** et branché sur le pipeline de capture (Fixes #1). Le cœur du ticket reste valide : RunInference est toujours un stub retournant [], ONNX Runtime absent, et les frames passent réellement par AnalyzeFrameAsync sans produire de détection.
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
nonobis/Heimdall#2
No description provided.