YELY_AI_Module / docs /WORKFLOW.md
danielxdata's picture
Ajoute la doc de soutenance, corrige Vercel->Netlify, bouton stats
6cd05a0
|
Raw
History Blame Contribute Delete
9.89 kB

Workflow — finalisation du module IA YELY

Organisation recommandée pour arriver à un livrable démontrable : tests de type production, suivi des performances, apprentissage continu, documentation complète, interface web de démo, déploiement.

1. Arborescence cible du dépôt

yely_ai_module/
├── app/                    # code de production (déjà en place)
├── models/                 # modèle(s) sérialisé(s) — voir §3 versioning
├── train/                  # scripts d'entraînement (référence)
├── tests/
│   ├── test_postprocess.py     # ✅ fait
│   ├── test_rules.py           # ✅ fait
│   ├── test_api.py              # ✅ fait (mocké)
│   ├── test_monitoring.py       # ✅ fait (feedback + métriques + endpoints)
│   └── test_integration.py      # à lancer : vrai modèle, vraies images
├── tools/
│   └── check_seen_image.py      # ✅ fait
├── monitoring/                  # ✅ fait — §2
│   ├── metrics.py                 # ✅ agrégation logs/api.log (succès, confiance, blocages)
│   └── feedback.py                 # ✅ collecte + conversion des corrections pompiste
├── docs/                         # ✅ fait — §4
│   ├── WORKFLOW.md                # ce fichier
│   ├── LIMITATIONS.md             # ✅ fait
│   ├── ARCHITECTURE.md            # ✅ fait
│   ├── PREPROCESSING.md           # ✅ fait
│   ├── RECOGNIZER.md              # ✅ fait
│   ├── POSTPROCESS_RULES.md       # ✅ fait
│   ├── API.md                     # ✅ fait
│   └── MONITORING.md              # ✅ fait
├── web/                           # ✅ fait — §5, interface de démo
│   ├── index.html                 # démo /analyze
│   ├── stats.html                 # tableau de bord /metrics + /failures (soutenance)
│   ├── feedback.html              # correction d'une lecture (préremplie depuis stats.html)
│   └── config.js
└── requirements.txt

2. Tests "comme en production"

