Pointer le dépôt vers l'organisation Forgejo openclassroom-ai.

This commit is contained in:
Grégoire Mureau 2026-09-09 23:41:00 +02:00
parent dd531ad3bb
commit 99e5907146
2 changed files with 291 additions and 291 deletions

View file

@ -50,7 +50,7 @@ jobs:
run: | run: |
set -eu set -eu
REGISTRY="${GITHUB_SERVER_URL#https://}" REGISTRY="${GITHUB_SERVER_URL#https://}"
IMAGE="${REGISTRY}/grgmro/oc-p08-street-vision" IMAGE="${REGISTRY}/openclassroom-ai/oc-p08-street-vision"
SHORT_SHA="$(echo "${GITHUB_SHA}" | cut -c1-12)" SHORT_SHA="$(echo "${GITHUB_SHA}" | cut -c1-12)"
export DOCKER_BUILDKIT=0 export DOCKER_BUILDKIT=0
docker build \ docker build \
@ -74,7 +74,7 @@ jobs:
fi fi
echo "${DOCKER_HUB_TOKEN}" | docker login docker.io -u "${DOCKER_HUB_USER}" --password-stdin echo "${DOCKER_HUB_TOKEN}" | docker login docker.io -u "${DOCKER_HUB_USER}" --password-stdin
SHORT_SHA="$(echo "${GITHUB_SHA}" | cut -c1-12)" SHORT_SHA="$(echo "${GITHUB_SHA}" | cut -c1-12)"
SRC="${GITHUB_SERVER_URL#https://}/grgmro/oc-p08-street-vision" SRC="${GITHUB_SERVER_URL#https://}/openclassroom-ai/oc-p08-street-vision"
DST="docker.io/${DOCKER_HUB_USER}/street-vision_api" DST="docker.io/${DOCKER_HUB_USER}/street-vision_api"
docker tag "${SRC}:latest" "${DST}:latest" docker tag "${SRC}:latest" "${DST}:latest"
docker tag "${SRC}:latest" "${DST}:${SHORT_SHA}" docker tag "${SRC}:latest" "${DST}:${SHORT_SHA}"

578
README.MD
View file

