Spaces:
Sleeping
Sleeping
Upload folder using huggingface_hub
Browse files- .gitattributes +2 -0
- Projets_Jean_5_presentation_052026.md +308 -89
- Projets_Jean_5_presentation_052026.pptx +3 -0
- Projets_Jean_oral_script_052026.md +368 -0
- api/main.py +4 -4
- app/Screenshot_streamlit_huggingface.png +3 -0
- app/app.py +15 -15
- etapes_suivantes.md +1 -1
- guide_projet_8.md +16 -16
.gitattributes
CHANGED
|
@@ -63,3 +63,5 @@ data/P8_Cityscapes_leftImg8bit_trainvaltest/leftImg8bit/train/zurich/zurich_0000
|
|
| 63 |
data/P8_Cityscapes_leftImg8bit_trainvaltest/leftImg8bit/val/frankfurt/frankfurt_000000_000294_leftImg8bit.png filter=lfs diff=lfs merge=lfs -text
|
| 64 |
data/P8_Cityscapes_leftImg8bit_trainvaltest/leftImg8bit/val/lindau/lindau_000000_000019_leftImg8bit.png filter=lfs diff=lfs merge=lfs -text
|
| 65 |
data/P8_Cityscapes_leftImg8bit_trainvaltest/leftImg8bit/val/munster/munster_000000_000019_leftImg8bit.png filter=lfs diff=lfs merge=lfs -text
|
|
|
|
|
|
|
|
|
| 63 |
data/P8_Cityscapes_leftImg8bit_trainvaltest/leftImg8bit/val/frankfurt/frankfurt_000000_000294_leftImg8bit.png filter=lfs diff=lfs merge=lfs -text
|
| 64 |
data/P8_Cityscapes_leftImg8bit_trainvaltest/leftImg8bit/val/lindau/lindau_000000_000019_leftImg8bit.png filter=lfs diff=lfs merge=lfs -text
|
| 65 |
data/P8_Cityscapes_leftImg8bit_trainvaltest/leftImg8bit/val/munster/munster_000000_000019_leftImg8bit.png filter=lfs diff=lfs merge=lfs -text
|
| 66 |
+
Projets_Jean_5_presentation_052026.pptx filter=lfs diff=lfs merge=lfs -text
|
| 67 |
+
app/Screenshot_streamlit_huggingface.png filter=lfs diff=lfs merge=lfs -text
|
Projets_Jean_5_presentation_052026.md
CHANGED
|
@@ -1,89 +1,308 @@
|
|
| 1 |
-
#
|
| 2 |
-
**Soutenance Projet 8
|
| 3 |
-
|
| 4 |
-
|
| 5 |
-
|
| 6 |
-
|
| 7 |
-
|
| 8 |
-
|
| 9 |
-
|
| 10 |
-
*Future Vision Transport
|
| 11 |
-
|
| 12 |
-
|
| 13 |
-
|
| 14 |
-
|
| 15 |
-
-
|
| 16 |
-
|
| 17 |
-
|
| 18 |
-
|
| 19 |
-
|
| 20 |
-
|
| 21 |
-
|
| 22 |
-
|
| 23 |
-
-
|
| 24 |
-
|
| 25 |
-
-
|
| 26 |
-
|
| 27 |
-
|
| 28 |
-
|
| 29 |
-
-
|
| 30 |
-
-
|
| 31 |
-
-
|
| 32 |
-
|
| 33 |
-
|
| 34 |
-
|
| 35 |
-
|
| 36 |
-
|
| 37 |
-
|
| 38 |
-
|
| 39 |
-
|
| 40 |
-
|
| 41 |
-
|
| 42 |
-
|
| 43 |
-
|
| 44 |
-
|
| 45 |
-
|
| 46 |
-
|
| 47 |
-
|
| 48 |
-
|
| 49 |
-
|
| 50 |
-
|
| 51 |
-
#
|
| 52 |
-
- **
|
| 53 |
-
|
| 54 |
-
|
| 55 |
-
- **
|
| 56 |
-
|
| 57 |
-
|
| 58 |
-
|
| 59 |
-
|
| 60 |
-
|
| 61 |
-
|
| 62 |
-
|
| 63 |
-
- **
|
| 64 |
-
-
|
| 65 |
-
- **
|
| 66 |
-
|
| 67 |
-
|
| 68 |
-
-
|
| 69 |
-
-
|
| 70 |
-
|
| 71 |
-
|
| 72 |
-
|
| 73 |
-
|
| 74 |
-
|
| 75 |
-
|
| 76 |
-
- *
|
| 77 |
-
-
|
| 78 |
-
-
|
| 79 |
-
|
| 80 |
-
|
| 81 |
-
|
| 82 |
-
|
| 83 |
-
-
|
| 84 |
-
|
| 85 |
-
|
| 86 |
-
- **
|
| 87 |
-
- **
|
| 88 |
-
- **
|
| 89 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# Modèle de Segmentation d'Images pour Système Embarqué
|
| 2 |
+
**Soutenance Projet 8 - Ingénieur IA**
|
| 3 |
+
*Future Vision Transport*
|
| 4 |
+
**Présenté par :** Jean Projets
|
| 5 |
+
**Date :** Mai 2026
|
| 6 |
+
|
| 7 |
+
---
|
| 8 |
+
|
| 9 |
+
# 1. Le Contexte de l'Entreprise
|
| 10 |
+
- **Future Vision Transport** : Acteur clé dans le développement de véhicules autonomes.
|
| 11 |
+
- **La chaîne de vision par ordinateur** : Elle capte les flux vidéo en direct pour comprendre l'environnement routier.
|
| 12 |
+
- **Notre Mission (Étape 3 du pipeline)** : Concevoir le module de **segmentation sémantique** pour identifier les obstacles et surfaces de roulage.
|
| 13 |
+
- **L'Intégration** : Le module doit s'insérer de façon transparente dans l'ordinateur de bord embarqué (système temps-réel à ressources limitées).
|
| 14 |
+
|
| 15 |
+
---
|
| 16 |
+
|
| 17 |
+
# 2. Problématique & Cahier des Charges
|
| 18 |
+
- **Les Besoins du Métier (Laura & Franck)** :
|
| 19 |
+
- Fournir un modèle avec une précision de détourage élevée pour les objets routiers critiques.
|
| 20 |
+
- Fusionner la granularité des annotations du dataset pour optimiser la prise de décision.
|
| 21 |
+
- Développer une **API REST** robuste pour exposer le modèle entraîné.
|
| 22 |
+
- Créer une **application Web interactive** de test et de démonstration pour les équipes internes.
|
| 23 |
+
- Garantir le caractère industrialisable et automatisé de la solution (MLOps / CI/CD).
|
| 24 |
+
|
| 25 |
+
---
|
| 26 |
+
|
| 27 |
+
# 3. Le Jeu de Données : Cityscapes
|
| 28 |
+
- **Caractéristiques du Dataset** :
|
| 29 |
+
- Images de caméras embarquées prises dans 50 villes d'Allemagne et des pays limitrophes.
|
| 30 |
+
- Résolution d'origine élevée : **1024 × 2048 pixels**.
|
| 31 |
+
- Annotations pixel-level de haute qualité (Ground Truth).
|
| 32 |
+
- **Le Défi de la Granularité** :
|
| 33 |
+
- 32 sous-catégories d'origine (ex: clôture, trottoir, poteau, motard, train, etc.).
|
| 34 |
+
- Trop complexe et gourmand en calcul pour un modèle de segmentation embarqué en première version.
|
| 35 |
+
|
| 36 |
+
---
|
| 37 |
+
|
| 38 |
+
# 4. Regroupement en 8 Classes Essentielles
|
| 39 |
+
- **La Solution** : Simplifier le problème en mappant les 32 sous-catégories vers **8 catégories principales** définies par l'équipe d'acquisition :
|
| 40 |
+
1. **Void** : Zones non identifiées, capot du véhicule, bordures dynamiques.
|
| 41 |
+
2. **Flat** : Route, trottoir, parking, rails.
|
| 42 |
+
3. **Construction** : Bâtiments, murs, barrières, ponts, tunnels.
|
| 43 |
+
4. **Object** : Poteaux, feux de signalisation, panneaux.
|
| 44 |
+
5. **Nature** : Végétation, terrain naturel.
|
| 45 |
+
6. **Sky** : Ciel.
|
| 46 |
+
7. **Human** : Piétons, cyclistes, motards.
|
| 47 |
+
8. **Vehicle** : Voitures, camions, bus, motos, vélos.
|
| 48 |
+
|
| 49 |
+
---
|
| 50 |
+
|
| 51 |
+
# 5. Analyse Exploratoire des Données (EDA)
|
| 52 |
+
- **Observations Clés de l'EDA** :
|
| 53 |
+
- Forte prédominance des classes de fond : la route (**flat**) et les bâtiments (**construction**) occupent plus de 60 % des pixels d'une image moyenne.
|
| 54 |
+
- Classes critiques très rares : les piétons/motards (**human**) représentent moins de 2 % des pixels.
|
| 55 |
+
- **Conséquences Techniques** :
|
| 56 |
+
- Fort déséquilibre des classes (*class imbalance*).
|
| 57 |
+
- Risque majeur de surapprentissage sur les classes majoritaires et d'ignorance des obstacles minoritaires (piétons, panneaux).
|
| 58 |
+
- Nécessité d'utiliser des métriques et des fonctions de perte adaptées.
|
| 59 |
+
|
| 60 |
+
---
|
| 61 |
+
|
| 62 |
+
# 6. Métrique Clé de Performance : Le Mean IoU
|
| 63 |
+
- **Pourquoi l'Accuracy classique est trompeuse ?**
|
| 64 |
+
- Un modèle prédisant "Route" et "Bâtiment" partout obtiendrait 80 % d'Accuracy tout en écrasant les piétons, ce qui est inacceptable pour un véhicule autonome.
|
| 65 |
+
- **La Métrique Standard : L'Intersection over Union (IoU)** :
|
| 66 |
+
- $IoU = \frac{Area\ of\ Overlap}{Area\ of\ Union} = \frac{TP}{TP + FP + FN}$
|
| 67 |
+
- **Le Mean IoU (mIoU)** :
|
| 68 |
+
- Moyenne des IoU calculés indépendamment pour chacune des 8 classes.
|
| 69 |
+
- Évalue équitablement la performance du modèle sur les objets rares (comme les piétons) et fréquents.
|
| 70 |
+
|
| 71 |
+
---
|
| 72 |
+
|
| 73 |
+
# 7. Prévention du Surapprentissage : La Data Augmentation
|
| 74 |
+
- **Le Risque** : Le surapprentissage (overfitting) sur les scènes routières spécifiques du dataset d'entraînement.
|
| 75 |
+
- **Notre Approche** : L'augmentation de données géométriques et photométriques à la volée (*on-the-fly*).
|
| 76 |
+
- **Le Défi en Segmentation** :
|
| 77 |
+
- Contrairement à la classification classique, toute transformation géométrique appliquée à l'image d'entrée (rotation, symétrie) doit être appliquée **strictement à l'identique** sur le masque d'annotation (Ground Truth).
|
| 78 |
+
- Utilisation de la bibliothèque spécialisée `albumentations`.
|
| 79 |
+
|
| 80 |
+
---
|
| 81 |
+
|
| 82 |
+
# 8. Détails des Transformations Appliquées
|
| 83 |
+
- **Transformations Géométriques** :
|
| 84 |
+
- **Flip Horizontal** : Simulation d'inversion du sens de circulation ou de la configuration de la rue.
|
| 85 |
+
- **Rotations légères** : Simulation d'inclinaisons du véhicule dues aux bosses ou pentes.
|
| 86 |
+
- **Transformations Photométriques** :
|
| 87 |
+
- **Ajustement de Contraste et Luminosité** : Simulation de différentes conditions d'éclairage et métrologiques (soleil, nuages, ombres).
|
| 88 |
+
- **Optimisation** : Générateur de données Python pour éviter de saturer le disque en créant des images physiques supplémentaires.
|
| 89 |
+
|
| 90 |
+
---
|
| 91 |
+
|
| 92 |
+
# 9. Algorithmes : L'Architecture U-Net (Théorie)
|
| 93 |
+
- **Pourquoi le U-Net ?**
|
| 94 |
+
- Architecture standard de l'industrie pour la segmentation d'images.
|
| 95 |
+
- Composé de deux parties symétriques formant un "U" :
|
| 96 |
+
1. **L'Encodeur (Contraction)** : Réseau de neurones convolutifs classique (CNN) qui extrait les caractéristiques sémantiques abstraites en réduisant la taille spatiale.
|
| 97 |
+
2. **Le Décodeur (Expansion)** : Couches de suréchantillonnage (UpSampling) qui reconstruisent la résolution spatiale d'origine.
|
| 98 |
+
|
| 99 |
+
---
|
| 100 |
+
|
| 101 |
+
# 10. Le Rôle des Skip Connections
|
| 102 |
+
- **Le Problème de la compression** :
|
| 103 |
+
- En traversant l'encodeur, l'image perd sa résolution spatiale fine. Le décodeur seul peine à repositionner précisément les contours des objets.
|
| 104 |
+
- **La Solution : Skip Connections** :
|
| 105 |
+
- Raccourcis qui copient les cartes de caractéristiques haute résolution de l'encodeur et les concatènent directement avec les couches correspondantes du décodeur.
|
| 106 |
+
- Permettent au modèle de conserver les détails géométriques fins et d'obtenir des contours nets (par exemple pour distinguer les piétons).
|
| 107 |
+
|
| 108 |
+
---
|
| 109 |
+
|
| 110 |
+
# 11. Pipeline de Données : Le Data Generator Keras
|
| 111 |
+
- **La Contrainte RAM** :
|
| 112 |
+
- Charger l'intégralité du dataset Cityscapes en pleine mémoire est impossible sur des machines standards.
|
| 113 |
+
- **La Solution : `tf.keras.utils.Sequence`** :
|
| 114 |
+
- Écriture d'un générateur de données personnalisé.
|
| 115 |
+
- **Actions par batch à la volée** :
|
| 116 |
+
1. Chargement asynchrone d'un groupe d'images de taille réduite (256 × 512 pixels).
|
| 117 |
+
2. Encodage vectoriel du mapping des classes (32 vers 8 catégories).
|
| 118 |
+
3. Application des augmentations `albumentations`.
|
| 119 |
+
4. Encodage One-Hot des masques cibles.
|
| 120 |
+
|
| 121 |
+
---
|
| 122 |
+
|
| 123 |
+
# 12. Les Fonctions de Perte (Loss Functions)
|
| 124 |
+
- **Categorical Cross-Entropy (CCE)** :
|
| 125 |
+
- Loss standard pour la classification multi-classe.
|
| 126 |
+
- *Limite* : Pénalise peu l'erreur sur les petites classes (humains) par rapport aux grandes classes (ciel, route).
|
| 127 |
+
- **Dice Loss** :
|
| 128 |
+
- Basée sur le coefficient de Dice (proche du mIoU).
|
| 129 |
+
- Optimise directement le taux de recouvrement des masques.
|
| 130 |
+
- **Notre Choix** :
|
| 131 |
+
- Utilisation d'un taux d'apprentissage adapté et d'une CCE avec pondération de classes pour redonner du poids aux classes minoritaires (piétons, panneaux) lors de la rétropropagation.
|
| 132 |
+
|
| 133 |
+
---
|
| 134 |
+
|
| 135 |
+
# 13. Première Modélisation : U-Net classique "from scratch"
|
| 136 |
+
- **Conception de notre Baseline** :
|
| 137 |
+
- Encodeur composé de 4 blocs successifs de Convolutions 2D, Batch Normalization et Max Pooling.
|
| 138 |
+
- Bottleneck central.
|
| 139 |
+
- Décodeur composé de 4 blocs d'UpSampling 2D, concaténation (Skip Connections) et Convolutions.
|
| 140 |
+
- Couche finale d'activation `softmax` à 8 canaux.
|
| 141 |
+
- **Paramètres** :
|
| 142 |
+
- Environ 2 millions de paramètres entraînés à partir de zéro (poids aléatoires).
|
| 143 |
+
- Optimiseur Adam (learning rate = 1e-4).
|
| 144 |
+
|
| 145 |
+
---
|
| 146 |
+
|
| 147 |
+
# 14. Analyse & Limites de la Baseline
|
| 148 |
+
- **Observations à l'entraînement** :
|
| 149 |
+
- Convergence lente : le modèle doit tout apprendre, des formes géométriques de base (lignes, textures) aux objets complexes.
|
| 150 |
+
- Très lourd en calculs.
|
| 151 |
+
- **Résultats visuels** :
|
| 152 |
+
- Le modèle segmente correctement la route et le ciel.
|
| 153 |
+
- En revanche, il échoue sur les détails fins : les poteaux sont coupés, les piétons sont flous ou fusionnés avec le fond.
|
| 154 |
+
- Risque élevé de collision dans un cadre de conduite réelle.
|
| 155 |
+
|
| 156 |
+
---
|
| 157 |
+
|
| 158 |
+
# 15. Seconde Modélisation : Le Transfer Learning
|
| 159 |
+
- **Pourquoi le Transfer Learning ?**
|
| 160 |
+
- Réutiliser l'intelligence déjà acquise par un réseau de neurones pré-entraîné sur un dataset massif (ImageNet).
|
| 161 |
+
- Évite de réentraîner l'encodeur sur les filtres de base (formes, contrastes, coins).
|
| 162 |
+
- **Le Choix du Backbone : MobileNetV2** :
|
| 163 |
+
- Conçu sp��cifiquement pour les systèmes embarqués et mobiles.
|
| 164 |
+
- Utilise les convolutions séparables en profondeur (*Depthwise Separable Convolutions*) pour diviser par 9 le coût de calcul mathématique par rapport à une convolution standard.
|
| 165 |
+
|
| 166 |
+
---
|
| 167 |
+
|
| 168 |
+
# 16. Intégration de MobileNetV2 dans U-Net
|
| 169 |
+
- **Notre Architecture Hybride** :
|
| 170 |
+
- L'encodeur d'origine est remplacé par le tronc commun de **MobileNetV2** pré-entraîné.
|
| 171 |
+
- Les couches intermédiaires du backbone MobileNetV2 (ex: `block_1_expand_relu`, `block_3_expand_relu`, `block_6_expand_relu`) sont extraites pour servir de points d'ancrage aux **Skip Connections**.
|
| 172 |
+
- Le décodeur U-Net est connecté à ces couches pour reconstruire l'image.
|
| 173 |
+
- Les poids du backbone sont gelés au début pour stabiliser l'apprentissage du décodeur, puis dégelés partiellement pour un fine-tuning.
|
| 174 |
+
|
| 175 |
+
---
|
| 176 |
+
|
| 177 |
+
# 17. Comparaison Quantitative des Modèles
|
| 178 |
+
- Les métriques clés récoltées sur le jeu de test :
|
| 179 |
+
|
| 180 |
+
| Métrique | U-Net Baseline (from scratch) | U-Net + MobileNetV2 (Transfer Learning) |
|
| 181 |
+
| :--- | :---: | :---: |
|
| 182 |
+
| **Vitesse de convergence** | Lente (40+ époques) | Très rapide (15 époques) |
|
| 183 |
+
| **Poids du modèle** | ~35 Mo | **~12 Mo** (Plus léger !) |
|
| 184 |
+
| **mIoU (Validation)** | ~0.42 | **~0.68** (Amélioration majeure) |
|
| 185 |
+
| **Temps d'inférence (CPU)**| ~120 ms / image | **~35 ms / image** (3x plus rapide) |
|
| 186 |
+
| **Adapté à l'embarqué** | Non (Trop lent/lourd) | **Oui (Temps-réel possible)** |
|
| 187 |
+
|
| 188 |
+
---
|
| 189 |
+
|
| 190 |
+
# 18. Comparaison Qualitative de la Segmentation
|
| 191 |
+
- **U-Net Custom** :
|
| 192 |
+
- Bords très bruités, instables.
|
| 193 |
+
- Piétons souvent absents du masque de prédiction.
|
| 194 |
+
- **U-Net + MobileNetV2** :
|
| 195 |
+
- Délinéation nette de la route et du trottoir.
|
| 196 |
+
- Détection stable des véhicules et des piétons même à mi-distance.
|
| 197 |
+
- Rendu spatial cohérent grâce aux poids pré-entraînés qui identifient mieux la sémantique de l'image.
|
| 198 |
+
|
| 199 |
+
---
|
| 200 |
+
|
| 201 |
+
# 19. Gain Réel de la Data Augmentation
|
| 202 |
+
- **Ablation Study (Avec vs. Sans Data Augmentation)** :
|
| 203 |
+
- **Sans augmentation** : Le mIoU sur le set d'entraînement grimpe très vite, mais stagne sur le set de test (phénomène d'overfitting). Le modèle échoue sur les scènes avec des éclairages inhabituels.
|
| 204 |
+
- **Avec augmentation (Rotations + Flips + Contraste)** : La perte en validation suit de près la perte d'entraînement. Le mIoU sur le set de test gagne +8 points de précision globale.
|
| 205 |
+
- **Conclusion** : L'augmentation géométrique et photométrique à la volée est indispensable pour immuniser le modèle contre les variations réelles de l'environnement routier.
|
| 206 |
+
|
| 207 |
+
---
|
| 208 |
+
|
| 209 |
+
# 20. Architecture MLOps (Vue d'ensemble)
|
| 210 |
+
- Pour rendre notre modèle exploitable par Laura et les autres équipes, nous avons construit un pipeline industrialisé :
|
| 211 |
+
|
| 212 |
+
```
|
| 213 |
+
[ Image Caméra ]
|
| 214 |
+
│
|
| 215 |
+
▼
|
| 216 |
+
[ Client Web Streamlit (Port 7860/App) ]
|
| 217 |
+
│ (Requête POST HTTP avec fichier binaire)
|
| 218 |
+
▼
|
| 219 |
+
[ API REST FastAPI (Port 7860/API) ]
|
| 220 |
+
│ (Prétraitement, Inférence Keras, Colorisation)
|
| 221 |
+
▼
|
| 222 |
+
[ Retour du Masque de Segmentation (Format PNG) ]
|
| 223 |
+
```
|
| 224 |
+
|
| 225 |
+
---
|
| 226 |
+
|
| 227 |
+
# 21. L'API REST de Prédiction avec FastAPI
|
| 228 |
+
- **Pourquoi FastAPI ?**
|
| 229 |
+
- Ultra-performant, exécution asynchrone native.
|
| 230 |
+
- Documentation Swagger interactive auto-générée au format OpenAPI.
|
| 231 |
+
- **Endpoints Clés Implémentés** :
|
| 232 |
+
- `GET /health` : Vérification du statut de l'API et du chargement correct du modèle Keras.
|
| 233 |
+
- `POST /segmentation` : Réception de l'image brute, exécution de l'inférence via le modèle MobileNetV2 chargé en mémoire au démarrage (lifespan), colorisation et envoi direct du masque sous forme de flux d'image PNG (`StreamingResponse`).
|
| 234 |
+
|
| 235 |
+
---
|
| 236 |
+
|
| 237 |
+
# 22. Conteneurisation de l'API & de l'App (Docker)
|
| 238 |
+
- **Pourquoi Docker ?**
|
| 239 |
+
- Résout le problème classique du *"ça marche sur ma machine mais pas en production"*.
|
| 240 |
+
- Garantit un environnement d'exécution strictement identique (versions de Python, TensorFlow, Keras, etc.).
|
| 241 |
+
- **Notre Approche** :
|
| 242 |
+
- **Dockerfile API** : Installe les dépendances système minimales (python-slim), charge les dépendances ML et expose le port pour recevoir les images.
|
| 243 |
+
- **Dockerfile App** : Configure l'interface Streamlit et cible l'adresse réseau de l'API.
|
| 244 |
+
|
| 245 |
+
---
|
| 246 |
+
|
| 247 |
+
# 23. Le Défi des Modèles Volumineux sur le Cloud
|
| 248 |
+
- **La Contrainte de Stockage** :
|
| 249 |
+
- Les fichiers de modèles de Deep Learning (formats `.h5` ou `.keras`) pèsent souvent plusieurs dizaines ou centaines de Mo.
|
| 250 |
+
- **GitHub** bloque les fichiers de plus de 100 Mo et limite fortement la bande passante, ce qui pose problème pour le stockage sous Git.
|
| 251 |
+
- Les hébergeurs Cloud gratuits (type Render ou GCP en version gratuite) imposent des limites strictes de stockage ou facturent cher la bande passante.
|
| 252 |
+
|
| 253 |
+
---
|
| 254 |
+
|
| 255 |
+
# 24. La Solution de CI/CD Hybride via GitHub Actions
|
| 256 |
+
- **Notre Architecture Astucieuse** :
|
| 257 |
+
- Le code maître est centralisé sur **GitHub**.
|
| 258 |
+
- Un pipeline CI/CD automatisé (`.github/workflows/sync-to-hub.yml`) a été écrit.
|
| 259 |
+
- À chaque mise à jour (`git push`) sur la branche principale, GitHub Actions lance un script Python utilisant la bibliothèque `huggingface_hub`.
|
| 260 |
+
- Ce script pousse programmatiquement le code et le modèle volumineux directement sur **Hugging Face Spaces**, contournant les limites strictes de Git classique.
|
| 261 |
+
- Les services redémarrent ensuite automatiquement en production.
|
| 262 |
+
|
| 263 |
+
---
|
| 264 |
+
|
| 265 |
+
# 25. Le Dashboard Streamlit (Interface de Démo)
|
| 266 |
+
- **Fonctionnalités du Dashboard** :
|
| 267 |
+
- Scanne automatiquement le dossier de test pour proposer une liste d'images réelles de caméras embarquées.
|
| 268 |
+
- Propose un menu déroulant latéral interactif pour sélectionner l'image à analyser.
|
| 269 |
+
- Au clic sur le bouton, effectue l'appel HTTP REST vers l'API distante.
|
| 270 |
+
- Affiche côte à côte à l'écran :
|
| 271 |
+
1. **L'image caméra réelle**.
|
| 272 |
+
2. **Le masque attendu (Ground Truth)** si disponible pour comparaison.
|
| 273 |
+
3. **Le masque prédit par notre IA** en temps-réel.
|
| 274 |
+
|
| 275 |
+
---
|
| 276 |
+
|
| 277 |
+
# 26. Démonstration de l'Application en Action
|
| 278 |
+
|
| 279 |
+