Objectif : valider le comportement réel, pas seulement la logique unitaire.

  1. Test d'intégration avec le vrai modèle (tests/test_integration.py) : envoyer une vraie photo à recognize_screen (pas de mock), vérifier que la réponse a la bonne forme et un temps de réponse mesuré.
  2. Test API bout-en-bout : lancer uvicorn, envoyer une requête HTTP réelle via httpx/curl, sur 3-5 photos couvrant les scénarios du cahier des charges (§14) : nette/cohérente, floue, incohérente, montant seul, litres seuls.
  3. Test de charge léger : mesurer le temps de réponse sur 10 requêtes séquentielles (le modèle doit rester chargé en mémoire entre les requêtes — vérifier qu'il n'y a pas de rechargement).
  4. Rapport de test (§15 du cahier des charges) : générer un tableau photo → attendu → obtenu → écart, à partir des images du dossier Images datasetdiversifié/ (celles non utilisées à l'entraînement).

3. Suivi des performances + apprentissage continu

Suivi (monitoring/)

  • Chaque appel à /analyze log déjà la requête/réponse dans logs/api.log. À ajouter : un identifiant de version du modèle (model_version) dans chaque entrée, pour pouvoir comparer les performances entre versions.
  • monitoring/metrics.py : script qui parcourt logs/api.log et calcule périodiquement : taux de succès, distribution des confidence_score, taux de blocage par cause (floue/incohérence/confiance).

Apprentissage continu (boucle de feedback)

Le principe : chaque photo traitée par l'API est déjà sauvegardée (photos/<uuid>.jpg). Il manque la boucle qui transforme ces photos en nouvelles données d'entraînement :

  1. Endpoint de correction (POST /feedback) : le pompiste (ou un contrôle a posteriori côté YELY) envoie transaction_id + les valeurs réellement correctes. Stocké dans monitoring/feedback.jsonl.
  2. Script de conversion (monitoring/feedback.py) : transforme les entrées corrigées en nouvelles entrées annotations.json (même format que l'annotation manuelle), en réutilisant photos/<uuid>.jpg comme image source.
  3. Ré-entraînement périodique : relancer split_lines.py → prepare_doctr_dataset.py → finetune_doctr.py quand un nombre suffisant de nouvelles corrections est accumulé (ex. tous les 50). Important (retenu de cette session) : ne jamais modifier le dataset pendant qu'un entraînement tourne (lecture disque à la volée) ; toujours nettoyer dataset_lines//dataset_doctr/ avant de régénérer (déjà corrigé).
  4. Versioning des modèles : chaque nouveau modèle entraîné va dans models/v<N>/, avec son propre history.json. Le modèle "actif" utilisé par l'API est un lien/chemin configurable (CRNN_MODEL_PATH en variable d'environnement), pas une réécriture du fichier précédent — pour pouvoir revenir en arrière si une nouvelle version est pire.

4. Documentation (docs/)

Un fichier par aspect, cible = qu'un lecteur qui n'a pas suivi le développement comprenne le rôle et les choix de chaque module :

  • ARCHITECTURE.md : schéma du pipeline complet (image → écran → lignes → CRNN → postprocess → rules → réponse), et pourquoi ce découpage.
  • PREPROCESSING.md : détection d'écran, découpage en lignes, limites connues (cas où la détection choisit la mauvaise zone — voir l'incident du bandeau de marque confondu avec l'écran).
  • RECOGNIZER.md : choix du CRNN, format d'entrée/sortie, le bug resize corrigé et pourquoi c'était important.
  • POSTPROCESS_RULES.md : normalisation numérique, règle de priorité fuel_price configuré > lu à l'écran, moteur de règles de blocage.
  • API.md : contrat de l'endpoint, exemples de requêtes/réponses.
  • MONITORING.md : comment lire les logs, comment fonctionne la boucle de feedback.
  • LIMITATIONS.md : déjà fait — diversité du dataset, précision actuelle.

5. Interface web de démo

Objectif : une page simple, présentable en soutenance, qui appelle l'API et affiche le résultat de façon lisible pour un non-développeur (le formulaire technique test_api_form.html existant sert de base, mais mérite une version "présentation" séparée : moins de champs bruts, plus visuelle).

Contenu minimal :

  • Upload/prise de photo (accepte l'appareil photo sur mobile via capture="environment").
  • Choix du prix du litre (pré-rempli, modifiable).
  • Affichage : bannière succès/bloqué, valeurs détectées, calculées, statut de cohérence — pas le JSON brut par défaut (accessible en option).
  • Appel vers l'URL de l'API configurée (variable d'environnement au build).

6. Déploiement

Frontend (web/) → Netlify : parfaitement adapté (fichiers statiques, pas de build nécessaire), pas de souci particulier.

API IA → PAS d'hébergement serverless classique (Vercel, Netlify Functions...). Point d'attention important avant d'aller plus loin : ce type d'hébergement limite la taille du build (souvent ~250 Mo décompressés) et le temps d'exécution par requête. Cette API embarque PyTorch + doctr + OpenCV, qui dépassent déjà largement cette taille à eux seuls, et l'inférence CRNN prend actuellement 60-100+ secondes par image (bien au-delà des temps d'exécution autorisés, même sur les plans payants). Déployer tel quel sur ce type de plateforme échouera au build ou au timeout, pas juste "sera lent".

Décision retenue : Hugging Face Spaces (Docker SDK) pour l'API. Gratuit, pensé pour les démos ML, pas de limite stricte de temps d'exécution comme un hébergement serverless, Dockerfile déjà préparé (yely_ai_module/Dockerfile).

Étapes de déploiement (à faire manuellement, action externe) : 1. Créer un Space sur huggingface.co → SDK "Docker" → visibilité au choix. 2. Ajouter en tête de yely_ai_module/README.md le bloc de configuration attendu par HF Spaces : ```yaml

title: YELY AI Module emoji: ⛽ colorFrom: blue colorTo: green sdk: docker app_port: 7860

3. Pousser le contenu de `yely_ai_module/` (avec `models/crnn_fuel_pump_best.pt`
inclus) vers le dépôt git du Space.
4. Noter l'URL publique du Space (`https://<user>-<space>.hf.space`) — c'est
l'URL que le frontend Netlify appellera pour `/analyze`.
5. Ajouter `CORSMiddleware` dans `app/main.py` pour autoriser le domaine
Netlify du frontend (sinon le navigateur bloquera les réponses).
6. (Optionnel, payant) Activer le **stockage persistant** du Space et
définir la variable d'environnement `YELY_DATA_DIR` sur son point de
montage — sans quoi `photos/`, `logs/` et `monitoring/feedback.jsonl`
sont perdus à chaque redémarrage/veille du Space. Voir
`docs/MONITORING.md` §3 pour la marche à suivre complète et l'impact si
on s'en passe pour la démo.

## 7. Ordre d'exécution recommandé (vu le délai serré)

1. Terminer l'entraînement en cours, figer le modèle livré.
2. Tests d'intégration réels (§2.1-2.2) — valide que tout fonctionne
vraiment avant de documenter/déployer.
3. Interface web de démo (§5) branchée sur l'API en local — utilisable pour
répéter la démo même sans déploiement cloud.
4. Documentation (§4) — peut se faire en parallèle du reste.
5. Déploiement (§6) — une fois l'hébergement de l'API décidé.
6. Monitoring/apprentissage continu (§3) — le plus gros morceau, à
présenter comme "conçu et partiellement implémenté" si le temps manque
(c'est un livrable attendu — §8.6/§15 — mais l'essentiel du temps
restant doit sécuriser une démo qui fonctionne).