@ -1,289 +1,289 @@
# 🚗 Segmentation Multi-Classes pour Véhicules Autonomes # 🚗 Segmentation Multi-Classes pour Véhicules Autonomes
**Source de vérité** : [Forgejo](https://git.gregoiremureau.com/grgmro/oc-p08-street-vision) (auto-hébergé). **Source de vérité** : [Forgejo](https://git.gregoiremureau.com/openclassroom-ai/oc-p08-street-vision) (auto-hébergé).
```bash ```bash
git clone https://git.gregoiremureau.com/grgmro/oc-p08-street-vision.git git clone https://git.gregoiremureau.com/openclassroom-ai/oc-p08-street-vision.git
git clone https://git.gregoiremureau.com/grgmro/oc-p08-street-vision.git git clone https://git.gregoiremureau.com/openclassroom-ai/oc-p08-street-vision.git
``` ```
Prod : https://api.gregoiremureau.com/ml/street-vision/ Prod : https://api.gregoiremureau.com/ml/street-vision/
Dataset complet : `./fetch-data.sh` (Cityscapes **hors** git ; petit échantillon déjà dans `notebooks/content/data/`). Dataset complet : `./fetch-data.sh` (Cityscapes **hors** git ; petit échantillon déjà dans `notebooks/content/data/`).
## 📋 Description du Projet ## 📋 Description du Projet
Ce projet développe un système de segmentation sémantique d'images de rue destiné aux véhicules autonomes. Il permet l'identification et la segmentation automatique de différents éléments urbains : véhicules, piétons, mobilier urbain, infrastructure routière, etc. Ce projet développe un système de segmentation sémantique d'images de rue destiné aux véhicules autonomes. Il permet l'identification et la segmentation automatique de différents éléments urbains : véhicules, piétons, mobilier urbain, infrastructure routière, etc.
Le système s'inscrit dans une chaîne complète de vision par ordinateur embarquée pour l'automobile autonome, traitant les images en temps réel pour alimenter les systèmes de décision. Le système s'inscrit dans une chaîne complète de vision par ordinateur embarquée pour l'automobile autonome, traitant les images en temps réel pour alimenter les systèmes de décision.
## 🗂️ Structure du Projet ## 🗂️ Structure du Projet
``` ```
├── notebooks/ ├── notebooks/
│ ├── p8_notebook.ipynb # Notebook principal d'entraînement des modèles │ ├── p8_notebook.ipynb # Notebook principal d'entraînement des modèles
│ └── content/ │ └── content/
│ └── data/ │ └── data/
│ ├── new_images_to_predict/ # Images diverses pour tests d'inférence │ ├── new_images_to_predict/ # Images diverses pour tests d'inférence
│ └── test_images_sample/ # Échantillon Cityscapes avec masques │ └── test_images_sample/ # Échantillon Cityscapes avec masques
├── utils/ ├── utils/
│ └── utils.py # Fonctions communes (prétraitement, chargement, inférence) │ └── utils.py # Fonctions communes (prétraitement, chargement, inférence)
├── app/ # API et Interface Web ├── app/ # API et Interface Web
│ ├── main.py # API FastAPI avec routes de segmentation │ ├── main.py # API FastAPI avec routes de segmentation
│ ├── streamlit_app.py # Interface web interactive │ ├── streamlit_app.py # Interface web interactive
│ └── requirements.txt # Dépendances pour l'API et l'interface │ └── requirements.txt # Dépendances pour l'API et l'interface
├── cityscapes_config.json # Configuration des classes Cityscapes ├── cityscapes_config.json # Configuration des classes Cityscapes
├── .env.example # Template de variables d'environnement ├── .env.example # Template de variables d'environnement
├── Dockerfile # Configuration Docker ├── Dockerfile # Configuration Docker
├── docker-compose.yml.example # Template Docker Compose ├── docker-compose.yml.example # Template Docker Compose
├── nginx.conf # Configuration reverse proxy ├── nginx.conf # Configuration reverse proxy
├── start.sh # Script de démarrage des services ├── start.sh # Script de démarrage des services
├── .dockerignore # Optimisation du build Docker ├── .dockerignore # Optimisation du build Docker
└── README.md └── README.md
``` ```
> **Note** : Les modèles entraînés sont stockés et versionnés via **MLFlow** avec artefacts sur **MinIO**, pas en local. > **Note** : Les modèles entraînés sont stockés et versionnés via **MLFlow** avec artefacts sur **MinIO**, pas en local.
**État actuel du développement :** **État actuel du développement :**
- ✅ **Entraînement des modèles** : Complet (notebook + MLFlow + MinIO) - ✅ **Entraînement des modèles** : Complet (notebook + MLFlow + MinIO)
- ✅ **Fonctions d'inférence** : Développées et prêtes - ✅ **Fonctions d'inférence** : Développées et prêtes
- ✅ **API FastAPI** : API complète avec endpoints de segmentation - ✅ **API FastAPI** : API complète avec endpoints de segmentation
- ✅ **Interface Web** : Interface Streamlit pour upload et visualisation - ✅ **Interface Web** : Interface Streamlit pour upload et visualisation
- ✅ **Déploiement** : Conteneurisation Docker complète + reverse proxy nginx - ✅ **Déploiement** : Conteneurisation Docker complète + reverse proxy nginx
## 🏷️ Classes de Segmentation ## 🏷️ Classes de Segmentation
Le modèle identifie **8 catégories principales** : Le modèle identifie **8 catégories principales** :
1. **Route** - Chaussée et surfaces roulantes 1. **Route** - Chaussée et surfaces roulantes
2. **Trottoir** - Zones piétonnes 2. **Trottoir** - Zones piétonnes
3. **Bâtiments** - Structures architecturales 3. **Bâtiments** - Structures architecturales
4. **Végétation** - Arbres, buissons, espaces verts 4. **Végétation** - Arbres, buissons, espaces verts
5. **Véhicules** - Voitures, camions, bus 5. **Véhicules** - Voitures, camions, bus
6. **Personnes** - Piétons, cyclistes 6. **Personnes** - Piétons, cyclistes
7. **Signalisation** - Panneaux, feux de circulation 7. **Signalisation** - Panneaux, feux de circulation
8. **Mobilier urbain** - Poteaux, barrières, abribus 8. **Mobilier urbain** - Poteaux, barrières, abribus
## 🧠 Architecture Technique ## 🧠 Architecture Technique
### Modèles Implémentés ### Modèles Implémentés
Utilisation de la bibliothèque **[segmentation_models](https://github.com/qubvel/segmentation_models)** de qubvel pour l'implémentation des architectures. Utilisation de la bibliothèque **[segmentation_models](https://github.com/qubvel/segmentation_models)** de qubvel pour l'implémentation des architectures.
**Architectures principales :** **Architectures principales :**
- **U-Net** : Architecture encoder-decoder classique - **U-Net** : Architecture encoder-decoder classique
- **FPN** (Feature Pyramid Network) : Réseau à pyramide de caractéristiques - **FPN** (Feature Pyramid Network) : Réseau à pyramide de caractéristiques
**Backbones testés :** **Backbones testés :**
```python ```python
# Modèles avec backbones par défaut # Modèles avec backbones par défaut
('U-Net', None) # Backbone U-Net intégré ('U-Net', None) # Backbone U-Net intégré
('FPN', None) # Backbone VGG16 par défaut ('FPN', None) # Backbone VGG16 par défaut
# Modèles avec backbones pré-entraînés (encodeurs gelés) # Modèles avec backbones pré-entraînés (encodeurs gelés)
('U-Net', 'mobilenetv2') ('U-Net', 'mobilenetv2')
('U-Net', 'efficientnetb0') ('U-Net', 'efficientnetb0')
('FPN', 'mobilenetv2') ('FPN', 'mobilenetv2')
('FPN', 'efficientnetb0') ('FPN', 'efficientnetb0')
('FPN', 'resnet34') ('FPN', 'resnet34')
# Fine-tuning sélectif (encodeurs entraînables) # Fine-tuning sélectif (encodeurs entraînables)
('U-Net', 'mobilenetv2') ('U-Net', 'mobilenetv2')
('FPN', 'efficientnetb0') ('FPN', 'efficientnetb0')
('FPN', 'resnet34') ('FPN', 'resnet34')
``` ```
**Stratégies d'entraînement :** **Stratégies d'entraînement :**
- **Encodeurs gelés** : Transfer learning avec features pré-entraînées figées - **Encodeurs gelés** : Transfer learning avec features pré-entraînées figées
- **Fine-tuning** : Ajustement fin des encodeurs pré-entraînés - **Fine-tuning** : Ajustement fin des encodeurs pré-entraînés
- **Entraînement from scratch** : Sans pré-entraînement (backbones par défaut) - **Entraînement from scratch** : Sans pré-entraînement (backbones par défaut)
### Stack Technologique ### Stack Technologique
- **Framework** : Keras/TensorFlow - **Framework** : Keras/TensorFlow
- **Architectures** : [segmentation_models](https://github.com/qubvel/segmentation_models) (qubvel) - **Architectures** : [segmentation_models](https://github.com/qubvel/segmentation_models) (qubvel)
- **Gestion des expériences** : MLFlow - **Gestion des expériences** : MLFlow
- **Stockage des artefacts** : MinIO (S3-compatible) - **Stockage des artefacts** : MinIO (S3-compatible)
- **API** : FastAPI avec validation Pydantic - **API** : FastAPI avec validation Pydantic
- **Interface** : Streamlit pour l'interaction utilisateur - **Interface** : Streamlit pour l'interaction utilisateur
- **Reverse Proxy** : nginx pour routage API/Interface - **Reverse Proxy** : nginx pour routage API/Interface
- **Déploiement** : Docker + NAS personnel *(solutions souveraines)* - **Déploiement** : Docker + NAS personnel *(solutions souveraines)*
## 📊 Dataset ## 📊 Dataset
- **Source** : Cityscapes Dataset - **Source** : Cityscapes Dataset
- **Organisation locale** : - **Organisation locale** :
- `notebooks/content/data/test_images_sample/` : Échantillon avec masques de vérité pour tests d'inférence - `notebooks/content/data/test_images_sample/` : Échantillon avec masques de vérité pour tests d'inférence
- `notebooks/content/data/new_images_to_predict/` : Images de test diverses pour validation - `notebooks/content/data/new_images_to_predict/` : Images de test diverses pour validation
## 🚀 Installation et Configuration ## 🚀 Installation et Configuration
### Option 1: Déploiement Docker (Recommandé) ### Option 1: Déploiement Docker (Recommandé)
#### Configuration rapide #### Configuration rapide
```bash ```bash
# Cloner le projet # Cloner le projet
git clone https://git.gregoiremureau.com/grgmro/oc-p08-street-vision.git git clone https://git.gregoiremureau.com/openclassroom-ai/oc-p08-street-vision.git
cd oc-p08-street-vision cd oc-p08-street-vision
# Copier et adapter la configuration # Copier et adapter la configuration
cp .env.example .env cp .env.example .env
cp docker-compose.yml.example docker-compose.yml cp docker-compose.yml.example docker-compose.yml
# Éditer les variables d'environnement # Éditer les variables d'environnement
nano .env nano .env
``` ```
#### Variables d'environnement requises #### Variables d'environnement requises
```bash ```bash
# Configuration du serveur # Configuration du serveur
NGINX_PORT=8080 NGINX_PORT=8080
# Configuration MLflow # Configuration MLflow
MLFLOW_TRACKING_URI=http://localhost:5000 MLFLOW_TRACKING_URI=http://localhost:5000
MLFLOW_S3_ENDPOINT_URL=http://localhost:9000 MLFLOW_S3_ENDPOINT_URL=http://localhost:9000
AWS_ACCESS_KEY_ID=your_access_key AWS_ACCESS_KEY_ID=your_access_key
AWS_SECRET_ACCESS_KEY=your_secret_key AWS_SECRET_ACCESS_KEY=your_secret_key
# URL de base de l'API (pour Streamlit) # URL de base de l'API (pour Streamlit)
MULTISEG_API_BASE_URL=http://localhost:8080/api MULTISEG_API_BASE_URL=http://localhost:8080/api
``` ```
#### Déploiement #### Déploiement
```bash ```bash
# Construction et lancement # Construction et lancement
docker-compose up --build docker-compose up --build
# Ou en arrière-plan # Ou en arrière-plan
docker-compose up -d --build docker-compose up -d --build
# Accès à l'application # Accès à l'application
# Interface web: http://localhost:8080 # Interface web: http://localhost:8080
# API docs: http://localhost:8080/api/docs # API docs: http://localhost:8080/api/docs
# Health check: http://localhost:8080/health # Health check: http://localhost:8080/health
``` ```
#### Test local sans docker-compose #### Test local sans docker-compose
```bash ```bash
# Lancement avec port personnalisé # Lancement avec port personnalisé
docker build -t multiseg-api . docker build -t multiseg-api .
docker run -p 3000:3000 \ docker run -p 3000:3000 \
-e NGINX_PORT=3000 \ -e NGINX_PORT=3000 \
-e MLFLOW_TRACKING_URI=http://host.docker.internal:5000 \ -e MLFLOW_TRACKING_URI=http://host.docker.internal:5000 \
-e MULTISEG_API_BASE_URL=http://localhost:3000/api \ -e MULTISEG_API_BASE_URL=http://localhost:3000/api \
multiseg-api multiseg-api
``` ```
### Option 2: Installation Locale (Développement) ### Option 2: Installation Locale (Développement)
#### Pour l'expérimentation et l'entraînement #### Pour l'expérimentation et l'entraînement
```bash ```bash
cd notebooks cd notebooks
pip install -r requirements.txt pip install -r requirements.txt
``` ```
#### Pour l'API uniquement #### Pour l'API uniquement
```bash ```bash
cd app cd app
pip install -r requirements.txt pip install -r requirements.txt
# Lancement manuel des services # Lancement manuel des services
# Terminal 1: FastAPI # Terminal 1: FastAPI
uvicorn app.main:app --host 0.0.0.0 --port 8000 uvicorn app.main:app --host 0.0.0.0 --port 8000
# Terminal 2: Streamlit # Terminal 2: Streamlit
streamlit run app/streamlit_app.py --server.port 8501 streamlit run app/streamlit_app.py --server.port 8501
``` ```
## 🌐 Utilisation de l'API ## 🌐 Utilisation de l'API
### Endpoints Principaux ### Endpoints Principaux
#### Segmentation d'image #### Segmentation d'image
```bash ```bash
# Upload et segmentation via curl # Upload et segmentation via curl
curl -X POST "http://localhost:8080/api/segment" \ curl -X POST "http://localhost:8080/api/segment" \
-F "file=@image.jpg" \ -F "file=@image.jpg" \
-F "model_name=unet_mobilenetv2" \ -F "model_name=unet_mobilenetv2" \
-F "confidence_threshold=0.5" -F "confidence_threshold=0.5"
``` ```
#### Informations sur les modèles #### Informations sur les modèles
```bash ```bash
# Liste des modèles disponibles # Liste des modèles disponibles
curl "http://localhost:8080/api/models" curl "http://localhost:8080/api/models"
# Détails d'un modèle # Détails d'un modèle
curl "http://localhost:8080/api/models/unet_mobilenetv2" curl "http://localhost:8080/api/models/unet_mobilenetv2"
``` ```
#### Monitoring #### Monitoring
```bash ```bash
# Health check # Health check
curl "http://localhost:8080/health" curl "http://localhost:8080/health"
# Métriques API # Métriques API
curl "http://localhost:8080/api/metrics" curl "http://localhost:8080/api/metrics"
``` ```
### Interface Web ### Interface Web
L'interface Streamlit accessible sur `http://localhost:8080` permet : L'interface Streamlit accessible sur `http://localhost:8080` permet :
- **Upload d'images** par glisser-déposer ou sélection - **Upload d'images** par glisser-déposer ou sélection
- **Sélection du modèle** parmi les modèles disponibles - **Sélection du modèle** parmi les modèles disponibles
- **Ajustement des paramètres** (seuil de confiance, etc.) - **Ajustement des paramètres** (seuil de confiance, etc.)
- **Visualisation** des résultats avec overlay des segmentations - **Visualisation** des résultats avec overlay des segmentations
- **Téléchargement** des masques de segmentation - **Téléchargement** des masques de segmentation
## 🔧 Architecture de Déploiement ## 🔧 Architecture de Déploiement
### Structure des Services ### Structure des Services
``` ```
┌─────────────────┐ ┌──────────────────┐ ┌─────────────────┐ ┌─────────────────┐ ┌──────────────────┐ ┌─────────────────┐
│ nginx:8080 │────│ FastAPI:8000 │────│ MLFlow/MinIO │ │ nginx:8080 │────│ FastAPI:8000 │────│ MLFlow/MinIO │
│ (Reverse Proxy)│ │ (API Backend) │ │ (Model Storage) │ │ (Reverse Proxy)│ │ (API Backend) │ │ (Model Storage) │
└─────────┬───────┘ └──────────────────┘ └─────────────────┘ └─────────┬───────┘ └──────────────────┘ └─────────────────┘
│ │
┌─────────▼───────┐ ┌─────────▼───────┐
│ Streamlit:8501 │ │ Streamlit:8501 │
│ (Web Interface) │ │ (Web Interface) │
└─────────────────┘ └─────────────────┘
``` ```
### Volumes et Persistance ### Volumes et Persistance
- **Modèles** : Téléchargés depuis MLFlow/MinIO au démarrage - **Modèles** : Téléchargés depuis MLFlow/MinIO au démarrage
- **Uploads temporaires** : Stockage en mémoire (pas de persistance) - **Uploads temporaires** : Stockage en mémoire (pas de persistance)
- **Logs** : Accessibles via `docker-compose logs` - **Logs** : Accessibles via `docker-compose logs`
### Monitoring et Logs ### Monitoring et Logs
```bash ```bash
# Logs en temps réel # Logs en temps réel
docker-compose logs -f docker-compose logs -f
# Logs d'un service spécifique # Logs d'un service spécifique
docker-compose logs -f multiseg-api docker-compose logs -f multiseg-api
# Métriques de performance # Métriques de performance
curl http://localhost:8080/api/metrics curl http://localhost:8080/api/metrics
``` ```
## 🔮 Améliorations Futures ## 🔮 Améliorations Futures
### Modèles et Performance ### Modèles et Performance
- **Prétraitement adaptatif** : Prétraitement spécifique à chaque backbone au lieu de la normalisation générique - **Prétraitement adaptatif** : Prétraitement spécifique à chaque backbone au lieu de la normalisation générique
- **Optimisation temps réel** : Amélioration des performances d'inférence pour déploiement embarqué - **Optimisation temps réel** : Amélioration des performances d'inférence pour déploiement embarqué
- **Résolution d'entraînement améliorée** : L'API accepte toutes les résolutions d'images, mais l'entraînement a été effectué sur des images redimensionnées à 224x224. Un réentraînement sur des résolutions supérieures (512x512, 1024x1024) pourrait améliorer la précision en capturant plus de détails fins, au prix d'une augmentation des besoins en puissance de calcul - **Résolution d'entraînement améliorée** : L'API accepte toutes les résolutions d'images, mais l'entraînement a été effectué sur des images redimensionnées à 224x224. Un réentraînement sur des résolutions supérieures (512x512, 1024x1024) pourrait améliorer la précision en capturant plus de détails fins, au prix d'une augmentation des besoins en puissance de calcul
- **Transfer learning ciblé** : Utilisation de backbones pré-entraînés sur Mapillary Vistas - **Transfer learning ciblé** : Utilisation de backbones pré-entraînés sur Mapillary Vistas
### Infrastructure et Déploiement ### Infrastructure et Déploiement
- **Scaling horizontal** : Support Kubernetes pour déploiement multi-instances - **Scaling horizontal** : Support Kubernetes pour déploiement multi-instances
- **Cache intelligent** : Mise en cache des prédictions pour images similaires - **Cache intelligent** : Mise en cache des prédictions pour images similaires
- **API Gateway** : Intégration d'un gateway pour authentification et rate limiting - **API Gateway** : Intégration d'un gateway pour authentification et rate limiting
- **Monitoring avancé** : Intégration Prometheus/Grafana pour métriques détaillées - **Monitoring avancé** : Intégration Prometheus/Grafana pour métriques détaillées
### Données et Généralisation ### Données et Généralisation
- **Généralisation des conditions** : Extension au-delà des conditions urbaines de Cityscapes - **Généralisation des conditions** : Extension au-delà des conditions urbaines de Cityscapes
- **Segmentation des personnes** : Amélioration de l'IoU via data augmentation (IA générative) - **Segmentation des personnes** : Amélioration de l'IoU via data augmentation (IA générative)
- **Datasets additionnels** : Intégration de datasets complémentaires pour robustesse - **Datasets additionnels** : Intégration de datasets complémentaires pour robustesse
--- ---
*Projet développé dans une approche de souveraineté technologique, privilégiant les solutions open-source et l'hébergement sur infrastructure personnelle.* *Projet développé dans une approche de souveraineté technologique, privilégiant les solutions open-source et l'hébergement sur infrastructure personnelle.*