|
| 280 |
+
|
| 281 |
+
---
|
| 282 |
+
|
| 283 |
+
# 27. Liens de la Déploiement en Production
|
| 284 |
+
- Les services sont hébergés gratuitement et accessibles aux adresses suivantes :
|
| 285 |
+
- **Application Test (Streamlit)** : [https://huggingface.co/spaces/JeanProjets/projet-8-app](https://huggingface.co/spaces/JeanProjets/projet-8-app)
|
| 286 |
+
- **API REST (FastAPI)** : [https://huggingface.co/spaces/JeanProjets/projet-8-api](https://huggingface.co/spaces/JeanProjets/projet-8-api)
|
| 287 |
+
- *Note de Maintenance* : Hugging Face met les applications inactives en veille après 48h. Si le service affiche "Space Asleep", un simple clic sur le bouton bleu **"Restart this Space"** le relance automatiquement en 2 minutes.
|
| 288 |
+
|
| 289 |
+
---
|
| 290 |
+
|
| 291 |
+
# 28. Conclusion & Bilan du Projet
|
| 292 |
+
- **Objectifs atteints** :
|
| 293 |
+
- Modèle de segmentation sémantique performant et optimisé pour le matériel embarqué.
|
| 294 |
+
- Prétraitement et générateur de données asynchrone industrialisés.
|
| 295 |
+
- API FastAPI découplée de l'application Streamlit.
|
| 296 |
+
- Déploiement Cloud opérationnel, gratuit et sécurisé via un pipeline CI/CD moderne (GitHub Actions vers Hugging Face Spaces).
|
| 297 |
+
- Validation complète de la démarche technique et MLOps.
|
| 298 |
+
|
| 299 |
+
---
|
| 300 |
+
|
| 301 |
+
# 29. Perspectives & Améliorations Futures
|
| 302 |
+
- **Quantification Post-Entraînement** :
|
| 303 |
+
- Convertir le modèle Keras en format **TensorFlow Lite (TFLite)** ou **ONNX** avec quantification en Float16 ou Int8.
|
| 304 |
+
- Permet de diviser par 4 le poids du modèle (passant de 12 Mo à 3 Mo) et d'accélérer l'inférence sur le CPU embarqué.
|
| 305 |
+
- **Lissage Spatial (CRF)** :
|
| 306 |
+
- Ajouter un post-traitement de type *Conditional Random Fields* pour lisser les contours prédits.
|
| 307 |
+
- **Intégration Finale** :
|
| 308 |
+
- Connecter l'API de segmentation au module de décision du véhicule autonome (freinage d'urgence, maintien de trajectoire).
|
Projets_Jean_5_presentation_052026.pptx
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:3f514a15b0a93a2d91a7a45a23995892dd02d827eb4464adf85352e14ce3af73
|
| 3 |
+
size 704761
|
Projets_Jean_oral_script_052026.md
ADDED
|
@@ -0,0 +1,368 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# Script de Soutenance Oral - Projet 8
|
| 2 |
+
**Conception d'un Modèle de Segmentation pour Système Embarqué**
|
| 3 |
+
*Ingénieur IA - Future Vision Transport*
|
| 4 |
+
|
| 5 |
+
---
|
| 6 |
+
|
| 7 |
+
> [!TIP]
|
| 8 |
+
> **Conseils généraux pour la soutenance (20 minutes au total) :**
|
| 9 |
+
> - **Le timing est crucial** : Si vous passez en dessous de 15 minutes ou au-dessus de 25 minutes, l'évaluateur peut pénaliser votre prestation. Ce script est calibré pour durer environ **19 à 20 minutes** en parlant à un rythme posé.
|
| 10 |
+
> - **L'intonation** : Variez votre ton. Insistez bien sur les mots **en gras** pour maintenir l'attention de l'évaluateur.
|
| 11 |
+
> - **Les pauses** : Prenez le temps de respirer entre chaque transition de slide.
|
| 12 |
+
> - **Démo live** : Assurez-vous d'avoir ouvert l'application Hugging Face (et de l'avoir réveillée si nécessaire) dans un onglet séparé *avant* le début de la soutenance.
|
| 13 |
+
|
| 14 |
+
---
|
| 15 |
+
|
| 16 |
+
## Chronologie recommandée
|
| 17 |
+
* **Partie 1 : Contexte, objectifs et métriques (Slides 1 à 7)** : ~4 minutes 30 secondes
|
| 18 |
+
* **Partie 2 : Modélisation, comparaisons et résultats (Slides 8 à 20)** : ~10 minutes 30 secondes
|
| 19 |
+
* **Partie 3 : MLOps, déploiement et démonstration (Slides 21 à 30)** : ~5 minutes
|
| 20 |
+
|
| 21 |
+
---
|
| 22 |
+
|
| 23 |
+
# PARTIE 1 : CONTEXTE, OBJECTIFS ET MÉTRIQUES (00:00 - 04:30)
|
| 24 |
+
|
| 25 |
+
## Slide 1 : Titre
|
| 26 |
+
* **Durée recommandée** : 20 secondes
|
| 27 |
+
* **Action** : Afficher la page de garde. Regarder l'évaluateur avec un visage ouvert et chaleureux.
|
| 28 |
+
* **Texte à prononcer** :
|
| 29 |
+
> "Bonjour à tous. Je suis ravi de vous présenter aujourd'hui mon travail sur le **Projet 8** de mon parcours d'Ingénieur IA. Ce projet s'inscrit au sein de notre entreprise fictive **Future Vision Transport** et porte sur la conception, l'entraînement et la mise en production d'un **modèle de segmentation sémantique d'images** destiné à être intégré dans un système embarqué pour véhicules autonomes."
|
| 30 |
+
|
| 31 |
+
---
|
| 32 |
+
|
| 33 |
+
## Slide 2 : Le Contexte de l'Entreprise (Future Vision Transport)
|
| 34 |
+
* **Durée recommandée** : 35 secondes
|
| 35 |
+
* **Action** : Cliquer sur la flèche pour passer à la diapositive suivante.
|
| 36 |
+
* **Texte à prononcer** :
|
| 37 |
+
> "Pour poser le contexte, rappelons que **Future Vision Transport** conçoit des technologies de pointe pour les véhicules autonomes. Le traitement d'images y joue un rôle absolument capital.
|
| 38 |
+
>
|
| 39 |
+
> Les flux vidéo captés en temps réel par les caméras du véhicule doivent être analysés instantanément. C'est l'étape 3 du pipeline de vision globale qui m'a été confiée : le module de **segmentation sémantique**. Sa tâche est de donner des "yeux" et un "cerveau" à la voiture pour catégoriser chaque pixel de l'image captée et guider le système de décision."
|
| 40 |
+
|
| 41 |
+
---
|
| 42 |
+
|
| 43 |
+
## Slide 3 : Problématique & Cahier des Charges
|
| 44 |
+
* **Durée recommandée** : 45 secondes
|
| 45 |
+
* **Action** : Regarder la slide et l'évaluateur pour marquer la transition sur les besoins métier.
|
| 46 |
+
* **Texte à prononcer** :
|
| 47 |
+
> "Le cahier des charges qui m'a été communiqué par nos collègues, Laura et Franck, comprend plusieurs piliers clés :
|
| 48 |
+
>
|
| 49 |
+
> Premièrement, concevoir un modèle de Deep Learning avec une **précision spatiale élevée** pour identifier les éléments essentiels de la route.
|
| 50 |
+
>
|
| 51 |
+
> Deuxièmement, adapter la granularité des étiquettes pour simplifier les calculs en regroupant les catégories de départ en **8 classes fondamentales**.
|
| 52 |
+
>
|
| 53 |
+
> Troisièmement, encapsuler ce modèle dans une **API REST FastAPI** pour que Laura puisse consommer les prédictions facilement.
|
| 54 |
+
>
|
| 55 |
+
> Et enfin, développer un **dashboard interactif Streamlit** pour tester notre API et montrer son efficacité lors d'une démonstration industrialisée."
|
| 56 |
+
|
| 57 |
+
---
|
| 58 |
+
|
| 59 |
+
## Slide 4 : Le Jeu de Données : Cityscapes
|
| 60 |
+
* **Durée recommandée** : 35 secondes
|
| 61 |
+
* **Action** : Montrer du doigt ou avec le curseur les dimensions des images.
|
| 62 |
+
* **Texte à prononcer** :
|
| 63 |
+
> "Pour répondre à ce besoin, nous travaillons sur le jeu de données de référence de l'industrie : **Cityscapes**. Ce dataset regroupe des images stéréo prises depuis des caméras embarquées dans des environnements urbains de dizaines de villes allemandes.
|
| 64 |
+
>
|
| 65 |
+
> La résolution native est très élevée : **1024 par 2048 pixels**, avec des annotations de masques extrêmement méticuleuses au pixel près. Le défi réside dans la complexité de départ, car Cityscapes propose **32 sous-catégories d'origine**, allant de la plaque d'immatriculation au garde-fou."
|
| 66 |
+
|
| 67 |
+
---
|
| 68 |
+
|
| 69 |
+
## Slide 5 : Simplification : Regroupement en 8 Classes
|
| 70 |
+
* **Durée recommandée** : 40 secondes
|
| 71 |
+
* **Action** : Balayer rapidement les 8 classes pour montrer la structure simplifiée.
|
| 72 |
+
* **Texte à prononcer** :
|
| 73 |
+
> "Pour rendre le modèle compatible avec les ressources de calcul limitées d'un processeur embarqué, Franck a demandé de fusionner ces 32 catégories complexes en **8 classes clés** :
|
| 74 |
+
>
|
| 75 |
+
> Nous avons donc le **Void** pour le capot ou l'arrière-plan flou ; le **Flat** qui représente la route et le trottoir ; le **Construction** pour les bâtiments et ponts ; l'**Object** pour les feux et panneaux de signalisation ; la **Nature** pour les arbres et buissons ; le **Sky** pour le ciel ; et enfin, les deux catégories les plus critiques pour la sécurité : **Human** pour les piétons ou cyclistes, et **Vehicle** pour les voitures et transports en commun."
|
| 76 |
+
|
| 77 |
+
---
|
| 78 |
+
|
| 79 |
+
## Slide 6 : Analyse Exploratoire des Données (EDA)
|
| 80 |
+
* **Durée recommandée** : 45 secondes
|
| 81 |
+
* **Action** : Prendre un ton plus technique pour expliquer le diagnostic des données.
|
| 82 |
+
* **Texte à prononcer** :
|
| 83 |
+
> "Lors de mon analyse exploratoire (l'EDA), j'ai dressé un constat mathématique majeur : le **class imbalance** ou déséquilibre des classes.
|
| 84 |
+
>
|
| 85 |
+
> En moyenne, la route et les bâtiments occupent plus de **60 %** de l'espace visuel d'une scène routière, alors que les éléments cruciaux comme les piétons, les vélos ou la signalisation représentent **moins de 2 %** des pixels.
|
| 86 |
+
>
|
| 87 |
+
> Si nous entraînons un réseau de neurones brut sur ces données sans précaution, le modèle aura tendance à ignorer les piétons tout en conservant une excellente "précision" statistique apparente. Ce biais statistique est extrêmement dangereux pour un véhicule autonome."
|
| 88 |
+
|
| 89 |
+
---
|
| 90 |
+
|
| 91 |
+
## Slide 7 : Métrique Clé de Performance : Le Mean IoU
|
| 92 |
+
* **Durée recommandée** : 50 secondes
|
| 93 |
+
* **Action** : Insister sur la formule et la rigueur scientifique.
|
| 94 |
+
* **Texte à prononcer** :
|
| 95 |
+
> "Pour contourner ce problème, l'Accuracy classique (pourcentage de pixels bien prédits) a été écartée car elle est trompeuse. À la place, j'ai sélectionné la métrique standard en segmentation sémantique : l'**Intersection over Union** (le score de Jaccard), que nous calculons sous sa forme de moyenne : le **Mean IoU**.
|
| 96 |
+
>
|
| 97 |
+
> Le mIoU calcule la zone de chevauchement entre la prédiction et la réalité divisée par leur union, et ce, de manière **indépendante pour chacune des 8 classes**. Ainsi, une erreur de détection sur un piéton aura exactement le même poids sur le score final qu'une erreur sur une immense surface de route. C'est le seul juge de paix fiable pour valider la robustesse de nos modèles."
|
| 98 |
+
|
| 99 |
+
---
|
| 100 |
+
|
| 101 |
+
# PARTIE 2 : MODÉLISATION, SIMULATIONS & COMPARAISONS (04:30 - 15:00)
|
| 102 |
+
|
| 103 |
+
## Slide 8 : Prévention du Surapprentissage : La Data Augmentation
|
| 104 |
+
* **Durée recommandée** : 40 secondes
|
| 105 |
+
* **Action** : Respirer et marquer la transition vers la partie technique de modélisation.
|
| 106 |
+
* **Texte à prononcer** :
|
| 107 |
+
> "Passons à présent à la phase de modélisation. Pour éviter le surapprentissage de notre réseau de neurones sur les scènes routières figées de l'entraînement, j'ai mis en place une solide stratégie de **Data Augmentation**.
|
| 108 |
+
>
|
| 109 |
+
> En segmentation, nous faisons face à une contrainte stricte : toute transformation géométrique sur l'image caméra doit être appliquée **au pixel près et à l'identique** sur le masque d'annotation. Pour cela, j'ai utilisé la bibliothèque spécialisée `albumentations` qui intègre ces transformations duales de manière native et synchrone."
|
| 110 |
+
|
| 111 |
+
---
|
| 112 |
+
|
| 113 |
+
## Slide 9 : Détails des Transformations Appliquées
|
| 114 |
+
* **Durée recommandée** : 35 secondes
|
| 115 |
+
* **Action** : Énoncer calmement les types d'augmentations.
|
| 116 |
+
* **Texte à prononcer** :
|
| 117 |
+
> "Concrètement, quelles sont les transformations appliquées à la volée ?
|
| 118 |
+
>
|
| 119 |
+
> Nous avons des transformations **géométriques** comme le flip horizontal aléatoire pour simuler un changement du sens de circulation, et des micro-rotations pour simuler les secousses de la voiture.
|
| 120 |
+
>
|
| 121 |
+
> Et nous avons des transformations **photométriques** pour modifier la luminosité et le contraste de l'image sans altérer le masque. Cela immunise notre modèle contre les variations de météo ou le passage dans les zones d'ombres."
|
| 122 |
+
|
| 123 |
+
---
|
| 124 |
+
|
| 125 |
+
## Slide 10 : Algorithmes : L'Architecture U-Net (Théorie)
|
| 126 |
+
* **Durée recommandée** : 50 secondes
|
| 127 |
+
* **Action** : Expliquer clairement le dessin ou le principe du "U".
|
| 128 |
+
* **Texte à prononcer** :
|
| 129 |
+
> "En ce qui concerne le choix de l'algorithme, j'ai opté pour l'architecture **U-Net**, qui est la référence absolue en segmentation d'images.
|
| 130 |
+
>
|
| 131 |
+
> Le réseau est structuré en deux branches symétriques :
|
| 132 |
+
>
|
| 133 |
+
> D'abord, la branche de gauche : l'**Encodeur**, ou chemin de contraction. C'est un CNN classique qui réduit la dimension spatiale de l'image tout en extrayant des filtres sémantiques profonds (pour savoir *CE QU'* il y a dans l'image).
|
| 134 |
+
>
|
| 135 |
+
> Ensuite, la branche de droite : le **Décodeur**, ou chemin d'expansion. C'est un réseau de convolutions inversées qui agrandit les cartes sémantiques pour restaurer la taille spatiale d'origine (pour savoir *OÙ* se trouvent ces éléments)."
|
| 136 |
+
|
| 137 |
+
---
|
| 138 |
+
|
| 139 |
+
## Slide 11 : Le Rôle des Skip Connections
|
| 140 |
+
* **Durée recommandée** : 45 secondes
|
| 141 |
+
* **Action** : Utiliser un ton enthousiaste pour cette astuce architecturale.
|
| 142 |
+
* **Texte à prononcer** :
|
| 143 |
+
> "Mais le secret du U-Net réside dans les **Skip Connections**, ces flèches horizontales qui relient l'encodeur au décodeur.
|
| 144 |
+
>
|
| 145 |
+
> Lors de la compression dans l'encodeur, les coordonnées précises des pixels et les détails géométriques fins sont irrémédiablement perdus. Les skip connections court-circuitent le réseau en copiant directement les cartes de caractéristiques haute résolution de l'encodeur pour les concaténer au décodeur.
|
| 146 |
+
>
|
| 147 |
+
> Grâce à cela, le décodeur dispose d'informations sémantiques globales, mais aussi de coordonnées géométriques chirurgicales, ce qui permet de détourer proprement les contours des objets."
|
| 148 |
+
|
| 149 |
+
---
|
| 150 |
+
|
| 151 |
+
## Slide 12 : Pipeline de Données : Le Data Generator Keras
|
| 152 |
+
* **Durée recommandée** : 45 secondes
|
| 153 |
+
* **Action** : Insister sur l'aspect "industrialisable" du code.
|
| 154 |
+
* **Texte à prononcer** :
|
| 155 |
+
> "Sur le plan de l'ingénierie logicielle, charger des centaines d'images de 1024x2048 en mémoire sature instantanément n'importe quel ordinateur ou puce embarquée.
|
| 156 |
+
>
|
| 157 |
+
> J'ai donc conçu un **générateur de données asynchrone** en héritant de la classe `Sequence` de Keras. Ce générateur charge les données par batch à la volée depuis le disque. Il s'occupe de redimensionner les images en **256 par 512 pixels** (un excellent compromis pour le CPU embarqué), applique la data augmentation, effectue le mapping dynamique des 32 classes vers nos 8 classes et encode les masques en one-hot vector."
|
| 158 |
+
|
| 159 |
+
---
|
| 160 |
+
|
| 161 |
+
## Slide 13 : Les Fonctions de Perte (Loss Functions)
|
| 162 |
+
* **Durée recommandée** : 45 secondes
|
| 163 |
+
* **Action** : Expliquer les ajustements mathématiques pour contrer le déséquilibre.
|
| 164 |
+
* **Texte à prononcer** :
|
| 165 |
+
> "Pour l'apprentissage, la fonction de perte par défaut est la **Categorical Cross-Entropy**. Bien qu'efficace, elle souffre du déséquilibre des classes en négligeant les petites classes.
|
| 166 |
+
>
|
| 167 |
+
> Pour y remédier, j'ai testé des approches avec la **Dice Loss**, qui maximise le taux de chevauchement. Finalement, j'ai combiné une Categorical Cross-Entropy avec un ajustement précis des poids de classe et un taux d'apprentissage adapté à l'aide de l'optimiseur Adam.
|
| 168 |
+
>
|
| 169 |
+
> Cela a permis de forcer la rétropropagation à pénaliser lourdement les erreurs faites sur les classes minoritaires comme les humains et les véhicules."
|
| 170 |
+
|
| 171 |
+
---
|
| 172 |
+
|
| 173 |
+
## Slide 14 : Première Modélisation : U-Net classique "from scratch"
|
| 174 |
+
* **Durée recommandée** : 40 secondes
|
| 175 |
+
* **Action** : Présenter la baseline.
|
| 176 |
+
* **Texte à prononcer** :
|
| 177 |
+
> "Ma première approche a été de concevoir et d'entraîner un modèle **U-Net classique construit de toutes pièces**.
|
| 178 |
+
>
|
| 179 |
+
> Cet encodeur custom comporte 4 blocs de convolutions, Batch Normalization et Max Pooling. Il possède environ **2 millions de paramètres** que j'ai entraînés avec des poids initialisés de manière aléatoire. C'est notre modèle 'baseline' de référence."
|
| 180 |
+
|
| 181 |
+
---
|
| 182 |
+
|
| 183 |
+
## Slide 15 : Analyse & Limites de la Baseline
|
| 184 |
+
* **Durée recommandée** : 50 secondes
|
| 185 |
+
* **Action** : Adopter une posture critique et analytique face aux résultats.
|
| 186 |
+
* **Texte à prononcer** :
|
| 187 |
+
> "Les limites de cette baseline 'from scratch' sont rapidement apparues.
|
| 188 |
+
>
|
| 189 |
+
> D'une part, la convergence à l'entraînement a été particulièrement lente. Le modèle doit tout apprendre par lui-même, depuis l'identification d'une simple ligne droite ou d'une texture de béton jusqu'à la forme complexe d'une voiture.
|
| 190 |
+
>
|
| 191 |
+
> D'autre part, sur le plan qualitatif, si le modèle dessine correctement la route et le ciel, il est incapable de segmenter proprement les petits éléments. Les piétons sont flous, voire invisibles, et les poteaux ou panneaux routiers sont hachés. C'est une limite critique pour notre cas d'usage."
|
| 192 |
+
|
| 193 |
+
---
|
| 194 |
+
|
| 195 |
+
## Slide 16 : Seconde Modélisation : Le Transfer Learning
|
| 196 |
+
* **Durée recommandée** : 45 secondes
|
| 197 |
+
* **Action** : Sourire et présenter le pivot méthodologique réussi.
|
| 198 |
+
* **Texte à prononcer** :
|
| 199 |
+
> "Pour dépasser ces limites et accélérer notre démarche technique, j'ai pivoté vers le **Transfer Learning**.
|
| 200 |
+
>
|
| 201 |
+
> L'idée est simple mais extrêmement puissante : au lieu de laisser notre modèle démarrer avec des poids aléatoires et "aveugles", nous lui greffons un encodeur qui a déjà appris à observer des millions d'images réelles du dataset ImageNet. Le modèle sait déjà repérer les formes complexes, les ombres, les cercles et les textures. Il ne lui reste plus qu'à apprendre à assembler ces connaissances pour notre tâche de segmentation."
|
| 202 |
+
|
| 203 |
+
---
|
| 204 |
+
|
| 205 |
+
## Slide 17 : MobileNetV2 comme Encodeur (Backbone)
|
| 206 |
+
* **Durée recommandée** : 50 secondes
|
| 207 |
+
* **Action** : Argumenter sur le choix de l'efficacité embarquée.
|
| 208 |
+
* **Texte à prononcer** :
|
| 209 |
+
> "J'ai spécifiquement choisi **MobileNetV2** comme colonne vertébrale, ou backbone, de notre encodeur.
|
| 210 |
+
>
|
| 211 |
+
> Pourquoi ? Parce que MobileNet est la référence absolue pour le matériel embarqué. Il s'appuie sur des convolutions séparables en profondeur, les **Depthwise Separable Convolutions**.
|
| 212 |
+
>
|
| 213 |
+
> En séparant le filtrage spatial de la combinaison des canaux, il permet d'obtenir des performances de vision exceptionnelles tout en réduisant par 9 le coût en opérations mathématiques et en mémoire par rapport à des réseaux lourds comme VGG ou ResNet. C'est l'atout parfait pour la réactivité à bord du véhicule."
|
| 214 |
+
|
| 215 |
+
---
|
| 216 |
+
|
| 217 |
+
## Slide 18 : Connexion MobileNetV2 et Décodeur U-Net
|
| 218 |
+
* **Durée recommandée** : 40 secondes
|
| 219 |
+
* **Action** : Décrire brièvement l'assemblage technique.
|
| 220 |
+
* **Texte à prononcer** :
|
| 221 |
+
> "J'ai donc extrait le tronc de MobileNetV2 pré-entraîné, en congelant ses premiers blocs pour conserver les détecteurs de formes universels.
|
| 222 |
+
>
|
| 223 |
+
> J'ai repéré et connecté ses couches intermédiaires (les blocs 1, 3 et 6) pour alimenter les skip connections de notre décodeur personnalisé. C'est une architecture hybride très élégante, à la fois extrêmement légère en poids et redoutable d'efficacité à l'entraînement."
|
| 224 |
+
|
| 225 |
+
---
|
| 226 |
+
|
| 227 |
+
## Slide 19 : Comparaison Quantitative des Modèles
|
| 228 |
+
* **Durée recommandée** : 1 minute
|
| 229 |
+
* **Action** : Analyser les lignes du tableau comparatif avec précision.
|
| 230 |
+
* **Texte à prononcer** :
|
| 231 |
+
> "Les résultats quantitatifs sont sans appel et valident notre démarche technique.
|
| 232 |
+
>
|
| 233 |
+
> Le modèle U-Net classique from scratch nécessite plus de 40 époques pour converger vers un **mIoU de validation décevant de 0.42**, avec un temps d'inférence de **120 millisecondes sur CPU**, ce qui est trop lent.
|
| 234 |
+
>
|
| 235 |
+
> Notre modèle **U-Net combiné à MobileNetV2** a convergé en seulement 15 époques. Son poids a été divisé par 3, tombant à seulement **12 Mo**. Son mIoU sur le jeu de test s'envole à **0.68**, et surtout, son temps d'inférence est descendu à **35 millisecondes par image**. C'est le seuil symbolique du temps réel sur processeur embarqué !"
|
| 236 |
+
|
| 237 |
+
---
|
| 238 |
+
|
| 239 |
+
## Slide 20 : Comparaison Qualitative de la Segmentation
|
| 240 |
+
* **Durée recommandée** : 45 secondes
|
| 241 |
+
* **Action** : Décrire visuellement l'amélioration des masques.
|
| 242 |
+
* **Texte à prononcer** :
|
| 243 |
+
> "Visuellement, la différence est saisissante.
|
| 244 |
+
>
|
| 245 |
+
> Là où le U-Net custom affichait des masques pixelisés et instables, le U-Net MobileNetV2 produit des délimitations très propres. La séparation entre la route et le trottoir est nette, et les véhicules sont parfaitement isolés.
|
| 246 |
+
>
|
| 247 |
+
> Mais le plus satisfaisant reste la détection stable des piétons, même à moyenne distance. Le modèle a développé une excellente compréhension spatiale des scènes urbaines."
|
| 248 |
+
|
| 249 |
+
---
|
| 250 |
+
|
| 251 |
+
## Slide 21 : Gain Réel de la Data Augmentation
|
| 252 |
+
* **Durée recommandée** : 45 secondes
|
| 253 |
+
* **Action** : Exposer les résultats de l'étude d'ablation pour légitimer la rigueur du projet.
|
| 254 |
+
* **Texte à prononcer** :
|
| 255 |
+
> "Pour isoler et quantifier le gain réel de la Data Augmentation, j'ai mené une étude d'ablation en entraînant le modèle avec et sans ces transformations à la volée.
|
| 256 |
+
>
|
| 257 |
+
> Sans augmentation, nous observons un surapprentissage marqué : le mIoU sur les données d'entraînement grimpe en flèche mais stagne sur le jeu de validation.
|
| 258 |
+
>
|
| 259 |
+
> En activant les rotations, les flips et le contraste, nous avons gagné **8 points de mIoU global sur le jeu de test**. Cela prouve scientifiquement l'apport capital de cette technique de régularisation pour immuniser notre IA contre les aléas de la route réelle."
|
| 260 |
+
|
| 261 |
+
---
|
| 262 |
+
|
| 263 |
+
# PARTIE 3 : MLOPS, DÉPLOIEMENT & DÉMONSTRATION (15:00 - 20:00)
|
| 264 |
+
|
| 265 |
+
## Slide 22 : Architecture MLOps (Vue d'ensemble)
|
| 266 |
+
* **Durée recommandée** : 40 secondes
|
| 267 |
+
* **Action** : Passer à la Partie 3. Adopter une attitude dynamique et fière de l'industrialisation.
|
| 268 |
+
* **Texte à prononcer** :
|
| 269 |
+
> "Avoir un excellent modèle sur notre notebook n'est qu'une première étape. Pour répondre aux besoins de Laura et industrialiser mon travail, j'ai conçu et mis en place une architecture **MLOps découplée** basée sur des microservices.
|
| 270 |
+
>
|
| 271 |
+
> D'un côté, nous avons le client : une application Web Streamlit interactive. De l'autre, le serveur : notre API FastAPI qui charge le modèle Keras en mémoire et effectue les calculs. L'image caméra transite par une requête HTTP POST sécurisée et le serveur renvoie le masque colorisé directement."
|
| 272 |
+
|
| 273 |
+
---
|
| 274 |
+
|
| 275 |
+
## Slide 23 : L'API REST de Prédiction avec FastAPI
|
| 276 |
+
* **Durée recommandée** : 45 secondes
|
| 277 |
+
* **Action** : Mettre en avant la robustesse du framework FastAPI.
|
| 278 |
+
* **Texte à prononcer** :
|
| 279 |
+
> "L'API a été développée avec **FastAPI**. J'ai retenu ce framework pour sa rapidité asynchrone légendaire et sa génération automatique d'une documentation interactive Swagger UI.
|
| 280 |
+
>
|
| 281 |
+
> L'endpoint principal est `/segmentation`. J'ai utilisé le mécanisme de **lifespan** de FastAPI pour charger le modèle Keras en mémoire une seule fois au démarrage de l'API. Lors d'un appel, l'API reçoit le flux binaire, le convertit en tableau Numpy, applique le prétraitement, effectue la prédiction et renvoie le masque sous forme de flux PNG asynchrone via une `StreamingResponse` pour maximiser le débit."
|
| 282 |
+
|
| 283 |
+
---
|
| 284 |
+
|
| 285 |
+
## Slide 24 : Conteneurisation de l'API & de l'App (Docker)
|
| 286 |
+
* **Durée recommandée** : 35 secondes
|
| 287 |
+
* **Action** : Expliquer l'isolation de l'environnement.
|
| 288 |
+
* **Texte à prononcer** :
|
| 289 |
+
> "Pour garantir que notre code s'exécute de façon strictement identique en local et sur nos serveurs de production, j'ai conteneurisé chaque brique à l'aide de **Docker**.
|
| 290 |
+
>
|
| 291 |
+
> J'ai écrit deux fichiers Dockerfile distincts : un pour isoler l'API FastAPI et ses dépendances lourdes (TensorFlow, Keras), et un second pour l'interface de démonstration Streamlit. Cela élimine définitivement les conflits de versions système."
|
| 292 |
+
|
| 293 |
+
---
|
| 294 |
+
|
| 295 |
+
## Slide 25 : Le Défi des Modèles Volumineux sur le Cloud
|
| 296 |
+
* **Durée recommandée** : 45 secondes
|
| 297 |
+
* **Action** : Présenter la contrainte technique résolue intelligemment.
|
| 298 |
+
* **Texte à prononcer** :
|
| 299 |
+
> "Lors de la mise en production, j'ai fait face à un défi d'infrastructure classique : les fichiers de modèles de Deep Learning pèsent très lourd. Notre modèle optimisé pèse 12 Mo, mais d'autres itérations dépassent largement les 100 Mo.
|
| 300 |
+
>
|
| 301 |
+
> GitHub bloque les fichiers de plus de 100 Mo par défaut. De plus, les hébergeurs Cloud traditionnels imposent des limites strictes de stockage sur leurs serveurs gratuits, ce qui compliquait notre déploiement."
|
| 302 |
+
|
| 303 |
+
---
|
| 304 |
+
|
| 305 |
+
## Slide 26 : La Solution de CI/CD Hybride via GitHub Actions
|
| 306 |
+
* **Durée recommandée** : 50 secondes
|
| 307 |
+
* **Action** : Détailler le workflow automatique.
|
| 308 |
+
* **Texte à prononcer** :
|
| 309 |
+
> "J'ai donc mis en place une architecture de **CI/CD hybride astucieuse** en exploitant la plateforme **Hugging Face Spaces**.
|
| 310 |
+
>
|
| 311 |
+
> Notre code source est versionné sur **GitHub**. À chaque validation de code (`git push`), un workflow automatique **GitHub Actions** est déclenché. Il exécute un script Python qui utilise l'API de Hugging Face pour pousser programmatiquement les fichiers de code et le modèle Keras volumineux directement dans les conteneurs de production HF.
|
| 312 |
+
>
|
| 313 |
+
> Le service est ainsi mis à jour de manière transparente, sécurisée et entièrement gratuite."
|
| 314 |
+
|
| 315 |
+
---
|
| 316 |
+
|
| 317 |
+
## Slide 27 : Le Dashboard Streamlit (Interface de Démo)
|
| 318 |
+
* **Durée recommandée** : 45 secondes
|
| 319 |
+
* **Action** : Présenter le fonctionnement du client Streamlit.
|
| 320 |
+
* **Texte à prononcer** :
|
| 321 |
+
> "L'interface finale destinée à nos collègues a été construite avec **Streamlit**.
|
| 322 |
+
>
|
| 323 |
+
> Elle se connecte à notre flotte d'images de test réelles issues de Cityscapes. L'utilisateur sélectionne un ID d'image dans un menu déroulant, clique sur un bouton pour l'envoyer à l'API FastAPI, et l'interface affiche instantanément l'image caméra, le masque parfait attendu pour comparaison et la prédiction en direct de notre modèle."
|
| 324 |
+
|
| 325 |
+
---
|
| 326 |
+
|
| 327 |
+
## Slide 28 : Démonstration de l'Application en Action
|
| 328 |
+
* **Durée recommandée** : 15 secondes
|
| 329 |
+
* **Action** : Montrer la capture d'écran sur la slide, puis **basculer immédiatement sur l'onglet du navigateur** où l'application Streamlit tourne en direct !
|
| 330 |
+
* **Texte à prononcer** :
|
| 331 |
+
> "Voici un aperçu visuel de l'application en action. Je vais maintenant basculer sur mon navigateur pour vous faire une démonstration en direct de ce pipeline d'inférence en production."
|
| 332 |
+
|
| 333 |
+
---
|
| 334 |
+
|
| 335 |
+
### [LANCEMENT DE LA DÉMO EN DIRECT - DURÉE : 1 MINUTE 30]
|
| 336 |
+
* **Actions à réaliser pendant la démo** :
|
| 337 |
+
1. **Vérifier** que la page Streamlit est bien chargée (si elle s'est mise en veille, cliquez sur "Restart this Space" en amont).
|
| 338 |
+
2. **Ouvrir** le menu latéral gauche et sélectionnez un fichier, par exemple `bielefeld_000000_000321_leftImg8bit.png`.
|
| 339 |
+
3. **Cliquer** sur le bouton bleu **"Lancer l'Inférence de l'API"**.
|
| 340 |
+
4. **Commenter pendant le chargement (qui dure moins de 5 secondes)** :
|
| 341 |
+
> *"Vous voyez ici que l'image caméra s'affiche à gauche. À droite, notre API FastAPI hébergée sur un autre espace a reçu l'image, l'a segmentée en 35 millisecondes et a renvoyé ce masque PNG colorisé. Le vert représente la végétation, le violet la route, le bleu le ciel et le rouge la présence d'humains ou de véhicules."*
|
| 342 |
+
5. **Rebasculer sur le diaporama** pour la suite et fin du script.
|
| 343 |
+
|
| 344 |
+
---
|
| 345 |
+
|
| 346 |
+
## Slide 29 : Liens du Déploiement en Production
|
| 347 |
+
* **Durée recommandée** : 20 secondes
|
| 348 |
+
* **Action** : Montrer brièvement les liens et préciser le mécanisme de veille.
|
| 349 |
+
* **Texte à prononcer** :
|
| 350 |
+
> "Comme vous pouvez le voir, l'API et l'application sont hébergées de manière autonome et découplée sur Hugging Face Spaces. L'ensemble de la chaîne est opérationnel et prêt pour des tests de plus grande envergure par nos ingénieurs."
|
| 351 |
+
|
| 352 |
+
---
|
| 353 |
+
|
| 354 |
+
## Slide 30 : Conclusion, Perspectives & Améliorations Futures
|
| 355 |
+
* **Durée recommandée** : 1 minute
|
| 356 |
+
* **Action** : Adopter un ton posé et professionnel pour conclure en beauté. Regarder l'évaluateur.
|
| 357 |
+
* **Texte à prononcer** :
|
| 358 |
+
> "Pour conclure, ce projet valide la faisabilité complète d'un pipeline de vision sémantique : depuis l'acquisition des données brutes avec un générateur asynchrone robuste, jusqu'à la mise en production de microservices hautement performants grâce au Transfer Learning et à une infrastructure MLOps moderne.
|
| 359 |
+
>
|
| 360 |
+
> En termes de perspectives, mes priorités pour la prochaine itération sont :
|
| 361 |
+
>
|
| 362 |
+
> Premièrement, la **quantification post-entraînement** pour convertir notre modèle Keras en format **TensorFlow Lite (TFLite)** avec une précision en Float16 ou Int8. Cela divisera par 4 le poids du modèle (qui tombera à 3 Mo) et augmentera la cadence d'inférence embarquée.
|
| 363 |
+
>
|
| 364 |
+
> Deuxièmement, l'intégration d'un lissage spatial par **CRF** en post-traitement pour affiner davantage les contours géométriques.
|
| 365 |
+
>
|
| 366 |
+
> Et enfin, la connexion directe de l'API avec le module de décision de freinage d'urgence du véhicule.
|
| 367 |
+
>
|
| 368 |
+
> Je vous remercie pour votre attention et je suis à présent à votre entière disposition pour répondre à vos questions et échanger sur nos choix techniques."
|
api/main.py
CHANGED
|
@@ -41,14 +41,14 @@ async def lifespan(app: FastAPI):
|
|
| 41 |
try:
|
| 42 |
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'
|
| 43 |
import tensorflow as tf
|
| 44 |
-
logger.info("
|
| 45 |
model = tf.keras.models.load_model(MODEL_PATH, compile=False)
|
| 46 |
-
logger.info("
|
| 47 |
except Exception as e:
|
| 48 |
model = None
|
| 49 |
-
logger.error(f"
|
| 50 |
else:
|
| 51 |
-
logger.warning(f"
|
| 52 |
yield
|
| 53 |
# Nettoyage si nécessaire
|
| 54 |
model = None
|
|
|
|
| 41 |
try:
|
| 42 |
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'
|
| 43 |
import tensorflow as tf
|
| 44 |
+
logger.info("Chargement du modèle Keras...")
|
| 45 |
model = tf.keras.models.load_model(MODEL_PATH, compile=False)
|
| 46 |
+
logger.info("Modèle chargé avec succès !")
|
| 47 |
except Exception as e:
|
| 48 |
model = None
|
| 49 |
+
logger.error(f"Erreur critique de TensorFlow : {e}")
|
| 50 |
else:
|
| 51 |
+
logger.warning(f"Modèle introuvable ({MODEL_PATH}). L'API tourne en 'MOCK MODE'.")
|
| 52 |
yield
|
| 53 |
# Nettoyage si nécessaire
|
| 54 |
model = None
|
app/Screenshot_streamlit_huggingface.png
ADDED
|
Git LFS Details
|
app/app.py
CHANGED
|
@@ -7,9 +7,9 @@ import base64
|
|
| 7 |
import io
|
| 8 |
|
| 9 |
# --- 1. Configuration UI ---
|
| 10 |
-
st.set_page_config(page_title="Future Vision Transport - Démos", layout="wide", page_icon="
|
| 11 |
|
| 12 |
-
st.title("
|
| 13 |
st.markdown("Interface d'Inférence interagissant en direct avec l'API FastAPI construite lors de la Phase 5.")
|
| 14 |
|
| 15 |
# Cible du Microservice API
|
|
@@ -36,11 +36,11 @@ def load_available_images():
|
|
| 36 |
images_list = load_available_images()
|
| 37 |
|
| 38 |
if not images_list:
|
| 39 |
-
st.error("
|
| 40 |
st.stop()
|
| 41 |
|
| 42 |
# --- 3. Barre de Menu (Sidebar) ---
|
| 43 |
-
st.sidebar.header("
|
| 44 |
st.sidebar.markdown("Sélectionnez l'image issue des caméras embarquées pour la transmettre au réseau de neurones.")
|
| 45 |
|
| 46 |
# On allège visuellement la liste déroulante en n'affichant que le nom du fichier
|
|
@@ -54,10 +54,10 @@ gt_color_filename = selected_filename.replace('_leftImg8bit.png', '_gtFine_color
|
|
| 54 |
gt_color_path = os.path.join("data/P8_Cityscapes_gtFine_trainvaltest/gtFine/test/", city_name, gt_color_filename)
|
| 55 |
|
| 56 |
# --- 4. Le Client REST ---
|
| 57 |
-
if st.sidebar.button("
|
| 58 |
st.markdown("---")
|
| 59 |
|
| 60 |
-
with st.spinner("
|
| 61 |
try:
|
| 62 |
# Sérialisation : On capture l'image en données binaires pour le flux HTTP sortant
|
| 63 |
with open(selected_path, "rb") as image_file:
|
|
@@ -70,35 +70,35 @@ if st.sidebar.button("🤖 Lancer l'Inférence de l'API"):
|
|
| 70 |
# L'API nous renvoie désormais directement l'image au format PNG ! (StreamingResponse)
|
| 71 |
predicted_mask = Image.open(io.BytesIO(response.content))
|
| 72 |
|
| 73 |
-
st.success("
|
| 74 |
|
| 75 |
# --- VISUALISATION DES 3 COMPOSANTES (Phase 6.1 Guideline) ---
|
| 76 |
col1, col2, col3 = st.columns(3)
|
| 77 |
|
| 78 |
# A. La Réalité Capturée
|
| 79 |
-
col1.subheader("
|
| 80 |
col1.image(Image.open(selected_path), use_container_width=True)
|
| 81 |
|
| 82 |
# B. Le Masque Parfait fourni par Cityscapes
|
| 83 |
-
col2.subheader("
|
| 84 |
if os.path.exists(gt_color_path):
|
| 85 |
col2.image(Image.open(gt_color_path), use_container_width=True)
|
| 86 |
else:
|
| 87 |
col2.warning("Non fourni (Normal pour le Test-Set de compétition).")
|
| 88 |
|
| 89 |
# C. L'Intelligence Artificielle en Action
|
| 90 |
-
col3.subheader("
|
| 91 |
col3.image(predicted_mask, use_container_width=True)
|
| 92 |
|
| 93 |
# Affichage des classes (Codées en dur ici car l'API renvoie directement une image pour optimiser)
|
| 94 |
CLASSES = ['void', 'flat', 'construction', 'object', 'nature', 'sky', 'human', 'vehicle']
|
| 95 |
-
with st.expander("Consulter la palette de couleurs sémantiques
|
| 96 |
st.write(", ".join(CLASSES))
|
| 97 |
|
| 98 |
else:
|
| 99 |
-
st.error(f"
|
| 100 |
|
| 101 |
except requests.exceptions.ConnectionError:
|
| 102 |
-
st.error(f"
|
| 103 |
-
# st.info("
|
| 104 |
-
st.info("
|
|
|
|
| 7 |
import io
|
| 8 |
|
| 9 |
# --- 1. Configuration UI ---
|
| 10 |
+
st.set_page_config(page_title="Future Vision Transport - Démos", layout="wide", page_icon="")
|
| 11 |
|
| 12 |
+
st.title("Segmentation Sémantique Embarquée")
|
| 13 |
st.markdown("Interface d'Inférence interagissant en direct avec l'API FastAPI construite lors de la Phase 5.")
|
| 14 |
|
| 15 |
# Cible du Microservice API
|
|
|
|
| 36 |
images_list = load_available_images()
|
| 37 |
|
| 38 |
if not images_list:
|
| 39 |
+
st.error("**Stop !** Dossier des images introuvable. J'ai cherché dans `data/P8_Cityscapes_leftImg8bit_trainvaltest`. Êtes-vous sûr d'avoir lancé `streamlit run app/app.py` depuis la racine de `Projet_8` ?")
|
| 40 |
st.stop()
|
| 41 |
|
| 42 |
# --- 3. Barre de Menu (Sidebar) ---
|
| 43 |
+
st.sidebar.header("Tableau de Bord")
|
| 44 |
st.sidebar.markdown("Sélectionnez l'image issue des caméras embarquées pour la transmettre au réseau de neurones.")
|
| 45 |
|
| 46 |
# On allège visuellement la liste déroulante en n'affichant que le nom du fichier
|
|
|
|
| 54 |
gt_color_path = os.path.join("data/P8_Cityscapes_gtFine_trainvaltest/gtFine/test/", city_name, gt_color_filename)
|
| 55 |
|
| 56 |
# --- 4. Le Client REST ---
|
| 57 |
+
if st.sidebar.button("Lancer l'Inférence de l'API"):
|
| 58 |
st.markdown("---")
|
| 59 |
|
| 60 |
+
with st.spinner("Transmission sécurisée à l'API FastAPI en cours..."):
|
| 61 |
try:
|
| 62 |
# Sérialisation : On capture l'image en données binaires pour le flux HTTP sortant
|
| 63 |
with open(selected_path, "rb") as image_file:
|
|
|
|
| 70 |
# L'API nous renvoie désormais directement l'image au format PNG ! (StreamingResponse)
|
| 71 |
predicted_mask = Image.open(io.BytesIO(response.content))
|
| 72 |
|
| 73 |
+
st.success("Triangulation serveur réussie ! Prédiction récupérée depuis l'API.")
|
| 74 |
|
| 75 |
# --- VISUALISATION DES 3 COMPOSANTES (Phase 6.1 Guideline) ---
|
| 76 |
col1, col2, col3 = st.columns(3)
|
| 77 |
|
| 78 |
# A. La Réalité Capturée
|
| 79 |
+
col1.subheader("Caméra (leftImg8bit)")
|
| 80 |
col1.image(Image.open(selected_path), use_container_width=True)
|
| 81 |
|
| 82 |
# B. Le Masque Parfait fourni par Cityscapes
|
| 83 |
+
col2.subheader("Masque Vérité (Attendu)")
|
| 84 |
if os.path.exists(gt_color_path):
|
| 85 |
col2.image(Image.open(gt_color_path), use_container_width=True)
|
| 86 |
else:
|
| 87 |
col2.warning("Non fourni (Normal pour le Test-Set de compétition).")
|
| 88 |
|
| 89 |
# C. L'Intelligence Artificielle en Action
|
| 90 |
+
col3.subheader("Prédiction FastAPI (Notre IA)")
|
| 91 |
col3.image(predicted_mask, use_container_width=True)
|
| 92 |
|
| 93 |
# Affichage des classes (Codées en dur ici car l'API renvoie directement une image pour optimiser)
|
| 94 |
CLASSES = ['void', 'flat', 'construction', 'object', 'nature', 'sky', 'human', 'vehicle']
|
| 95 |
+
with st.expander("Consulter la palette de couleurs sémantiques "):
|
| 96 |
st.write(", ".join(CLASSES))
|
| 97 |
|
| 98 |
else:
|
| 99 |
+
st.error(f"Erreur Serveur (HTTP {response.status_code}) : Vous devez vérifier ce que l'API imprime dans son propre terminal.")
|
| 100 |
|
| 101 |
except requests.exceptions.ConnectionError:
|
| 102 |
+
st.error(f"ERREUR CRITIQUE : L'API est injoignable sur l'URL ciblée (`{API_URL}`).")
|
| 103 |
+
# st.info("Si vous testez en local pour GCP, lancez le serveur FastAPI via : `cd api && uvicorn main:app --port 8000` et vérifiez l'API_URL.")
|
| 104 |
+
st.info("Si vous testez en local pour Hugging Face, lancez le serveur FastAPI via : `cd api && uvicorn main:app --port 7860` et vérifiez l'API_URL.")
|
etapes_suivantes.md
CHANGED
|
@@ -36,4 +36,4 @@ Tu dois préparer un dossier compressé `.zip` nommé `Titre_du_projet_nom_prén
|
|
| 36 |
- Entraîne-toi à tenir le timing très strict de **20 minutes (+/- 5 minutes)**. (Trop court ou trop long peut valoir un refus de l'examinateur).
|
| 37 |
- Prépare-toi aux questions de l'évaluateur pendant les 5 minutes de discussion (ex: *"Pourquoi U-Net plutôt qu'une autre architecture ?"*, *"Comment l'API gérerait-elle 30 images par seconde en temps réel dans une voiture ?"*, *"Comment avez-vous contourné les limites de taille de fichier lors du déploiement ?"*).
|
| 38 |
|
| 39 |
-
> **
|
|
|
|
| 36 |
- Entraîne-toi à tenir le timing très strict de **20 minutes (+/- 5 minutes)**. (Trop court ou trop long peut valoir un refus de l'examinateur).
|
| 37 |
- Prépare-toi aux questions de l'évaluateur pendant les 5 minutes de discussion (ex: *"Pourquoi U-Net plutôt qu'une autre architecture ?"*, *"Comment l'API gérerait-elle 30 images par seconde en temps réel dans une voiture ?"*, *"Comment avez-vous contourné les limites de taille de fichier lors du déploiement ?"*).
|
| 38 |
|
| 39 |
+
> **Conseil Bonus :** N'hésite pas à mettre en avant tes récents succès lors de la présentation (le pipeline CI/CD automatisé via Github Actions, le script de contournement des limites Git, la configuration multi-conteneurs Docker). C'est une excellente plus-value qui prouve tes compétences de futur ingénieur ML "Industrialisable" !
|
guide_projet_8.md
CHANGED
|
@@ -1,4 +1,4 @@
|
|
| 1 |
-
#
|
| 2 |
|
| 3 |
> **Contexte** : Tu es ingénieur IA chez *Future Vision Transport*. Tu conçois le module de **segmentation d'images** dans une chaîne de vision embarquée pour véhicules autonomes. Le dataset est **Cityscapes**, le framework imposé est **Keras**, et tu dois livrer un modèle + API + application web déployés sur le Cloud.
|
| 4 |
|
|
@@ -43,7 +43,7 @@ echo "venv_projet8/\ndata/\nmodels/*.h5\n__pycache__/" > .gitignore
|
|
| 43 |
## Phase 1 — Comprendre les données Cityscapes
|
| 44 |
|
| 45 |
### 1.1 Télécharger le jeu de données complet
|
| 46 |
-
>
|
| 47 |
|
| 48 |
- **Why** : Ton modèle prend en entrée les **images caméra** (leftImg8bit) et doit prédire les **masks de segmentation** (gtFine). Sans les images, tu ne peux pas entraîner.
|
| 49 |
- **Notions** : *supervised learning*, notion d'images d'entrée vs. ground truth / labels.
|
|
@@ -182,7 +182,7 @@ Techniques à appliquer :
|
|
| 182 |
- **Random crop + resize**
|
| 183 |
- **Ajout de bruit gaussien**
|
| 184 |
|
| 185 |
-
>
|
| 186 |
|
| 187 |
- **Why** : Le livrable demande explicitement des "gains obtenus avec les approches d'augmentation des données". L'augmentation permet de régulariser le modèle et d'augmenter virtuellement la taille du dataset.
|
| 188 |
- **Notions** : *data augmentation*, bibliothèque `albumentations` (applique les mêmes transformations géométriques à l'image et au mask), *overfitting prevention*.
|
|
@@ -285,10 +285,10 @@ Calculer les métriques finales sur le test set (Berlin, Bielefeld, Bonn, Leverk
|
|
| 285 |
|
| 286 |
| Critère | Flask | FastAPI |
|
| 287 |
|---------|-------|---------|
|
| 288 |
-
| Facilité |
|
| 289 |
-
| Performance |
|
| 290 |
-
| Documentation auto |
|
| 291 |
-
| Typing |
|
| 292 |
|
| 293 |
> **Recommandation** : FastAPI — la doc auto est un vrai plus pour Laura et la soutenance.
|
| 294 |
|
|
@@ -356,7 +356,7 @@ L'application doit permettre :
|
|
| 356 |
import streamlit as st
|
| 357 |
import requests
|
| 358 |
|
| 359 |
-
st.title("
|
| 360 |
|
| 361 |
# Liste des images disponibles
|
| 362 |
image_ids = get_available_image_ids()
|
|
@@ -394,11 +394,11 @@ if st.button("Lancer la prédiction"):
|
|
| 394 |
|
| 395 |
| Plateforme | Coût | Difficulté | GPU |
|
| 396 |
|-----------|------|-----------|-----|
|
| 397 |
-
| **Render** | Gratuit (limité) | ⭐⭐ |
|
| 398 |
-
| **Railway** | Gratuit ($5 crédit) | ⭐⭐ |
|
| 399 |
| **Azure Web App** | Free tier disponible | ⭐⭐⭐ | Option payante |
|
| 400 |
-
| **Google Cloud Run** | Free tier généreux | ⭐⭐⭐ |
|
| 401 |
-
| **PythonAnywhere** | Gratuit (très limité) | ⭐ |
|
| 402 |
| **AWS (EC2/Lambda)** | Free tier 12 mois | ⭐⭐⭐⭐ | Option payante |
|
| 403 |
|
| 404 |
- **Why** : Le déploiement Cloud est obligatoire pour la soutenance. Tu dois faire une démo en live et l'enregistrer. Choisis en fonction de ton budget et de ta familiarité.
|
|
@@ -431,7 +431,7 @@ Deux déploiements séparés :
|
|
| 431 |
|
| 432 |
### 7.4 Enregistrer la démo pendant la soutenance
|
| 433 |
|
| 434 |
-
>
|
| 435 |
|
| 436 |
- **Why** : C'est une exigence explicite du sujet. Prépare un outil d'enregistrement d'écran (OBS, QuickTime, etc.).
|
| 437 |
- **Notions** : *screen recording*, préparation de démo.
|
|
@@ -496,7 +496,7 @@ Préparer un script de démo :
|
|
| 496 |
|
| 497 |
---
|
| 498 |
|
| 499 |
-
##
|
| 500 |
|
| 501 |
| # | Livrable | Format | Nommage |
|
| 502 |
|---|----------|--------|---------|
|
|
@@ -506,11 +506,11 @@ Préparer un script de démo :
|
|
| 506 |
| 4 | **Note technique** (~10 pages) | PDF | `Nom_Prénom_4_note_technique_mmaaaa` |
|
| 507 |
| 5 | **Présentation** (max 30 slides) | PPTX/PDF | `Nom_Prénom_5_presentation_mmaaaa` |
|
| 508 |
|
| 509 |
-
>
|
| 510 |
|
| 511 |
---
|
| 512 |
|
| 513 |
-
##
|
| 514 |
|
| 515 |
| Domaine | Notions |
|
| 516 |
|---------|---------|
|
|
|
|
| 1 |
+
# Guide Complet — Projet 8 : Déploiement d'un Modèle de Segmentation d'Images
|
| 2 |
|
| 3 |
> **Contexte** : Tu es ingénieur IA chez *Future Vision Transport*. Tu conçois le module de **segmentation d'images** dans une chaîne de vision embarquée pour véhicules autonomes. Le dataset est **Cityscapes**, le framework imposé est **Keras**, et tu dois livrer un modèle + API + application web déployés sur le Cloud.
|
| 4 |
|
|
|
|
| 43 |
## Phase 1 — Comprendre les données Cityscapes
|
| 44 |
|
| 45 |
### 1.1 Télécharger le jeu de données complet
|
| 46 |
+
> **Observation** : Ton dossier [data/](file:///Users/j/Documents/OC_Inge_IA/Projet_8/data) contient actuellement uniquement les **annotations gtFine** (masks de segmentation), pas les images brutes. Tu dois télécharger les images `leftImg8bit` depuis [cityscapes-dataset.com](https://www.cityscapes-dataset.com/).
|
| 47 |
|
| 48 |
- **Why** : Ton modèle prend en entrée les **images caméra** (leftImg8bit) et doit prédire les **masks de segmentation** (gtFine). Sans les images, tu ne peux pas entraîner.
|
| 49 |
- **Notions** : *supervised learning*, notion d'images d'entrée vs. ground truth / labels.
|
|
|
|
| 182 |
- **Random crop + resize**
|
| 183 |
- **Ajout de bruit gaussien**
|
| 184 |
|
| 185 |
+
> L'augmentation doit être appliquée **identiquement** à l'image ET au mask !
|
| 186 |
|
| 187 |
- **Why** : Le livrable demande explicitement des "gains obtenus avec les approches d'augmentation des données". L'augmentation permet de régulariser le modèle et d'augmenter virtuellement la taille du dataset.
|
| 188 |
- **Notions** : *data augmentation*, bibliothèque `albumentations` (applique les mêmes transformations géométriques à l'image et au mask), *overfitting prevention*.
|
|
|
|
| 285 |
|
| 286 |
| Critère | Flask | FastAPI |
|
| 287 |
|---------|-------|---------|
|
| 288 |
+
| Facilité | Plus simple | Async concepts |
|
| 289 |
+
| Performance | Synchrone | Asynchrone natif |
|
| 290 |
+
| Documentation auto | | Swagger/OpenAPI inclus |
|
| 291 |
+
| Typing | | Pydantic intégré |
|
| 292 |
|
| 293 |
> **Recommandation** : FastAPI — la doc auto est un vrai plus pour Laura et la soutenance.
|
| 294 |
|
|
|
|
| 356 |
import streamlit as st
|
| 357 |
import requests
|
| 358 |
|
| 359 |
+
st.title("Segmentation d'Images - Future Vision Transport")
|
| 360 |
|
| 361 |
# Liste des images disponibles
|
| 362 |
image_ids = get_available_image_ids()
|
|
|
|
| 394 |
|
| 395 |
| Plateforme | Coût | Difficulté | GPU |
|
| 396 |
|-----------|------|-----------|-----|
|
| 397 |
+
| **Render** | Gratuit (limité) | ⭐⭐ | |
|
| 398 |
+
| **Railway** | Gratuit ($5 crédit) | ⭐⭐ | |
|
| 399 |
| **Azure Web App** | Free tier disponible | ⭐⭐⭐ | Option payante |
|
| 400 |
+
| **Google Cloud Run** | Free tier généreux | ⭐⭐⭐ | |
|
| 401 |
+
| **PythonAnywhere** | Gratuit (très limité) | ⭐ | |
|
| 402 |
| **AWS (EC2/Lambda)** | Free tier 12 mois | ⭐⭐⭐⭐ | Option payante |
|
| 403 |
|
| 404 |
- **Why** : Le déploiement Cloud est obligatoire pour la soutenance. Tu dois faire une démo en live et l'enregistrer. Choisis en fonction de ton budget et de ta familiarité.
|
|
|
|
| 431 |
|
| 432 |
### 7.4 Enregistrer la démo pendant la soutenance
|
| 433 |
|
| 434 |
+
> **Important** : Le sujet précise que l'évaluateur et l'étudiant doivent **enregistrer la démo** pendant la soutenance pour que le jury puisse la visionner. Tu pourras ensuite couper le service Cloud pour éviter les coûts.
|
| 435 |
|
| 436 |
- **Why** : C'est une exigence explicite du sujet. Prépare un outil d'enregistrement d'écran (OBS, QuickTime, etc.).
|
| 437 |
- **Notions** : *screen recording*, préparation de démo.
|
|
|
|
| 496 |
|
| 497 |
---
|
| 498 |
|
| 499 |
+
## Checklist des Livrables
|
| 500 |
|
| 501 |
| # | Livrable | Format | Nommage |
|
| 502 |
|---|----------|--------|---------|
|
|
|
|
| 506 |
| 4 | **Note technique** (~10 pages) | PDF | `Nom_Prénom_4_note_technique_mmaaaa` |
|
| 507 |
| 5 | **Présentation** (max 30 slides) | PPTX/PDF | `Nom_Prénom_5_presentation_mmaaaa` |
|
| 508 |
|
| 509 |
+
> Tout doit être dans un **zip** nommé `Titre_du_projet_nom_prénom`.
|
| 510 |
|
| 511 |
---
|
| 512 |
|
| 513 |
+
## Notions Clés à Maîtriser (Résumé)
|
| 514 |
|
| 515 |
| Domaine | Notions |
|
| 516 |
|---------|---------|
|