Initial commit of scripts

This commit is contained in:
Grégoire Mureau 2025-11-10 16:40:12 +01:00
parent 59a126cf49
commit 6bdda85438
17 changed files with 5353 additions and 5353 deletions

View file

@ -1,106 +1,106 @@
# Notebooks de développement mais GARDER les samples
notebooks/*.ipynb
notebooks/p8_notebook.ipynb
notebooks/requirements.txt
.ipynb_checkpoints/
# GARDER: notebooks/content/data/test_images_sample/ (nécessaire pour l'app)
# Environment files (variables passées via docker run ou compose)
.env
.env.*
!.env.example
# Python cache et build files
__pycache__/
*.py[cod]
*$py.class
*.so
.Python
build/
develop-eggs/
dist/
downloads/
eggs/
.eggs/
lib/
lib64/
parts/
sdist/
var/
wheels/
pip-wheel-metadata/
share/python-wheels/
*.egg-info/
.installed.cfg
*.egg
MANIFEST
# Virtual environments
venv/
env/
ENV/
env.bak/
venv.bak/
.venv/
# IDE et editor files
.vscode/
.idea/
*.swp
*.swo
*~
.DS_Store
Thumbs.db
# Git files
.git/
.gitignore
.gitattributes
# Documentation
*.md
!README.MD
docs/
documentation/
# Test files
tests/
test_*/
*_test.py
debug_*.py
pytest.ini
tox.ini
.coverage
.pytest_cache/
# Jupyter notebook outputs
*.nbconvert
# Fichiers temporaires
.cache/
.tmp/
tmp/
temp/
*.tmp
*.temp
*.log
logs/
# OS generated files
.DS_Store?
ehthumbs.db
Icon?
# MLflow artifacts locaux (seront téléchargés depuis le registry)
mlruns/
mlruns.backup/
mlartifacts/
# Backup files
*.bak
*.backup
# Large datasets (samples nécessaires sont gardés)
*.zip
*.tar.gz
*.rar
# Notebooks de développement mais GARDER les samples
notebooks/*.ipynb
notebooks/p8_notebook.ipynb
notebooks/requirements.txt
.ipynb_checkpoints/
# GARDER: notebooks/content/data/test_images_sample/ (nécessaire pour l'app)
# Environment files (variables passées via docker run ou compose)
.env
.env.*
!.env.example
# Python cache et build files
__pycache__/
*.py[cod]
*$py.class
*.so
.Python
build/
develop-eggs/
dist/
downloads/
eggs/
.eggs/
lib/
lib64/
parts/
sdist/
var/
wheels/
pip-wheel-metadata/
share/python-wheels/
*.egg-info/
.installed.cfg
*.egg
MANIFEST
# Virtual environments
venv/
env/
ENV/
env.bak/
venv.bak/
.venv/
# IDE et editor files
.vscode/
.idea/
*.swp
*.swo
*~
.DS_Store
Thumbs.db
# Git files
.git/
.gitignore
.gitattributes
# Documentation
*.md
!README.MD
docs/
documentation/
# Test files
tests/
test_*/
*_test.py
debug_*.py
pytest.ini
tox.ini
.coverage
.pytest_cache/
# Jupyter notebook outputs
*.nbconvert
# Fichiers temporaires
.cache/
.tmp/
tmp/
temp/
*.tmp
*.temp
*.log
logs/
# OS generated files
.DS_Store?
ehthumbs.db
Icon?
# MLflow artifacts locaux (seront téléchargés depuis le registry)
mlruns/
mlruns.backup/
mlartifacts/
# Backup files
*.bak
*.backup
# Large datasets (samples nécessaires sont gardés)
*.zip
*.tar.gz
*.rar

View file

@ -1,41 +1,41 @@
# =============================================================================
# Configuration du serveur
# =============================================================================
# Port sur lequel nginx écoute (défaut: 8080 pour compatibilité Cloud Run)
NGINX_PORT=8080
# =============================================================================
# Configuration MLflow (pour le versioning et le téléchargement des modèles)
# =============================================================================
# URI du serveur MLflow de tracking
MLFLOW_TRACKING_URI=http://localhost:5000
# URL du stockage S3/MinIO pour les artefacts MLflow
MLFLOW_S3_ENDPOINT_URL=http://localhost:9000
# Clés d'accès S3/MinIO
AWS_ACCESS_KEY_ID=minio_access_key
AWS_SECRET_ACCESS_KEY=minio_secret_key
# =============================================================================
# Configuration email (optionnel - pour les notifications)
# =============================================================================
# Serveur SMTP
SMTP_SERVER=smtp.gmail.com
SMTP_PORT=587
# Identifiants email
SMTP_EMAIL=noreply@yourcompany.com
SMTP_PASSWORD=your_app_password
SMTP_FROM_ALIAS=Multi-Segmentation API
# Email de l'administrateur (destinataire des notifications)
ADMIN_EMAIL=admin@yourcompany.com
# =============================================================================
# Configuration de l'API
# =============================================================================
# URL de base de l'API (utilisée par Streamlit pour faire les appels)
# En développement local: http://localhost:8080/api
# En production: https://your-domain.com/api
MULTISEG_API_BASE_URL=http://localhost:8080/api
# =============================================================================
# Configuration du serveur
# =============================================================================
# Port sur lequel nginx écoute (défaut: 8080 pour compatibilité Cloud Run)
NGINX_PORT=8080
# =============================================================================
# Configuration MLflow (pour le versioning et le téléchargement des modèles)
# =============================================================================
# URI du serveur MLflow de tracking
MLFLOW_TRACKING_URI=http://localhost:5000
# URL du stockage S3/MinIO pour les artefacts MLflow
MLFLOW_S3_ENDPOINT_URL=http://localhost:9000
# Clés d'accès S3/MinIO
AWS_ACCESS_KEY_ID=minio_access_key
AWS_SECRET_ACCESS_KEY=minio_secret_key
# =============================================================================
# Configuration email (optionnel - pour les notifications)
# =============================================================================
# Serveur SMTP
SMTP_SERVER=smtp.gmail.com
SMTP_PORT=587
# Identifiants email
SMTP_EMAIL=noreply@yourcompany.com
SMTP_PASSWORD=your_app_password
SMTP_FROM_ALIAS=Multi-Segmentation API
# Email de l'administrateur (destinataire des notifications)
ADMIN_EMAIL=admin@yourcompany.com
# =============================================================================
# Configuration de l'API
# =============================================================================
# URL de base de l'API (utilisée par Streamlit pour faire les appels)
# En développement local: http://localhost:8080/api
# En production: https://your-domain.com/api
MULTISEG_API_BASE_URL=http://localhost:8080/api

View file

@ -1,44 +1,44 @@
FROM python:3.12-slim
WORKDIR /app
# Install system dependencies (ajout de git pour segmentation_models)
RUN apt-get update && \
apt-get install -y nginx curl gettext-base git && \
# Pour OpenCV si nécessaire
apt-get install -y libglib2.0-0 libsm6 libxext6 libxrender-dev libgomp1 && \
adduser --system --no-create-home --group www-data || true && \
apt-get clean && \
rm -rf /var/lib/apt/lists/*
# Copy app/ d'abord pour avoir requirements.txt
COPY app/ ./app/
# Install requirements depuis le bon chemin
RUN pip install --no-cache-dir -r app/requirements.txt
# ✅ CORRECTION: Copy start.sh AVANT les permissions
COPY start.sh ./start.sh
# Copy du reste après installation (optimise les layers Docker)
COPY utils/ ./utils/
COPY cityscapes_config.json .
COPY notebooks/content/data/test_images_sample/ ./notebooks/content/data/test_images_sample/
COPY notebooks/content/data/train_images_sample/ ./notebooks/content/data/train_images_sample/
# Copy nginx config
COPY nginx.conf /etc/nginx/nginx.conf.template
# ✅ CORRECTION: Setup permissions APRÈS avoir copié start.sh + correction fins de ligne
RUN mkdir -p /var/log/nginx /var/lib/nginx /run && \
sed -i 's/\r$//' ./start.sh && \
chmod +x ./start.sh
# Environment variables
ENV NGINX_PORT=8080
ENV MULTISEG_API_BASE_URL=http://localhost:8080/api
EXPOSE $NGINX_PORT
# ✅ CORRECTION: Chemin cohérent (./start.sh au lieu de /app/start.sh)
CMD ["./start.sh"]
FROM python:3.12-slim
WORKDIR /app
# Install system dependencies (ajout de git pour segmentation_models)
RUN apt-get update && \
apt-get install -y nginx curl gettext-base git && \
# Pour OpenCV si nécessaire
apt-get install -y libglib2.0-0 libsm6 libxext6 libxrender-dev libgomp1 && \
adduser --system --no-create-home --group www-data || true && \
apt-get clean && \
rm -rf /var/lib/apt/lists/*
# Copy app/ d'abord pour avoir requirements.txt
COPY app/ ./app/
# Install requirements depuis le bon chemin
RUN pip install --no-cache-dir -r app/requirements.txt
# ✅ CORRECTION: Copy start.sh AVANT les permissions
COPY start.sh ./start.sh
# Copy du reste après installation (optimise les layers Docker)
COPY utils/ ./utils/
COPY cityscapes_config.json .
COPY notebooks/content/data/test_images_sample/ ./notebooks/content/data/test_images_sample/
COPY notebooks/content/data/train_images_sample/ ./notebooks/content/data/train_images_sample/
# Copy nginx config
COPY nginx.conf /etc/nginx/nginx.conf.template
# ✅ CORRECTION: Setup permissions APRÈS avoir copié start.sh + correction fins de ligne
RUN mkdir -p /var/log/nginx /var/lib/nginx /run && \
sed -i 's/\r$//' ./start.sh && \
chmod +x ./start.sh
# Environment variables
ENV NGINX_PORT=8080
ENV MULTISEG_API_BASE_URL=http://localhost:8080/api
EXPOSE $NGINX_PORT
# ✅ CORRECTION: Chemin cohérent (./start.sh au lieu de /app/start.sh)
CMD ["./start.sh"]

230
README.MD
View file

@ -1,116 +1,116 @@
# Street Vision PoC - Segmentation Sémantique Urbaine
## 🎯 Description du Projet
**Street Vision PoC** est une preuve de concept démontrant l'amélioration des performances de segmentation sémantique urbaine en comparant les architectures CNN traditionnelles (FPN) aux approches Transformer modernes (SegFormer).
Ce projet évalue empiriquement le potentiel des **Vision Transformers** pour la compréhension de scènes urbaines complexes, avec un focus sur les classes critiques pour la sécurité (piétons, véhicules, signalétique).
### 🔬 Contexte Technique
- **Dataset** : Cityscapes (2,975 images haute résolution annotées pixel-par-pixel)
- **Architectures comparées** :
- **CNN traditionnel** : FPN + EfficientNet-B0/ResNet34
- **Vision Transformer** : SegFormer-B0/B1
- **Résolutions d'évaluation** : 512×512 et 768×768 pixels
- **Métrique principale** : Mean Intersection over Union (mIoU)
## 📊 Résultats Principaux
| **Modèle** | **mIoU** | **Paramètres** | **Taille** | **Performance** |
|------------|----------|----------------|------------|-----------------|
| **SegFormer-B1** | **79.98%** | 13.68M | 52MB | ⭐ **Meilleur** |
| **FPN+ResNet34** | 79.22% | 23.16M | 88MB | 🔄 Baseline forte |
| **FPN+EfficientNet-B0** | 78.67% | 5.76M | 22MB | 💡 Compact |
| **SegFormer-B0** | 77.91% | 3.72M | 14MB | ⚡ Ultra-léger |
**Analyse comparative** : SegFormer-B1 et FPN+ResNet34 atteignent des performances similaires (~79-80% mIoU), mais SegFormer-B1 présente l'avantage d'être plus compact et probablement plus rapide sur GPU. Les versions SegFormer-B2 à B5 promettraient des gains significatifs, mais mes contraintes matérielles n'ont pas permis leur évaluation.
### 🎯 Gains Significatifs par Classes Critiques
- **Human** : +1.78% IoU (sécurité critique)
- **Vehicle** : +1.05% IoU (obstacles mobiles)
- **Object** : +0.56% IoU (signalétique urbaine)
## 🚀 Déploiement Rapide
### Docker Hub
L'application est containerisée et disponible sur Docker Hub :
```bash
docker pull grgmdmn/street-vision-poc_api
```
### Configuration avec Docker Compose
1. Copiez le fichier d'exemple de configuration :
```bash
cp docker-compose.yml.example docker-compose.yml
```
2. Configurez les variables d'environnement dans `docker-compose.yml`.
3. Lancez l'application :
```bash
docker-compose up -d
```
4. Accédez à l'interface : `http://localhost:$(port)`
## 🎮 Fonctionnalités de l'Interface
### Dashboard Interactif
- **Upload d'images** : Glisser-déposer d'images urbaines
- **Double inférence** : Comparaison simultanée FPN vs SegFormer
- **Visualisation** : Masques de segmentation colorés par classe
- **Métriques temps réel** : Temps d'inférence et scores de confiance
- **Export** : Téléchargement des résultats de segmentation
- **Accessibilité WCAG** : Interface conforme aux standards d'accessibilité
### Analyse Exploratoire des Données
- **Statistiques Cityscapes** : Distribution des classes, résolutions natives
- **Graphiques interactifs** : Répartition pixel par méta-classe
- **Exemples annotés** : Visualisation échantillons du dataset
## 📈 Méthodologie d'Évaluation
### Approche Comparative
1. **Baseline CNN** : Réentraînement FPN+EfficientNet/ResNet aux résolutions supérieures
2. **Nouvelle approche** : Évaluation SegFormer avec attention globale
3. **Protocole rigoureux** : Validation croisée, métriques standardisées
4. **Analyse par classe** : Performance détaillée sur 8 méta-classes urbaines
### Limites Identifiées
- **Résolution fixe** : Évaluation sans sliding window (vs protocole original)
- **Ressources limitées** : Tests uniquement sur SegFormer-B0/B1
- **Conditions contrôlées** : Dataset Cityscapes uniquement (météo favorable)
## 🔬 Insights Techniques
### Avantages SegFormer
- **Attention globale** : Chaque pixel "voit" toute l'image simultanément
- **Architecture plus légère** : Modèle compact avec moins de paramètres
- **Robustesse contextuelle** : Meilleure gestion occlusions et objets complexes
- **Potentiel d'amélioration** : Versions B2-B5 promettraient des gains significatifs
### Trade-offs Identifiés
- **Vitesse CPU classique** : ~2× plus lent que FPN sur processeurs haute performance (Xeon, 9600X)
- **Vitesse CPU économe** : 3× plus rapide sur processeurs économes en énergie (N100)
- **Optimisation GPU** : Architecture Transformer favorisée par accélération matérielle
## 📚 Références
- **Xie, E. et al.** (2021). *SegFormer: Simple and Efficient Design for Semantic Segmentation with Transformers*. NeurIPS 2021.
- **Cordts, M. et al.** (2016). *The Cityscapes Dataset for Semantic Urban Scene Understanding*. CVPR 2016.
- **Segmentation Models PyTorch** - [Framework d'implémentation utilisé](https://github.com/qubvel/segmentation_models.pytorch)
---
# Street Vision PoC - Segmentation Sémantique Urbaine
## 🎯 Description du Projet
**Street Vision PoC** est une preuve de concept démontrant l'amélioration des performances de segmentation sémantique urbaine en comparant les architectures CNN traditionnelles (FPN) aux approches Transformer modernes (SegFormer).
Ce projet évalue empiriquement le potentiel des **Vision Transformers** pour la compréhension de scènes urbaines complexes, avec un focus sur les classes critiques pour la sécurité (piétons, véhicules, signalétique).
### 🔬 Contexte Technique
- **Dataset** : Cityscapes (2,975 images haute résolution annotées pixel-par-pixel)
- **Architectures comparées** :
- **CNN traditionnel** : FPN + EfficientNet-B0/ResNet34
- **Vision Transformer** : SegFormer-B0/B1
- **Résolutions d'évaluation** : 512×512 et 768×768 pixels
- **Métrique principale** : Mean Intersection over Union (mIoU)
## 📊 Résultats Principaux
| **Modèle** | **mIoU** | **Paramètres** | **Taille** | **Performance** |
|------------|----------|----------------|------------|-----------------|
| **SegFormer-B1** | **79.98%** | 13.68M | 52MB | ⭐ **Meilleur** |
| **FPN+ResNet34** | 79.22% | 23.16M | 88MB | 🔄 Baseline forte |
| **FPN+EfficientNet-B0** | 78.67% | 5.76M | 22MB | 💡 Compact |
| **SegFormer-B0** | 77.91% | 3.72M | 14MB | ⚡ Ultra-léger |
**Analyse comparative** : SegFormer-B1 et FPN+ResNet34 atteignent des performances similaires (~79-80% mIoU), mais SegFormer-B1 présente l'avantage d'être plus compact et probablement plus rapide sur GPU. Les versions SegFormer-B2 à B5 promettraient des gains significatifs, mais mes contraintes matérielles n'ont pas permis leur évaluation.
### 🎯 Gains Significatifs par Classes Critiques
- **Human** : +1.78% IoU (sécurité critique)
- **Vehicle** : +1.05% IoU (obstacles mobiles)
- **Object** : +0.56% IoU (signalétique urbaine)
## 🚀 Déploiement Rapide
### Docker Hub
L'application est containerisée et disponible sur Docker Hub :
```bash
docker pull grgmdmn/street-vision-poc_api
```
### Configuration avec Docker Compose
1. Copiez le fichier d'exemple de configuration :
```bash
cp docker-compose.yml.example docker-compose.yml
```
2. Configurez les variables d'environnement dans `docker-compose.yml`.
3. Lancez l'application :
```bash
docker-compose up -d
```
4. Accédez à l'interface : `http://localhost:$(port)`
## 🎮 Fonctionnalités de l'Interface
### Dashboard Interactif
- **Upload d'images** : Glisser-déposer d'images urbaines
- **Double inférence** : Comparaison simultanée FPN vs SegFormer
- **Visualisation** : Masques de segmentation colorés par classe
- **Métriques temps réel** : Temps d'inférence et scores de confiance
- **Export** : Téléchargement des résultats de segmentation
- **Accessibilité WCAG** : Interface conforme aux standards d'accessibilité
### Analyse Exploratoire des Données
- **Statistiques Cityscapes** : Distribution des classes, résolutions natives
- **Graphiques interactifs** : Répartition pixel par méta-classe
- **Exemples annotés** : Visualisation échantillons du dataset
## 📈 Méthodologie d'Évaluation
### Approche Comparative
1. **Baseline CNN** : Réentraînement FPN+EfficientNet/ResNet aux résolutions supérieures
2. **Nouvelle approche** : Évaluation SegFormer avec attention globale
3. **Protocole rigoureux** : Validation croisée, métriques standardisées
4. **Analyse par classe** : Performance détaillée sur 8 méta-classes urbaines
### Limites Identifiées
- **Résolution fixe** : Évaluation sans sliding window (vs protocole original)
- **Ressources limitées** : Tests uniquement sur SegFormer-B0/B1
- **Conditions contrôlées** : Dataset Cityscapes uniquement (météo favorable)
## 🔬 Insights Techniques
### Avantages SegFormer
- **Attention globale** : Chaque pixel "voit" toute l'image simultanément
- **Architecture plus légère** : Modèle compact avec moins de paramètres
- **Robustesse contextuelle** : Meilleure gestion occlusions et objets complexes
- **Potentiel d'amélioration** : Versions B2-B5 promettraient des gains significatifs
### Trade-offs Identifiés
- **Vitesse CPU classique** : ~2× plus lent que FPN sur processeurs haute performance (Xeon, 9600X)
- **Vitesse CPU économe** : 3× plus rapide sur processeurs économes en énergie (N100)
- **Optimisation GPU** : Architecture Transformer favorisée par accélération matérielle
## 📚 Références
- **Xie, E. et al.** (2021). *SegFormer: Simple and Efficient Design for Semantic Segmentation with Transformers*. NeurIPS 2021.
- **Cordts, M. et al.** (2016). *The Cityscapes Dataset for Semantic Urban Scene Understanding*. CVPR 2016.
- **Segmentation Models PyTorch** - [Framework d'implémentation utilisé](https://github.com/qubvel/segmentation_models.pytorch)
---
**Note** : Cette preuve de concept démontre le potentiel des architectures Transformer pour la segmentation urbaine, tout en soulignant l'importance des ressources computationnelles pour exploiter pleinement leurs capacités.

View file

@ -1,108 +1,108 @@
# Dashboard de Comparaison de Modèles
## Conformité aux Exigences
### Analyse Exploratoire des Données Non Structurées (Images)
**Présentation d'exemples d'images selon les catégories :**
- Visualisation d'images du dataset Cityscapes organisées par 8 méta-classes de segmentation
- Sélection interactive d'images d'entraînement et de test avec prévisualisation
- Interface de navigation par catégories avec noms d'affichage conviviaux
**Comptage et répartition des données :**
- Graphiques en secteurs (pie charts) détaillant la répartition des 25,000 images Cityscapes
- Visualisation de l'utilisation projet : 80% train / 20% validation / 100% test
- Graphique de distribution des classes dans le dataset d'entraînement
- Tableaux récapitulatifs avec statistiques détaillées par split
**Transformations des images :**
- Démonstration interactive du preprocessing : redimensionnement et normalisation
- Visualisation des augmentations de données aléatoires (rotation, flip, luminosité, etc.)
- Comparaison avant/après transformations avec alignement visuel
- Documentation complète des 6 types d'augmentations possibles
### Sélection de Données d'Entrée
**Interface de sélection multiple :**
- Liste déroulante pour images test Cityscapes avec informations sur la vérité terrain
- Upload de fichiers personnels (JPEG, PNG) avec validation de format
- Prévisualisation des images sélectionnées avant traitement
- Gestion des erreurs et feedback utilisateur en temps réel
### Résultats de Prédiction
**Comparaison complète de modèles :**
- Affichage côte à côte des prédictions des deux meilleurs modèles
- Visualisations avec image originale, masques prédits et vérité terrain
- Détection et mise en évidence des erreurs de segmentation
- Statistiques détaillées par classe avec pourcentages et nombre de pixels
**Métriques de performance :**
- Temps d'inférence comparatif avec analyse de vitesse
- Scores de performance (mIoU, Accuracy) par modèle
- IoU par classe pour analyse fine des performances
- Graphiques comparatifs interactifs des résultats
### Déploiement Cloud
**Architecture déployée :**
- Application FastAPI pour l'API de comparaison de modèles
- Interface Streamlit pour le dashboard utilisateur
- Déploiement sur infrastructure cloud avec haute disponibilité
- Gestion automatique des ressources et montée en charge
### Accessibilité WCAG
**Conformité aux critères essentiels :**
#### Contraste des Couleurs (WCAG AA)
- Palette de couleurs avec ratios de contraste ≥ 4.1:1 pour éléments graphiques
- Ratios de contraste ≥ 4.5:1 pour le texte sur fond
- 8 couleurs principales validées : bleu (#0066CC), rouge (#CC0000), vert (#006600), etc.
- Remplacement des dégradés par des couleurs unies à contraste élevé
#### Alternatives Textuelles
- Descriptions alternatives détaillées pour tous les graphiques générées automatiquement
- Textes explicatifs pour chaque visualisation (pie charts, bar charts)
- Labels ARIA appropriés pour les éléments interactifs
- Documentation textuelle complète des transformations d'images
#### Indication Non-Couleur Uniquement
- Motifs et hachures complémentaires aux couleurs (optionnel via checkbox)
- 6 motifs différents : diagonales, verticales, horizontales, points, croix
- Différenciation par forme et texture en plus des couleurs
- Bordures et contours renforcés pour la distinction visuelle
#### Navigation Clavier
- CSS focus visible avec contours bleus (#0066CC) de 2px
- Support complet de la navigation par tabulation
- Indicateurs visuels clairs pour les éléments focusés
- Respect de l'ordre logique de navigation
#### Tableaux de Données Accessibles
- Tableaux structurés complémentaires à tous les graphiques
- En-têtes appropriés avec scope et descriptions
- Données exportables et lisibles par lecteurs d'écran
- Configuration responsive pour tous les écrans
**Fonctionnalités d'assistance intégrées :**
- Checkbox "Activer les motifs (accessibilité visuelle)" pour personnalisation
- Descriptions automatiques des graphiques avec statistiques complètes
- Interface adaptable aux besoins des utilisateurs en situation de handicap
- Documentation complète des fonctionnalités d'accessibilité via endpoint `/accessibility-info`
## Architecture Technique
**Stack technologique :**
- Backend : FastAPI + PyTorch pour l'inférence des modèles
- Frontend : Streamlit avec composants accessibles
- Visualisations : Matplotlib avec palettes WCAG
- API REST documentée avec validation Pydantic
- Gestion d'état optimisée pour les comparaisons de modèles
**Performance et fiabilité :**
- Temps d'inférence optimisés (< 1 seconde par image)
- Gestion mémoire efficace avec fermeture automatique des figures
- Validation des formats et tailles de fichiers
- Nettoyage automatique des fichiers temporaires
# Dashboard de Comparaison de Modèles
## Conformité aux Exigences
### Analyse Exploratoire des Données Non Structurées (Images)
**Présentation d'exemples d'images selon les catégories :**
- Visualisation d'images du dataset Cityscapes organisées par 8 méta-classes de segmentation
- Sélection interactive d'images d'entraînement et de test avec prévisualisation
- Interface de navigation par catégories avec noms d'affichage conviviaux
**Comptage et répartition des données :**
- Graphiques en secteurs (pie charts) détaillant la répartition des 25,000 images Cityscapes
- Visualisation de l'utilisation projet : 80% train / 20% validation / 100% test
- Graphique de distribution des classes dans le dataset d'entraînement
- Tableaux récapitulatifs avec statistiques détaillées par split
**Transformations des images :**
- Démonstration interactive du preprocessing : redimensionnement et normalisation
- Visualisation des augmentations de données aléatoires (rotation, flip, luminosité, etc.)
- Comparaison avant/après transformations avec alignement visuel
- Documentation complète des 6 types d'augmentations possibles
### Sélection de Données d'Entrée
**Interface de sélection multiple :**
- Liste déroulante pour images test Cityscapes avec informations sur la vérité terrain
- Upload de fichiers personnels (JPEG, PNG) avec validation de format
- Prévisualisation des images sélectionnées avant traitement
- Gestion des erreurs et feedback utilisateur en temps réel
### Résultats de Prédiction
**Comparaison complète de modèles :**
- Affichage côte à côte des prédictions des deux meilleurs modèles
- Visualisations avec image originale, masques prédits et vérité terrain
- Détection et mise en évidence des erreurs de segmentation
- Statistiques détaillées par classe avec pourcentages et nombre de pixels
**Métriques de performance :**
- Temps d'inférence comparatif avec analyse de vitesse
- Scores de performance (mIoU, Accuracy) par modèle
- IoU par classe pour analyse fine des performances
- Graphiques comparatifs interactifs des résultats
### Déploiement Cloud
**Architecture déployée :**
- Application FastAPI pour l'API de comparaison de modèles
- Interface Streamlit pour le dashboard utilisateur
- Déploiement sur infrastructure cloud avec haute disponibilité
- Gestion automatique des ressources et montée en charge
### Accessibilité WCAG
**Conformité aux critères essentiels :**
#### Contraste des Couleurs (WCAG AA)
- Palette de couleurs avec ratios de contraste ≥ 4.1:1 pour éléments graphiques
- Ratios de contraste ≥ 4.5:1 pour le texte sur fond
- 8 couleurs principales validées : bleu (#0066CC), rouge (#CC0000), vert (#006600), etc.
- Remplacement des dégradés par des couleurs unies à contraste élevé
#### Alternatives Textuelles
- Descriptions alternatives détaillées pour tous les graphiques générées automatiquement
- Textes explicatifs pour chaque visualisation (pie charts, bar charts)
- Labels ARIA appropriés pour les éléments interactifs
- Documentation textuelle complète des transformations d'images
#### Indication Non-Couleur Uniquement
- Motifs et hachures complémentaires aux couleurs (optionnel via checkbox)
- 6 motifs différents : diagonales, verticales, horizontales, points, croix
- Différenciation par forme et texture en plus des couleurs
- Bordures et contours renforcés pour la distinction visuelle
#### Navigation Clavier
- CSS focus visible avec contours bleus (#0066CC) de 2px
- Support complet de la navigation par tabulation
- Indicateurs visuels clairs pour les éléments focusés
- Respect de l'ordre logique de navigation
#### Tableaux de Données Accessibles
- Tableaux structurés complémentaires à tous les graphiques
- En-têtes appropriés avec scope et descriptions
- Données exportables et lisibles par lecteurs d'écran
- Configuration responsive pour tous les écrans
**Fonctionnalités d'assistance intégrées :**
- Checkbox "Activer les motifs (accessibilité visuelle)" pour personnalisation
- Descriptions automatiques des graphiques avec statistiques complètes
- Interface adaptable aux besoins des utilisateurs en situation de handicap
- Documentation complète des fonctionnalités d'accessibilité via endpoint `/accessibility-info`
## Architecture Technique
**Stack technologique :**
- Backend : FastAPI + PyTorch pour l'inférence des modèles
- Frontend : Streamlit avec composants accessibles
- Visualisations : Matplotlib avec palettes WCAG
- API REST documentée avec validation Pydantic
- Gestion d'état optimisée pour les comparaisons de modèles
**Performance et fiabilité :**
- Temps d'inférence optimisés (< 1 seconde par image)
- Gestion mémoire efficace avec fermeture automatique des figures
- Validation des formats et tailles de fichiers
- Nettoyage automatique des fichiers temporaires

File diff suppressed because it is too large Load diff

View file

@ -1,71 +1,71 @@
# =============================================================================
# Multi-Class Segmentation API - Requirements
# =============================================================================
# ===== CORE WEB FRAMEWORK =====
fastapi==0.115.14
uvicorn==0.35.0
starlette==0.46.2
pydantic==2.11.7
pydantic_core==2.33.2
python-multipart==0.0.20 # uploads FastAPI
# ===== STREAMLIT =====
streamlit==1.46.1
altair==5.5.0 # utilisé par Streamlit
blinker==1.9.0 # dépendance Streamlit
# ===== HTTP CLIENTS =====
requests==2.32.4
httpx==0.28.1 # utilisé en interne par FastAPI
httpcore==1.0.9
h11==0.16.0
# ===== MACHINE LEARNING CORE (PyTorch) =====
torch==2.8.0 # version stable PyTorch
torchvision==0.23.0 # utile pour les modèles pré-entraînés
torchaudio==2.8.0 # optionnel (mais recommandé pour compatibilité PyTorch)
segmentation-models-pytorch==0.5.0
albumentations==2.0.8
# version PyTorch de ToTensor
albumentations[imgaug,opencv]
numpy>=1.24.0,<2.0.0
scipy==1.16.0
scikit-learn==1.7.0
# ===== COMPUTER VISION =====
pillow==11.3.0
opencv-python-headless==4.9.0.80
scikit-image==0.25.2
imageio==2.37.0
# ===== DATA SCIENCE =====
pandas==2.3.0
matplotlib==3.10.3
networkx==3.5
tifffile==2025.6.11
lazy_loader==0.4
# ===== MLFLOW & MODEL REGISTRY =====
mlflow==3.2.0
mlflow-skinny==3.2.0
mlflow-tracing==3.2.0
# ===== AWS/S3 SUPPORT =====
boto3==1.39.2
botocore==1.39.2
s3transfer==0.13.0
# ===== UTILITIES =====
click==8.2.1
tqdm==4.67.1
joblib==1.5.1
python-dateutil
packaging
typing_extensions==4.14.0
# ===== MATPLOTLIB ADDONS =====
cycler==0.12.1
fonttools==4.58.5
plotly==5.24.1
# =============================================================================
# Multi-Class Segmentation API - Requirements
# =============================================================================
# ===== CORE WEB FRAMEWORK =====
fastapi==0.115.14
uvicorn==0.35.0
starlette==0.46.2
pydantic==2.11.7
pydantic_core==2.33.2
python-multipart==0.0.20 # uploads FastAPI
# ===== STREAMLIT =====
streamlit==1.46.1
altair==5.5.0 # utilisé par Streamlit
blinker==1.9.0 # dépendance Streamlit
# ===== HTTP CLIENTS =====
requests==2.32.4
httpx==0.28.1 # utilisé en interne par FastAPI
httpcore==1.0.9
h11==0.16.0
# ===== MACHINE LEARNING CORE (PyTorch) =====
torch==2.8.0 # version stable PyTorch
torchvision==0.23.0 # utile pour les modèles pré-entraînés
torchaudio==2.8.0 # optionnel (mais recommandé pour compatibilité PyTorch)
segmentation-models-pytorch==0.5.0
albumentations==2.0.8
# version PyTorch de ToTensor
albumentations[imgaug,opencv]
numpy>=1.24.0,<2.0.0
scipy==1.16.0
scikit-learn==1.7.0
# ===== COMPUTER VISION =====
pillow==11.3.0
opencv-python-headless==4.9.0.80
scikit-image==0.25.2
imageio==2.37.0
# ===== DATA SCIENCE =====
pandas==2.3.0
matplotlib==3.10.3
networkx==3.5
tifffile==2025.6.11
lazy_loader==0.4
# ===== MLFLOW & MODEL REGISTRY =====
mlflow==3.2.0
mlflow-skinny==3.2.0
mlflow-tracing==3.2.0
# ===== AWS/S3 SUPPORT =====
boto3==1.39.2
botocore==1.39.2
s3transfer==0.13.0
# ===== UTILITIES =====
click==8.2.1
tqdm==4.67.1
joblib==1.5.1
python-dateutil
packaging
typing_extensions==4.14.0
# ===== MATPLOTLIB ADDONS =====
cycler==0.12.1
fonttools==4.58.5
plotly==5.24.1

File diff suppressed because it is too large Load diff

View file

@ -1,63 +1,63 @@
{
"class_groups": {
"flat": ["road", "sidewalk", "parking", "rail track"],
"human": ["person", "rider"],
"vehicle": ["car", "truck", "bus", "train", "motorcycle", "bicycle", "caravan", "trailer"],
"construction": ["building", "wall", "fence", "guard rail", "bridge", "tunnel"],
"object": ["pole", "pole group", "traffic sign", "traffic light"],
"nature": ["vegetation", "terrain"],
"sky": ["sky"],
"void": ["unlabeled", "ego vehicle", "rectification border", "out of roi", "static", "dynamic", "ground"]
},
"cityscapes_mapping": {
"0": 7, "1": 7, "2": 7, "3": 7, "4": 7, "5": 7, "6": 7,
"7": 0, "8": 0, "9": 0, "10": 0,
"11": 3, "12": 3, "13": 3, "14": 3, "15": 3, "16": 3,
"17": 4, "18": 4, "19": 4, "20": 4,
"21": 5, "22": 5,
"23": 6,
"24": 1, "25": 1,
"26": 2, "27": 2, "28": 2, "29": 2, "30": 2, "31": 2, "32": 2, "33": 2
},
"id_to_label": {
"0": "unlabeled",
"1": "ego vehicle",
"2": "rectification border",
"3": "out of roi",
"4": "static",
"5": "dynamic",
"6": "ground",
"7": "road",
"8": "sidewalk",
"9": "parking",
"10": "rail track",
"11": "building",
"12": "wall",
"13": "fence",
"14": "guard rail",
"15": "bridge",
"16": "tunnel",
"17": "pole",
"18": "pole group",
"19": "traffic light",
"20": "traffic sign",
"21": "vegetation",
"22": "terrain",
"23": "sky",
"24": "person",
"25": "rider",
"26": "car",
"27": "truck",
"28": "bus",
"29": "caravan",
"30": "trailer",
"31": "train",
"32": "motorcycle",
"33": "bicycle"
},
"group_colors": [
[128, 64, 128], [220, 20, 60], [0, 0, 142], [70, 70, 70],
[220, 220, 0], [107, 142, 35], [70, 130, 180], [0, 0, 0]
],
"group_names": ["flat", "human", "vehicle", "construction", "object", "nature", "sky", "void"]
}
{
"class_groups": {
"flat": ["road", "sidewalk", "parking", "rail track"],
"human": ["person", "rider"],
"vehicle": ["car", "truck", "bus", "train", "motorcycle", "bicycle", "caravan", "trailer"],
"construction": ["building", "wall", "fence", "guard rail", "bridge", "tunnel"],
"object": ["pole", "pole group", "traffic sign", "traffic light"],
"nature": ["vegetation", "terrain"],
"sky": ["sky"],
"void": ["unlabeled", "ego vehicle", "rectification border", "out of roi", "static", "dynamic", "ground"]
},
"cityscapes_mapping": {
"0": 7, "1": 7, "2": 7, "3": 7, "4": 7, "5": 7, "6": 7,
"7": 0, "8": 0, "9": 0, "10": 0,
"11": 3, "12": 3, "13": 3, "14": 3, "15": 3, "16": 3,
"17": 4, "18": 4, "19": 4, "20": 4,
"21": 5, "22": 5,
"23": 6,
"24": 1, "25": 1,
"26": 2, "27": 2, "28": 2, "29": 2, "30": 2, "31": 2, "32": 2, "33": 2
},
"id_to_label": {
"0": "unlabeled",
"1": "ego vehicle",
"2": "rectification border",
"3": "out of roi",
"4": "static",
"5": "dynamic",
"6": "ground",
"7": "road",
"8": "sidewalk",
"9": "parking",
"10": "rail track",
"11": "building",
"12": "wall",
"13": "fence",
"14": "guard rail",
"15": "bridge",
"16": "tunnel",
"17": "pole",
"18": "pole group",
"19": "traffic light",
"20": "traffic sign",
"21": "vegetation",
"22": "terrain",
"23": "sky",
"24": "person",
"25": "rider",
"26": "car",
"27": "truck",
"28": "bus",
"29": "caravan",
"30": "trailer",
"31": "train",
"32": "motorcycle",
"33": "bicycle"
},
"group_colors": [
[128, 64, 128], [220, 20, 60], [0, 0, 142], [70, 70, 70],
[220, 220, 0], [107, 142, 35], [70, 130, 180], [0, 0, 0]
],
"group_names": ["flat", "human", "vehicle", "construction", "object", "nature", "sky", "void"]
}

View file

@ -1,47 +1,47 @@
version: '3.8'
services:
street-vision-api:
# ✅ PRODUCTION: Image depuis Docker Hub
image: grgmdmn/street-vision_api:latest
container_name: street_vision_api
ports:
- "${NGINX_PORT:-8080}:${NGINX_PORT:-8080}" # Port nginx configurable
environment:
# Configuration du port nginx
NGINX_PORT: "${NGINX_PORT:-8080}"
# Configuration MLflow pour le suivi des modèles
MLFLOW_TRACKING_URI: "${MLFLOW_TRACKING_URI}" # ex: https://mlflow.domain.com
MLFLOW_S3_ENDPOINT_URL: "${MLFLOW_S3_ENDPOINT_URL}" # ex: url MinIO ou S3
AWS_ACCESS_KEY_ID: "${AWS_ACCESS_KEY_ID}" # clé ID S3
AWS_SECRET_ACCESS_KEY: "${AWS_SECRET_ACCESS_KEY}" # clé secrète S3
# Configuration email pour notifications (optionnel)
SMTP_SERVER: "${SMTP_SERVER:-}" # serveur SMTP
SMTP_PORT: "${SMTP_PORT:-587}" # port SMTP (ex: 587)
SMTP_EMAIL: "${SMTP_EMAIL:-}" # email expéditeur
SMTP_PASSWORD: "${SMTP_PASSWORD:-}" # mot de passe SMTP
SMTP_FROM_ALIAS: "${SMTP_FROM_ALIAS:-Street Vision API}" # alias (optionnel)
ADMIN_EMAIL: "${ADMIN_EMAIL:-}" # email admin destinataire
# URL de base de l'API (utilisée par Streamlit pour rediriger vers FastAPI)
MULTISEG_API_BASE_URL: "${MULTISEG_API_BASE_URL}" # ex: https://vision.domain.com/api
# Pour une mise à jour automatique par watchtower
labels:
com.centurylinklabs.watchtower.enable: "true"
# Seulement si vous avez un reverse proxy server
# networks:
# - swag
restart: unless-stopped
# Seulement si vous avez un reverse proxy server
# networks:
# swag:
# external: true
version: '3.8'
services:
street-vision-api:
# ✅ PRODUCTION: Image depuis Docker Hub
image: grgmdmn/street-vision_api:latest
container_name: street_vision_api
ports:
- "${NGINX_PORT:-8080}:${NGINX_PORT:-8080}" # Port nginx configurable
environment:
# Configuration du port nginx
NGINX_PORT: "${NGINX_PORT:-8080}"
# Configuration MLflow pour le suivi des modèles
MLFLOW_TRACKING_URI: "${MLFLOW_TRACKING_URI}" # ex: https://mlflow.domain.com
MLFLOW_S3_ENDPOINT_URL: "${MLFLOW_S3_ENDPOINT_URL}" # ex: url MinIO ou S3
AWS_ACCESS_KEY_ID: "${AWS_ACCESS_KEY_ID}" # clé ID S3
AWS_SECRET_ACCESS_KEY: "${AWS_SECRET_ACCESS_KEY}" # clé secrète S3
# Configuration email pour notifications (optionnel)
SMTP_SERVER: "${SMTP_SERVER:-}" # serveur SMTP
SMTP_PORT: "${SMTP_PORT:-587}" # port SMTP (ex: 587)
SMTP_EMAIL: "${SMTP_EMAIL:-}" # email expéditeur
SMTP_PASSWORD: "${SMTP_PASSWORD:-}" # mot de passe SMTP
SMTP_FROM_ALIAS: "${SMTP_FROM_ALIAS:-Street Vision API}" # alias (optionnel)
ADMIN_EMAIL: "${ADMIN_EMAIL:-}" # email admin destinataire
# URL de base de l'API (utilisée par Streamlit pour rediriger vers FastAPI)
MULTISEG_API_BASE_URL: "${MULTISEG_API_BASE_URL}" # ex: https://vision.domain.com/api
# Pour une mise à jour automatique par watchtower
labels:
com.centurylinklabs.watchtower.enable: "true"
# Seulement si vous avez un reverse proxy server
# networks:
# - swag
restart: unless-stopped
# Seulement si vous avez un reverse proxy server
# networks:
# swag:
# external: true

View file

@ -1,230 +1,230 @@
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Cahier des Charges Dashboard</title>
<style>
body {
font-family: 'Segoe UI', Arial, sans-serif;
margin: 0;
padding: 20px;
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
min-height: 100vh;
display: flex;
justify-content: center;
align-items: center;
}
.container {
background: white;
border-radius: 15px;
padding: 30px;
box-shadow: 0 15px 35px rgba(0,0,0,0.1);
max-width: 950px;
width: 100%;
}
.title {
text-align: center;
color: #2c3e50;
font-size: 28px;
font-weight: bold;
margin-bottom: 10px;
}
.subtitle {
text-align: center;
color: #7f8c8d;
font-size: 16px;
margin-bottom: 25px;
font-style: italic;
}
table {
width: 100%;
border-collapse: collapse;
margin-bottom: 20px;
font-size: 14px;
}
th {
background: linear-gradient(135deg, #3498db, #2980b9);
color: white;
font-weight: bold;
font-size: 13px;
text-transform: uppercase;
padding: 15px 12px;
text-align: center;
border: 2px solid white;
}
td {
padding: 12px;
border: 2px solid #ecf0f1;
vertical-align: top;
}
.category {
font-weight: bold;
text-align: center;
color: white;
font-size: 13px;
width: 20%;
}
.exploratoire {
background: linear-gradient(135deg, #e74c3c, #c0392b);
}
.comparaison {
background: linear-gradient(135deg, #f39c12, #d68910);
}
.accessibilite {
background: linear-gradient(135deg, #27ae60, #229954);
}
.technique {
background: linear-gradient(135deg, #8e44ad, #7d3c98);
}
.requirement {
font-size: 13px;
line-height: 1.4;
color: #2c3e50;
}
.implementation {
font-size: 13px;
line-height: 1.4;
color: #2c3e50;
font-style: italic;
}
.tech-stack {
margin-top: 20px;
background: linear-gradient(135deg, #f8f9fa, #e9ecef);
border-radius: 10px;
padding: 20px;
border-left: 5px solid #6c757d;
}
.tech-stack h3 {
color: #495057;
margin-top: 0;
font-size: 18px;
}
.tech-items {
display: flex;
flex-wrap: wrap;
gap: 10px;
margin-top: 10px;
}
.tech-item {
background: #6c757d;
color: white;
padding: 5px 12px;
border-radius: 15px;
font-size: 12px;
font-weight: bold;
}
</style>
</head>
<body>
<div class="container">
<div class="title">Cahier des Charges Dashboard Interactif</div>
<div class="subtitle">Spécifications et implémentation - Projet DataSpace</div>
<table>
<thead>
<tr>
<th style="width: 20%;">Catégorie</th>
<th style="width: 45%;">Exigences Projet</th>
<th style="width: 35%;">Implémentation</th>
</tr>
</thead>
<tbody>
<tr>
<td class="category exploratoire">ANALYSE EXPLORATOIRE</td>
<td class="requirement">
• Visualisation contenu dataset<br>
• Analyses statistiques describe()<br>
• 2+ graphiques interactifs<br>
• Distribution des classes
</td>
<td class="implementation">
Streamlit + Plotly interactif<br>
Métriques dataset Cityscapes<br>
Distribution pixel-wise classes<br>
Graphiques responsive
</td>
</tr>
<tr>
<td class="category comparaison">COMPARAISON MODÈLES</td>
<td class="requirement">
• Sélection données entrée<br>
• Upload images personnalisées<br>
• Prédiction temps réel<br>
• Affichage résultats comparatifs
</td>
<td class="implementation">
Interface upload + dropdown<br>
Inférence FPN vs SegFormer<br>
Visualisation masques côte-à-côte<br>
Métriques temps d'exécution
</td>
</tr>
<tr>
<td class="category accessibilite">ACCESSIBILITÉ WCAG</td>
<td class="requirement">
• Critères WCAG essentiels<br>
• Contraste couleurs<br>
• Navigation clavier<br>
• Labels descriptifs
</td>
<td class="implementation">
Palette couleurs accessibles<br>
Alt-text images générées<br>
Semantic HTML structure<br>
Focus indicators
</td>
</tr>
<tr>
<td class="category technique">DÉPLOIEMENT CLOUD</td>
<td class="requirement">
• Application déployée online<br>
• Interface responsive<br>
• Performance acceptable<br>
• Code source accessible
</td>
<td class="implementation">
Serveur NAS personnel (Intel N100)<br>
Streamlit containerisé<br>
Optimisation modèles CPU<br>
Repository GitHub documenté
</td>
</tr>
</tbody>
</table>
<div class="tech-stack">
<h3>🛠️ Stack Technique</h3>
<div class="tech-items">
<div class="tech-item">FastAPI</div>
<div class="tech-item">Streamlit</div>
<div class="tech-item">PyTorch</div>
<div class="tech-item">Plotly</div>
<div class="tech-item">PIL/OpenCV</div>
<div class="tech-item">Docker</div>
<div class="tech-item">Intel N100</div>
</div>
</div>
</div>
</body>
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Cahier des Charges Dashboard</title>
<style>
body {
font-family: 'Segoe UI', Arial, sans-serif;
margin: 0;
padding: 20px;
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
min-height: 100vh;
display: flex;
justify-content: center;
align-items: center;
}
.container {
background: white;
border-radius: 15px;
padding: 30px;
box-shadow: 0 15px 35px rgba(0,0,0,0.1);
max-width: 950px;
width: 100%;
}
.title {
text-align: center;
color: #2c3e50;
font-size: 28px;
font-weight: bold;
margin-bottom: 10px;
}
.subtitle {
text-align: center;
color: #7f8c8d;
font-size: 16px;
margin-bottom: 25px;
font-style: italic;
}
table {
width: 100%;
border-collapse: collapse;
margin-bottom: 20px;
font-size: 14px;
}
th {
background: linear-gradient(135deg, #3498db, #2980b9);
color: white;
font-weight: bold;
font-size: 13px;
text-transform: uppercase;
padding: 15px 12px;
text-align: center;
border: 2px solid white;
}
td {
padding: 12px;
border: 2px solid #ecf0f1;
vertical-align: top;
}
.category {
font-weight: bold;
text-align: center;
color: white;
font-size: 13px;
width: 20%;
}
.exploratoire {
background: linear-gradient(135deg, #e74c3c, #c0392b);
}
.comparaison {
background: linear-gradient(135deg, #f39c12, #d68910);
}
.accessibilite {
background: linear-gradient(135deg, #27ae60, #229954);
}
.technique {
background: linear-gradient(135deg, #8e44ad, #7d3c98);
}
.requirement {
font-size: 13px;
line-height: 1.4;
color: #2c3e50;
}
.implementation {
font-size: 13px;
line-height: 1.4;
color: #2c3e50;
font-style: italic;
}
.tech-stack {
margin-top: 20px;
background: linear-gradient(135deg, #f8f9fa, #e9ecef);
border-radius: 10px;
padding: 20px;
border-left: 5px solid #6c757d;
}
.tech-stack h3 {
color: #495057;
margin-top: 0;
font-size: 18px;
}
.tech-items {
display: flex;
flex-wrap: wrap;
gap: 10px;
margin-top: 10px;
}
.tech-item {
background: #6c757d;
color: white;
padding: 5px 12px;
border-radius: 15px;
font-size: 12px;
font-weight: bold;
}
</style>
</head>
<body>
<div class="container">
<div class="title">Cahier des Charges Dashboard Interactif</div>
<div class="subtitle">Spécifications et implémentation - Projet DataSpace</div>
<table>
<thead>
<tr>
<th style="width: 20%;">Catégorie</th>
<th style="width: 45%;">Exigences Projet</th>
<th style="width: 35%;">Implémentation</th>
</tr>
</thead>
<tbody>
<tr>
<td class="category exploratoire">ANALYSE EXPLORATOIRE</td>
<td class="requirement">
• Visualisation contenu dataset<br>
• Analyses statistiques describe()<br>
• 2+ graphiques interactifs<br>
• Distribution des classes
</td>
<td class="implementation">
Streamlit + Plotly interactif<br>
Métriques dataset Cityscapes<br>
Distribution pixel-wise classes<br>
Graphiques responsive
</td>
</tr>
<tr>
<td class="category comparaison">COMPARAISON MODÈLES</td>
<td class="requirement">
• Sélection données entrée<br>
• Upload images personnalisées<br>
• Prédiction temps réel<br>
• Affichage résultats comparatifs
</td>
<td class="implementation">
Interface upload + dropdown<br>
Inférence FPN vs SegFormer<br>
Visualisation masques côte-à-côte<br>
Métriques temps d'exécution
</td>
</tr>
<tr>
<td class="category accessibilite">ACCESSIBILITÉ WCAG</td>
<td class="requirement">
• Critères WCAG essentiels<br>
• Contraste couleurs<br>
• Navigation clavier<br>
• Labels descriptifs
</td>
<td class="implementation">
Palette couleurs accessibles<br>
Alt-text images générées<br>
Semantic HTML structure<br>
Focus indicators
</td>
</tr>
<tr>
<td class="category technique">DÉPLOIEMENT CLOUD</td>
<td class="requirement">
• Application déployée online<br>
• Interface responsive<br>
• Performance acceptable<br>
• Code source accessible
</td>
<td class="implementation">
Serveur NAS personnel (Intel N100)<br>
Streamlit containerisé<br>
Optimisation modèles CPU<br>
Repository GitHub documenté
</td>
</tr>
</tbody>
</table>
<div class="tech-stack">
<h3>🛠️ Stack Technique</h3>
<div class="tech-items">
<div class="tech-item">FastAPI</div>
<div class="tech-item">Streamlit</div>
<div class="tech-item">PyTorch</div>
<div class="tech-item">Plotly</div>
<div class="tech-item">PIL/OpenCV</div>
<div class="tech-item">Docker</div>
<div class="tech-item">Intel N100</div>
</div>
</div>
</div>
</body>
</html>

View file

@ -1,295 +1,295 @@
# Note Méthodologique : Preuve de concept SegFormer vs FPN
## Dataset retenu
### Cityscapes Dataset : Référence en Segmentation Urbaine
Le **Cityscapes Dataset** constitue la référence internationale pour l'évaluation des algorithmes de segmentation sémantique en environnement urbain. Développé par l'Université de Tübingen et Mercedes-Benz, ce dataset comprend **25,000 images** haute résolution (2048×1024 pixels) capturées dans 50 villes allemandes et suisses.
**Composition du dataset :**
- **Train** : 2,975 images finement annotées
- **Validation** : 500 images avec annotations de référence
- **Test** : 1,525 images (annotations non-publiques)
- **Coarse** : 20,000 images avec annotations grossières
**Architecture de classes hiérarchique :**
Le dataset organise 34 classes détaillées en **8 méta-classes** pour la segmentation :
| Méta-classe | Classes incluses | Importance |
|-------------|------------------|------------|
| **Flat** | Route, trottoir, parkings | Navigation de base |
| **Human** | Piéton, cycliste | **Sécurité critique** |
| **Vehicle** | Voiture, camion, bus, train | Obstacles dynamiques |
| **Construction** | Bâtiment, mur, clôture, pont | Structure urbaine |
| **Object** | Poteau, feu, panneau | Signalétique |
| **Nature** | Végétation, terrain | Environnement |
| **Sky** | Ciel | Contexte |
| **Void** | Zones non-définies | Exclusion |
**Particularité méthodologique critique :**
Contrairement au protocole original préservant le ratio 2:1 natif (2048×1024), nos expérimentations utilisent des **images carrées (1:1)** aux résolutions 512×512 et 768×768. Cette déformation géométrique, motivée par les contraintes GPU T4, permet d'analyser l'impact du ratio d'image sur les différentes philosophies architecturales (CNN vs Transformer).
---
## Les concepts de l'algorithme récent
### SegFormer : Architecture Transformer Vision-Optimisée Temps Réel
**SegFormer** représente une avancée dans la segmentation sémantique en introduisant une architecture **Transformer** spécifiquement conçue pour l'efficacité computationnelle, contrairement aux approches Transformer classiques gourmandes en ressources.
### Innovations Architecturales Clés
**1. Encodeur Hiérarchique Sans Encodage Positionnel**
L'encodeur SegFormer **abandonne les encodages positionnels** au profit d'une architecture hiérarchique qui capture naturellement les relations spatiales :
$$\text{Feature Maps} = \{F_1, F_2, F_3, F_4\}$$
avec résolutions $\{\frac{H}{4}, \frac{H}{8}, \frac{H}{16}, \frac{H}{32}\}$
**Efficient Self-Attention :**
Réduction de complexité par sous-échantillonnage des clés :
$$\text{Attention}(Q,K,V) = \text{Softmax}\left(\frac{QK^T}{\sqrt{d_k}}\right)V$$
avec complexité réduite de $\mathcal{O}(N^2)$ à $\mathcal{O}\left(\frac{N^2}{R}\right)$ où $R$ est le facteur de réduction.
**2. Mix-FFN : Hybridation CNN-Transformer**
Innovation clé : intégration de **convolutions 3×3** dans les couches Feed-Forward :
$$\text{Mix-FFN}(x) = \text{MLP}(\text{GELU}(\text{Conv}_{3×3}(\text{MLP}(x)) + x))$$
Cette approche permet :
- **Élimination totale des encodages positionnels**
- **Capture locale + compréhension globale** simultanées
- **Robustesse aux variations de résolution** d'entrée
**3. Décodeur MLP Ultra-Léger**
Simplification drastique vs décodeurs complexes traditionnels :
$$\text{Seg} = \text{MLP}\left(\text{Concat}[\text{Upsample}(F_1), F_2, F_3, F_4]\right)$$
**Avantages :**
- **Réduction massive des paramètres** : Focus sur l'encodeur performant
- **Inférence accélérée** : Décodeur 10× plus rapide que ASPP/PSP
- **Architecture unifiée** : Traitement multi-échelle sans modules ad-hoc
### Positionnement Temps Réel vs État de l'Art
**Analyse critique du benchmark original :**
Le papier SegFormer révèle que **SegFormer-B0** (3.7M paramètres) atteint **75.3% mIoU** sur Cityscapes à résolution réduite (côté court 768px), égalant **DeepLabv3+ + MobileNetV2** (75.2% mIoU) à résolution pleine. Cette **efficacité computationnelle supérieure** constitue l'argument central de notre hypothèse de recherche.
**Hypothèse de transfert :**
Si DeepLabv3+ surpasse théoriquement FPN, alors SegFormer-B0 devrait également surpasser notre baseline FPN+EfficientNetB0 (78.67% mIoU), particulièrement à 768×768 pixels.
---
## La modélisation
### Méthodologie Expérimentale Adaptée
**Contraintes et adaptations :**
Notre protocole d'évaluation diffère substantiellement du papier original pour s'adapter aux contraintes pratiques :
**Configuration matérielle :**
- **Plateforme** : Google Colab Pro avec GPU T4 (15Go VRAM)
- **Framework** : Migration TensorFlow/Keras → PyTorch + Segmentation Models PyTorch
- **Contraintes** : Plan payant avec unités de calcul limitées
**Déformation géométrique :**
- **Protocole original** : Préservation ratio 2:1 natif Cityscapes
- **Notre protocole** : Déformation vers ratio 1:1 (images carrées)
- **Résolutions testées** : 512×512 et 768×768 pixels
- **Impact attendu** : Analyse différentielle CNN vs Transformer sous contrainte géométrique
### Preprocessing et Modèles Pré-entraînés
**Modèles SegFormer (pré-entraînés ADE20K) :**
- **SegFormer-B0** : `segformer-b0-512x512-ade-160k` (3.7M paramètres)
- **SegFormer-B1** : `segformer-b1-512x512-ade-160k` (13.7M paramètres, exploration scaling)
**Modèles FPN (pré-entraînés ImageNet) :**
- **FPN+ResNet34** : 23.16M paramètres
- **FPN+EfficientNet-B0** : 5.76M paramètres (baseline de référence @224x224 : 74.6% mIoU)
### Configuration d'Entraînement Optimisée
**Configuration SegFormer :**
- **Loss Function** : Jaccard Loss pour optimisation IoU directe
- **Optimiseur** : AdamW (lr=1e-4, weight_decay=1e-4, spécialisé Transformers)
- **Scheduler** : Cosine Annealing (convergence douce, min_lr=1e-6)
- **Epochs** : Maximum 30 avec early stopping (patience=5)
**Configuration FPN :**
- **Loss Function** : Focal + Jaccard Loss combinées (poids 1:1)
- **Optimiseur** : Adam (lr=1.5e-4, weight_decay=1e-5, optimisé CNN)
- **Scheduler** : ReduceLROnPlateau (adaptation réactive, patience=4)
- **Epochs** : Maximum 20 avec early stopping (patience=7)
**Stratégie d'entraînement :**
Entraînement séquentiel des 4 modèles principaux à 512×512, puis scaling à 768×768 pour analyse comparative résolution/performance.
---
## Une synthèse des résultats
![mIoU + Accuracy](mIoU_accuracy.png)
*Fig.1: Mean IoU et Accuracy par expérience*
### Performance Comparative : SegFormer vs FPN sous Contrainte Géométrique
**Résultats principaux (mIoU sur Cityscapes Validation) :**
| **Modèle** | **mIoU** | **Gain vs Baseline** | **Paramètres** | **Taille** | **Temps CPU** |
|------------|----------|----------------------|----------------|------------|---------------|
| **SegFormer-B1** | **79.98%** | **+1.31%** | **13.68M** | **52MB** | **1.39s** |
| **FPN+ResNet34** | **79.22%** | **+0.55%** | **23.16M** | **88MB** | **0.73s** |
| **FPN+EfficientNet-B0** | **78.67%** | *baseline* | **5.76M** | **22MB** | **0.48s** |
| **SegFormer-B0** | **77.91%** | **-0.76%** | **3.72M** | **14MB** | **0.87s** |
*Temps d'inférence : CPU Intel Xeon @ 2.20GHz (2 vCPUs) Google Colab*
### Révélations Critiques : Impact du Ratio d'Image
**Résultat majeur inattendu :**
Contrairement aux prédictions du benchmark original, **SegFormer-B0 sous-performe face aux baselines FPN** sur images carrées (77.91% vs 78.67% mIoU). Cette observation révèle une **sensibilité architecturale différentielle** aux déformations géométriques.
**Hypothèse explicative - Robustesse géométrique :**
1. **CNN (FPN)** : Les convolutions avec leurs kernels fixes et pooling local gèrent naturellement les déformations géométriques
2. **Transformer (SegFormer)** : L'attention globale, optimisée sur ratio 2:1 natif, souffre de la perte d'information spatiale lors de la déformation 1:1
3. **Scaling architectural** : SegFormer-B1 compense cette limitation par sa capacité supérieure (+1.31% mIoU)
### Analyse Détaillée par Classes Sémantiques
![IoU Classe et Δ IoU par Classe](iou_delta_iou_per_class.png)
*Fig.2: IoU et Δ IoU par Classe entre SegFormer-B1 et FPN-ResNet34*
**Performance par méta-classes Cityscapes :**
| **Classe** | **SegFormer-B1** | **FPN+ResNet34** | **Gain** | **Analyse** |
|------------|-------------------|-------------------|----------|-------------|
| **Flat** | **93.35%** | **93.38%** | **-0.03%** | Performance équivalente |
| **Human** | **71.13%** | **69.35%** | **+1.78%** | ⭐ **Attention globale critique** |
| **Vehicle** | **88.80%** | **87.75%** | **+1.05%** | ⭐ **Contexte multi-échelle** |
| **Construction** | **85.94%** | **85.06%** | **+0.88%** | Structures complexes |
| **Object** | **49.24%** | **48.68%** | **+0.56%** | ⭐ **Signalétique petite taille** |
| **Nature** | **89.14%** | **88.13%** | **+1.01%** | Textures variées |
| **Sky** | **92.35%** | **91.67%** | **+0.68%** | Régions homogènes |
| **Void** | **69.89%** | **69.76%** | **+0.13%** | Zones ambiguës |
**Patterns d'amélioration SegFormer-B1 :**
- **Classes sécuritaires critiques** (Human +1.78%, Vehicle +1.05%) : Validation de l'attention globale pour objets contextuels
- **Objets petite taille** (Object +0.56%) : Meilleure capture multi-échelle vs convolutions locales
- **Performance équivalente** sur surfaces homogènes (Flat -0.03%)
### Performance Surprenante vs Benchmark Original
**Observation contre-intuitive :**
Nos modèles atteignent des performances **supérieures au papier original** malgré la contrainte géométrique @768x768 :
- **SegFormer-B0 : 77.91%** vs 75.3%
- **FPN baselines : 78.67-79.22%** vs DeepLabV3+ 75.2%
- **SegFormer-B1 : 79.98%** vs ~76-78% (en effectuant un scaling grossier B0→B1 en se basant sur l'écart de performances de B0-->B5)
**Hypothèses explicatives :**
1. **Optimisation du ratio 1:1** : Réduction de l'aire d'image (×2) concentre l'information spatiale
2. **Optimisation d'hyperparamètres** : Par exemple, utilisation de fonctions de perte Jaccard (+ Focal) ? Non mentionné dans SegFormer (2021) ni DeepLabV3 (2018)
3. **Encodeurs** : EfficientNetB0 à peine plus long que MobileNetV2 et performances au-dessus. ResNet34 au-dessus également mais plus lourd (peut-être pertinent en temps réel...?)
3. **Framework PyTorch** : Optimisations modernes vs implémentations TensorFlow du papier DeepLabV3+ (2018)
---
## L'analyse de la feature importance globale et locale du nouveau modèle
### Limitations Méthodologiques de l'Explicabilité Transformer
L'analyse d'explicabilité des architectures Transformer pour la segmentation dense représente un **défi technique majeur** dépassant le cadre de cette preuve de concept. Les mécanismes d'attention multi-têtes, Mix-FFN, et fusion hiérarchique créent des interactions complexes difficiles à décomposer causalement.
### Insights Architecturaux via Patterns de Performance
**Analyse indirecte par performance différentielle :**
Bien que l'explicabilité fine soit inaccessible, les patterns de performance révèlent les mécanismes sous-jacents :
1. **Attention globale validée** : Gains significatifs sur classes contextuelles (Human +1.78%, Vehicle +1.05%) suggèrent une **compréhension scénique** supérieure aux CNN
2. **Sensibilité géométrique** : Sous-performance SegFormer-B0 vs FPN sur images déformées révèle une **dépendance aux relations spatiales natives**
3. **Scaling architectural efficace** : Bond B0→B1 (+2.07% mIoU) confirme l'efficacité du scaling Transformer
**Limitation fondamentale :**
Les cartes d'attention ne correspondent pas nécessairement à l'importance causale réelle. Une explicabilité rigoureuse nécessiterait des approches spécialisées comme **Deep Taylor Decomposition** ou **Integrated Gradients** adaptées aux architectures hybrides CNN-Transformer.
---
## Limites et améliorations possibles
### Limitations Expérimentales Critiques
**1. Contraintes Protocolaires Majeures**
- **Déformation géométrique forcée** : Ratio 2:1→1:1 non-représentatif du déploiement réel
- **Résolutions limitées** : GPU T4 contraint l'exploration des résolutions supérieures (>768px). Augmentation importante de l'utilisation de VRAM et réduction drastique du `batch_size` --> entraînements plus longs (plus d'époques)
- **Framework migration** : TensorFlow→PyTorch peut introduire des biais de comparaison
- **Métriques d'évaluation** : Temps d'inférence CPU non-représentatifs du déploiement GPU optimisé
**2. Généralisation Limitée**
- **Dataset unique** : Évaluation exclusive sur Cityscapes urbain allemand
- **Conditions météo** : Uniquement conditions favorables (pas de nuit/intempéries)
- **Scaling incomplet** : SegFormer-B2+ non-testés faute de ressources computationnelles
### Améliorations Prioritaires Identifiées
**1. Robustesse Protocolaire**
- **Préservation ratio natif** : Tests sur images 2:1 sans déformation géométrique (contraintes budgétaires/temps limitant cette approche)
- **Résolutions supérieures** : Évaluation à 1024×512 ou résolutions natives pour validation écologique
- **Evaluation multi-dataset** : Validation BDD100K, Mapillary Vistas pour généralisation
**2. Scaling Architectural Complet**
- **SegFormer variants complets** : B2, B3, B4 pour validation des gains à tous les niveaux de complexité vs papier original
- **Évaluation différentielle** : Déterminer si les améliorations observées sont spécifiques aux modèles légers (B0-B1) ou généralisables aux variants lourds
- **Optimisations déploiement** : TensorRT, quantization FP16/INT8 pour inférence temps réel selon niveau de complexité
**3. Analyse Causale Approfondie**
1. **Prototypage rapide** : SegFormer-B1 comme référence architecturale moderne pour projets nécessitant performance maximale
2. **Contraintes embarquées** : FPN+EfficientNet-B0 optimal pour déploiement edge ultra-contraint à 768×768, avec évaluation requise à résolutions supérieures pour validation complète
3. **Adaptabilité clients** : Gamme SegFormer (B0-B1+) offrant scaling performance/ressources selon besoins spécifiques
### Perspectives de Déploiement Pratique
**Applications industrielles validées :**
1. **Prototypage rapide** : SegFormer-B1 comme référence architecturale moderne pour projets nécessitant performance maximale
2. **Contraintes embarquées** : FPN+EfficientNet-B0 optimal pour déploiement edge ultra-contraint à 768×768, avec évaluation requise à résolutions supérieures pour validation complète
3. **Adaptabilité clients** : Gamme SegFormer (B0-B1+) offrant scaling performance/ressources selon besoins spécifiques
**ROI technique contextuel :**
Cette preuve de concept valide l'intérêt des architectures Transformer tout en révélant leurs **sensibilités pratiques** (ratio d'image, scaling nécessaire). L'approche constitue une **base méthodologique** solide pour futurs développements production avec contraintes réelles explicitées.
---
## Conclusion Méthodologique
### Contribution Analytique Principale
Cette étude apporte une **perspective complémentaire critique** aux évaluations académiques standard en révélant :
1. **Impact géométrique différentiel** : Sensibilité CNN vs Transformer aux déformations d'image
2. **Scaling architectural requis** : Nécessité SegFormer-B1+ pour surpasser baselines CNN établies en ratio 1:1
3. **Trade-offs pratiques** : Compromis performance/efficacité sous contraintes réelles
### Validation des Hypothèses de Recherche
**Hypothèses confirmées :**
- ✅ **SegFormer-B1 surpasse FPN** (+1.31% mIoU) avec efficacité paramétrique supérieure
- ✅ **Amélioration classes critiques** validée (Human +1.78%, Vehicle +1.05%)
- ✅ **Architecture Transformer viable** pour segmentation temps réel avec scaling approprié
**Hypothèses infirmées :**
- ❌ **SegFormer-B0 sous-performant** vs FPN sur images 1:1
- ❌ **Robustesse géométrique** Transformer surestimée vs CNN
### Positionnement Scientifique
Cette preuve de concept se distingue par son **réalisme méthodologique** : elle expose les limitations pratiques des architectures d'avant-garde sous contraintes déploiement réelles, offrant une analyse **nuancée et reproductible** aux équipes techniques devant opérer des choix architecturaux informés.
# Note Méthodologique : Preuve de concept SegFormer vs FPN
## Dataset retenu
### Cityscapes Dataset : Référence en Segmentation Urbaine
Le **Cityscapes Dataset** constitue la référence internationale pour l'évaluation des algorithmes de segmentation sémantique en environnement urbain. Développé par l'Université de Tübingen et Mercedes-Benz, ce dataset comprend **25,000 images** haute résolution (2048×1024 pixels) capturées dans 50 villes allemandes et suisses.
**Composition du dataset :**
- **Train** : 2,975 images finement annotées
- **Validation** : 500 images avec annotations de référence
- **Test** : 1,525 images (annotations non-publiques)
- **Coarse** : 20,000 images avec annotations grossières
**Architecture de classes hiérarchique :**
Le dataset organise 34 classes détaillées en **8 méta-classes** pour la segmentation :
| Méta-classe | Classes incluses | Importance |
|-------------|------------------|------------|
| **Flat** | Route, trottoir, parkings | Navigation de base |
| **Human** | Piéton, cycliste | **Sécurité critique** |
| **Vehicle** | Voiture, camion, bus, train | Obstacles dynamiques |
| **Construction** | Bâtiment, mur, clôture, pont | Structure urbaine |
| **Object** | Poteau, feu, panneau | Signalétique |
| **Nature** | Végétation, terrain | Environnement |
| **Sky** | Ciel | Contexte |
| **Void** | Zones non-définies | Exclusion |
**Particularité méthodologique critique :**
Contrairement au protocole original préservant le ratio 2:1 natif (2048×1024), nos expérimentations utilisent des **images carrées (1:1)** aux résolutions 512×512 et 768×768. Cette déformation géométrique, motivée par les contraintes GPU T4, permet d'analyser l'impact du ratio d'image sur les différentes philosophies architecturales (CNN vs Transformer).
---
## Les concepts de l'algorithme récent
### SegFormer : Architecture Transformer Vision-Optimisée Temps Réel
**SegFormer** représente une avancée dans la segmentation sémantique en introduisant une architecture **Transformer** spécifiquement conçue pour l'efficacité computationnelle, contrairement aux approches Transformer classiques gourmandes en ressources.
### Innovations Architecturales Clés
**1. Encodeur Hiérarchique Sans Encodage Positionnel**
L'encodeur SegFormer **abandonne les encodages positionnels** au profit d'une architecture hiérarchique qui capture naturellement les relations spatiales :
$$\text{Feature Maps} = \{F_1, F_2, F_3, F_4\}$$
avec résolutions $\{\frac{H}{4}, \frac{H}{8}, \frac{H}{16}, \frac{H}{32}\}$
**Efficient Self-Attention :**
Réduction de complexité par sous-échantillonnage des clés :
$$\text{Attention}(Q,K,V) = \text{Softmax}\left(\frac{QK^T}{\sqrt{d_k}}\right)V$$
avec complexité réduite de $\mathcal{O}(N^2)$ à $\mathcal{O}\left(\frac{N^2}{R}\right)$ où $R$ est le facteur de réduction.
**2. Mix-FFN : Hybridation CNN-Transformer**
Innovation clé : intégration de **convolutions 3×3** dans les couches Feed-Forward :
$$\text{Mix-FFN}(x) = \text{MLP}(\text{GELU}(\text{Conv}_{3×3}(\text{MLP}(x)) + x))$$
Cette approche permet :
- **Élimination totale des encodages positionnels**
- **Capture locale + compréhension globale** simultanées
- **Robustesse aux variations de résolution** d'entrée
**3. Décodeur MLP Ultra-Léger**
Simplification drastique vs décodeurs complexes traditionnels :
$$\text{Seg} = \text{MLP}\left(\text{Concat}[\text{Upsample}(F_1), F_2, F_3, F_4]\right)$$
**Avantages :**
- **Réduction massive des paramètres** : Focus sur l'encodeur performant
- **Inférence accélérée** : Décodeur 10× plus rapide que ASPP/PSP
- **Architecture unifiée** : Traitement multi-échelle sans modules ad-hoc
### Positionnement Temps Réel vs État de l'Art
**Analyse critique du benchmark original :**
Le papier SegFormer révèle que **SegFormer-B0** (3.7M paramètres) atteint **75.3% mIoU** sur Cityscapes à résolution réduite (côté court 768px), égalant **DeepLabv3+ + MobileNetV2** (75.2% mIoU) à résolution pleine. Cette **efficacité computationnelle supérieure** constitue l'argument central de notre hypothèse de recherche.
**Hypothèse de transfert :**
Si DeepLabv3+ surpasse théoriquement FPN, alors SegFormer-B0 devrait également surpasser notre baseline FPN+EfficientNetB0 (78.67% mIoU), particulièrement à 768×768 pixels.
---
## La modélisation
### Méthodologie Expérimentale Adaptée
**Contraintes et adaptations :**
Notre protocole d'évaluation diffère substantiellement du papier original pour s'adapter aux contraintes pratiques :
**Configuration matérielle :**
- **Plateforme** : Google Colab Pro avec GPU T4 (15Go VRAM)
- **Framework** : Migration TensorFlow/Keras → PyTorch + Segmentation Models PyTorch
- **Contraintes** : Plan payant avec unités de calcul limitées
**Déformation géométrique :**
- **Protocole original** : Préservation ratio 2:1 natif Cityscapes
- **Notre protocole** : Déformation vers ratio 1:1 (images carrées)
- **Résolutions testées** : 512×512 et 768×768 pixels
- **Impact attendu** : Analyse différentielle CNN vs Transformer sous contrainte géométrique
### Preprocessing et Modèles Pré-entraînés
**Modèles SegFormer (pré-entraînés ADE20K) :**
- **SegFormer-B0** : `segformer-b0-512x512-ade-160k` (3.7M paramètres)
- **SegFormer-B1** : `segformer-b1-512x512-ade-160k` (13.7M paramètres, exploration scaling)
**Modèles FPN (pré-entraînés ImageNet) :**
- **FPN+ResNet34** : 23.16M paramètres
- **FPN+EfficientNet-B0** : 5.76M paramètres (baseline de référence @224x224 : 74.6% mIoU)
### Configuration d'Entraînement Optimisée
**Configuration SegFormer :**
- **Loss Function** : Jaccard Loss pour optimisation IoU directe
- **Optimiseur** : AdamW (lr=1e-4, weight_decay=1e-4, spécialisé Transformers)
- **Scheduler** : Cosine Annealing (convergence douce, min_lr=1e-6)
- **Epochs** : Maximum 30 avec early stopping (patience=5)
**Configuration FPN :**
- **Loss Function** : Focal + Jaccard Loss combinées (poids 1:1)
- **Optimiseur** : Adam (lr=1.5e-4, weight_decay=1e-5, optimisé CNN)
- **Scheduler** : ReduceLROnPlateau (adaptation réactive, patience=4)
- **Epochs** : Maximum 20 avec early stopping (patience=7)
**Stratégie d'entraînement :**
Entraînement séquentiel des 4 modèles principaux à 512×512, puis scaling à 768×768 pour analyse comparative résolution/performance.
---
## Une synthèse des résultats
![mIoU + Accuracy](mIoU_accuracy.png)
*Fig.1: Mean IoU et Accuracy par expérience*
### Performance Comparative : SegFormer vs FPN sous Contrainte Géométrique
**Résultats principaux (mIoU sur Cityscapes Validation) :**
| **Modèle** | **mIoU** | **Gain vs Baseline** | **Paramètres** | **Taille** | **Temps CPU** |
|------------|----------|----------------------|----------------|------------|---------------|
| **SegFormer-B1** | **79.98%** | **+1.31%** | **13.68M** | **52MB** | **1.39s** |
| **FPN+ResNet34** | **79.22%** | **+0.55%** | **23.16M** | **88MB** | **0.73s** |
| **FPN+EfficientNet-B0** | **78.67%** | *baseline* | **5.76M** | **22MB** | **0.48s** |
| **SegFormer-B0** | **77.91%** | **-0.76%** | **3.72M** | **14MB** | **0.87s** |
*Temps d'inférence : CPU Intel Xeon @ 2.20GHz (2 vCPUs) Google Colab*
### Révélations Critiques : Impact du Ratio d'Image
**Résultat majeur inattendu :**
Contrairement aux prédictions du benchmark original, **SegFormer-B0 sous-performe face aux baselines FPN** sur images carrées (77.91% vs 78.67% mIoU). Cette observation révèle une **sensibilité architecturale différentielle** aux déformations géométriques.
**Hypothèse explicative - Robustesse géométrique :**
1. **CNN (FPN)** : Les convolutions avec leurs kernels fixes et pooling local gèrent naturellement les déformations géométriques
2. **Transformer (SegFormer)** : L'attention globale, optimisée sur ratio 2:1 natif, souffre de la perte d'information spatiale lors de la déformation 1:1
3. **Scaling architectural** : SegFormer-B1 compense cette limitation par sa capacité supérieure (+1.31% mIoU)
### Analyse Détaillée par Classes Sémantiques
![IoU Classe et Δ IoU par Classe](iou_delta_iou_per_class.png)
*Fig.2: IoU et Δ IoU par Classe entre SegFormer-B1 et FPN-ResNet34*
**Performance par méta-classes Cityscapes :**
| **Classe** | **SegFormer-B1** | **FPN+ResNet34** | **Gain** | **Analyse** |
|------------|-------------------|-------------------|----------|-------------|
| **Flat** | **93.35%** | **93.38%** | **-0.03%** | Performance équivalente |
| **Human** | **71.13%** | **69.35%** | **+1.78%** | ⭐ **Attention globale critique** |
| **Vehicle** | **88.80%** | **87.75%** | **+1.05%** | ⭐ **Contexte multi-échelle** |
| **Construction** | **85.94%** | **85.06%** | **+0.88%** | Structures complexes |
| **Object** | **49.24%** | **48.68%** | **+0.56%** | ⭐ **Signalétique petite taille** |
| **Nature** | **89.14%** | **88.13%** | **+1.01%** | Textures variées |
| **Sky** | **92.35%** | **91.67%** | **+0.68%** | Régions homogènes |
| **Void** | **69.89%** | **69.76%** | **+0.13%** | Zones ambiguës |
**Patterns d'amélioration SegFormer-B1 :**
- **Classes sécuritaires critiques** (Human +1.78%, Vehicle +1.05%) : Validation de l'attention globale pour objets contextuels
- **Objets petite taille** (Object +0.56%) : Meilleure capture multi-échelle vs convolutions locales
- **Performance équivalente** sur surfaces homogènes (Flat -0.03%)
### Performance Surprenante vs Benchmark Original
**Observation contre-intuitive :**
Nos modèles atteignent des performances **supérieures au papier original** malgré la contrainte géométrique @768x768 :
- **SegFormer-B0 : 77.91%** vs 75.3%
- **FPN baselines : 78.67-79.22%** vs DeepLabV3+ 75.2%
- **SegFormer-B1 : 79.98%** vs ~76-78% (en effectuant un scaling grossier B0→B1 en se basant sur l'écart de performances de B0-->B5)
**Hypothèses explicatives :**
1. **Optimisation du ratio 1:1** : Réduction de l'aire d'image (×2) concentre l'information spatiale
2. **Optimisation d'hyperparamètres** : Par exemple, utilisation de fonctions de perte Jaccard (+ Focal) ? Non mentionné dans SegFormer (2021) ni DeepLabV3 (2018)
3. **Encodeurs** : EfficientNetB0 à peine plus long que MobileNetV2 et performances au-dessus. ResNet34 au-dessus également mais plus lourd (peut-être pertinent en temps réel...?)
3. **Framework PyTorch** : Optimisations modernes vs implémentations TensorFlow du papier DeepLabV3+ (2018)
---
## L'analyse de la feature importance globale et locale du nouveau modèle
### Limitations Méthodologiques de l'Explicabilité Transformer
L'analyse d'explicabilité des architectures Transformer pour la segmentation dense représente un **défi technique majeur** dépassant le cadre de cette preuve de concept. Les mécanismes d'attention multi-têtes, Mix-FFN, et fusion hiérarchique créent des interactions complexes difficiles à décomposer causalement.
### Insights Architecturaux via Patterns de Performance
**Analyse indirecte par performance différentielle :**
Bien que l'explicabilité fine soit inaccessible, les patterns de performance révèlent les mécanismes sous-jacents :
1. **Attention globale validée** : Gains significatifs sur classes contextuelles (Human +1.78%, Vehicle +1.05%) suggèrent une **compréhension scénique** supérieure aux CNN
2. **Sensibilité géométrique** : Sous-performance SegFormer-B0 vs FPN sur images déformées révèle une **dépendance aux relations spatiales natives**
3. **Scaling architectural efficace** : Bond B0→B1 (+2.07% mIoU) confirme l'efficacité du scaling Transformer
**Limitation fondamentale :**
Les cartes d'attention ne correspondent pas nécessairement à l'importance causale réelle. Une explicabilité rigoureuse nécessiterait des approches spécialisées comme **Deep Taylor Decomposition** ou **Integrated Gradients** adaptées aux architectures hybrides CNN-Transformer.
---
## Limites et améliorations possibles
### Limitations Expérimentales Critiques
**1. Contraintes Protocolaires Majeures**
- **Déformation géométrique forcée** : Ratio 2:1→1:1 non-représentatif du déploiement réel
- **Résolutions limitées** : GPU T4 contraint l'exploration des résolutions supérieures (>768px). Augmentation importante de l'utilisation de VRAM et réduction drastique du `batch_size` --> entraînements plus longs (plus d'époques)
- **Framework migration** : TensorFlow→PyTorch peut introduire des biais de comparaison
- **Métriques d'évaluation** : Temps d'inférence CPU non-représentatifs du déploiement GPU optimisé
**2. Généralisation Limitée**
- **Dataset unique** : Évaluation exclusive sur Cityscapes urbain allemand
- **Conditions météo** : Uniquement conditions favorables (pas de nuit/intempéries)
- **Scaling incomplet** : SegFormer-B2+ non-testés faute de ressources computationnelles
### Améliorations Prioritaires Identifiées
**1. Robustesse Protocolaire**
- **Préservation ratio natif** : Tests sur images 2:1 sans déformation géométrique (contraintes budgétaires/temps limitant cette approche)
- **Résolutions supérieures** : Évaluation à 1024×512 ou résolutions natives pour validation écologique
- **Evaluation multi-dataset** : Validation BDD100K, Mapillary Vistas pour généralisation
**2. Scaling Architectural Complet**
- **SegFormer variants complets** : B2, B3, B4 pour validation des gains à tous les niveaux de complexité vs papier original
- **Évaluation différentielle** : Déterminer si les améliorations observées sont spécifiques aux modèles légers (B0-B1) ou généralisables aux variants lourds
- **Optimisations déploiement** : TensorRT, quantization FP16/INT8 pour inférence temps réel selon niveau de complexité
**3. Analyse Causale Approfondie**
1. **Prototypage rapide** : SegFormer-B1 comme référence architecturale moderne pour projets nécessitant performance maximale
2. **Contraintes embarquées** : FPN+EfficientNet-B0 optimal pour déploiement edge ultra-contraint à 768×768, avec évaluation requise à résolutions supérieures pour validation complète
3. **Adaptabilité clients** : Gamme SegFormer (B0-B1+) offrant scaling performance/ressources selon besoins spécifiques
### Perspectives de Déploiement Pratique
**Applications industrielles validées :**
1. **Prototypage rapide** : SegFormer-B1 comme référence architecturale moderne pour projets nécessitant performance maximale
2. **Contraintes embarquées** : FPN+EfficientNet-B0 optimal pour déploiement edge ultra-contraint à 768×768, avec évaluation requise à résolutions supérieures pour validation complète
3. **Adaptabilité clients** : Gamme SegFormer (B0-B1+) offrant scaling performance/ressources selon besoins spécifiques
**ROI technique contextuel :**
Cette preuve de concept valide l'intérêt des architectures Transformer tout en révélant leurs **sensibilités pratiques** (ratio d'image, scaling nécessaire). L'approche constitue une **base méthodologique** solide pour futurs développements production avec contraintes réelles explicitées.
---
## Conclusion Méthodologique
### Contribution Analytique Principale
Cette étude apporte une **perspective complémentaire critique** aux évaluations académiques standard en révélant :
1. **Impact géométrique différentiel** : Sensibilité CNN vs Transformer aux déformations d'image
2. **Scaling architectural requis** : Nécessité SegFormer-B1+ pour surpasser baselines CNN établies en ratio 1:1
3. **Trade-offs pratiques** : Compromis performance/efficacité sous contraintes réelles
### Validation des Hypothèses de Recherche
**Hypothèses confirmées :**
- ✅ **SegFormer-B1 surpasse FPN** (+1.31% mIoU) avec efficacité paramétrique supérieure
- ✅ **Amélioration classes critiques** validée (Human +1.78%, Vehicle +1.05%)
- ✅ **Architecture Transformer viable** pour segmentation temps réel avec scaling approprié
**Hypothèses infirmées :**
- ❌ **SegFormer-B0 sous-performant** vs FPN sur images 1:1
- ❌ **Robustesse géométrique** Transformer surestimée vs CNN
### Positionnement Scientifique
Cette preuve de concept se distingue par son **réalisme méthodologique** : elle expose les limitations pratiques des architectures d'avant-garde sous contraintes déploiement réelles, offrant une analyse **nuancée et reproductible** aux équipes techniques devant opérer des choix architecturaux informés.
L'approche constitue une **base technique solide** pour futurs développements industriels nécessitant des compromis éclairés entre innovation architecturale et contraintes opérationnelles.

View file

@ -1,77 +1,77 @@
# Plan Prévisionnel - Preuve de Concept Segmentation Sémantique
**Projet** : Amélioration de la segmentation sémantique temps réel avec SegFormer
---
## Dataset Retenu
**Cityscapes** : Dataset de référence pour la segmentation sémantique de scènes urbaines comprenant 2975 images haute résolution (2048×1024) annotées pixel par pixel. Les images sont capturées dans **50 villes allemandes différentes** avec **34 classes principales** que nous regroupons en **8 catégories pertinentes** (flat, vehicle, human, construction, object, nature, sky, void).
**Particularité méthodologique** : Les images seront testées aux résolutions 512×512 et 768×768 avec **déformation du ratio d'origine** (passage de 2:1 à 1:1) pour optimiser les contraintes computationnelles GPU T4. Cette modification permettra d'analyser l'impact du ratio d'image sur les différentes architectures.
---
## Modèle Envisagé
### Algorithme : SegFormer (Focus Temps Réel)
**Justifications du choix :**
SegFormer (Xie et al., 2021) représente une approche Transformer vision-optimisée pour la segmentation sémantique. **L'analyse du benchmark Cityscapes révèle que SegFormer-B0 égale les performances de DeepLabv3+** (75.3% vs 75.2% mIoU) tout en fonctionnant à **résolution réduite** (côté court 768px vs résolution pleine). Cette efficacité computationnelle supérieure suggère un potentiel d'amélioration face à notre baseline FPN, DeepLabv3+ étant théoriquement plus performant que FPN.
**Objectif et hypothèses de recherche :**
1. **SegFormer-B0** devrait surpasser FPN+EfficientNetB0 (78.67% mIoU baseline) grâce à l'attention globale native
2. **SegFormer-B1** permettra d'explorer le scaling architectural (non documenté dans le papier original)
3. **Impact du ratio d'image** : Analyser comment la déformation 2:1→1:1 affecte les architectures CNN vs Transformer
**Contraintes et adaptations :**
- Migration framework obligatoire : TensorFlow/Keras → PyTorch pour accès aux modèles SegFormer récents
- Résolutions contraintes par GPU T4 : 512×512 et 768×768 maximum
- Protocole différent du papier original : images carrées vs rectangulaires natives
---
## Références Bibliographiques
1. **Xie, E., Wang, W., Yu, Z., et al.** (2021). *SegFormer: Simple and Efficient Design for Semantic Segmentation with Transformers*. NeurIPS 2021. [Architecture Transformer de référence]
2. **Chen, L.C., Zhu, Y., Papandreou, G., et al.** (2018). *Encoder-Decoder with Atrous Separable Convolution for Semantic Image Segmentation*. ECCV 2018. [Baseline comparative DeepLabv3+]
3. **Cordts, M., Omran, M., Ramos, S., et al.** (2016). *The Cityscapes Dataset for Semantic Urban Scene Understanding*. CVPR 2016. [Dataset de référence]
---
## Explication de la Démarche de Test
### Méthode Baseline
**FPN + EfficientNetB0/ResNet34** : Réentraînement des modèles du projet précédent aux nouvelles résolutions 512×512 et 768×768 avec déformation du ratio d'image. Performance baseline FPN+EfficientNetB0 : 78.67% mIoU (baseline de référence).
### Méthode de Test SegFormer
**Évaluation comparative temps réel** :
1. **SegFormer-B0** : Modèle compact ciblé (3.7M paramètres) pour validation du concept temps réel
2. **SegFormer-B1** : Exploration scaling architectural (13.7M paramètres) non documenté dans le papier
3. **Comparaison 512×512 vs 768×768** : Trade-off résolution/performance sur images déformées
4. **Analyse différentielle** : Impact du ratio d'image 1:1 vs 2:1 natif Cityscapes
**Métriques d'évaluation** :
- Mean IoU (métrique principale) et accuracy pixel-wise
- Performance par classe sémantique (focus classes critiques : Human, Vehicle)
- Temps d'inférence CPU/GPU pour validation déploiement pratique
### Preuve de Concept
**Interface Streamlit** déployée sur serveur NAS personnel (CPU Intel N100) permettant :
- Upload d'images urbaines avec **inférence comparative multi-modèles**
- **Visualisation côte-à-côte** : FPN+ResNet34 vs SegFormer-B1 (meilleurs représentants)
- Affichage temps d'inférence réel et métriques de performance détaillées
- **Analyse exploratoire dataset** : Distribution classes, statistiques pixel-wise interactives
**Hypothèses de validation** :
1. **SegFormer-B1 > FPN baselines** malgré contraintes ratio d'image
2. **SegFormer-B0 vs FPN** : Révélation possible de limitations Transformer sur images déformées
3. **Performances générales** potentiellement supérieures au papier original grâce à l'optimisation ratio 1:1
**Code réutilisé** : Framework `segmentation_models_pytorch` pour les implémentations. **Application originale** : protocole d'évaluation sur images carrées et analyse comparative CNN vs Transformer sous contraintes géométriques spécifiques.
---
# Plan Prévisionnel - Preuve de Concept Segmentation Sémantique
**Projet** : Amélioration de la segmentation sémantique temps réel avec SegFormer
---
## Dataset Retenu
**Cityscapes** : Dataset de référence pour la segmentation sémantique de scènes urbaines comprenant 2975 images haute résolution (2048×1024) annotées pixel par pixel. Les images sont capturées dans **50 villes allemandes différentes** avec **34 classes principales** que nous regroupons en **8 catégories pertinentes** (flat, vehicle, human, construction, object, nature, sky, void).
**Particularité méthodologique** : Les images seront testées aux résolutions 512×512 et 768×768 avec **déformation du ratio d'origine** (passage de 2:1 à 1:1) pour optimiser les contraintes computationnelles GPU T4. Cette modification permettra d'analyser l'impact du ratio d'image sur les différentes architectures.
---
## Modèle Envisagé
### Algorithme : SegFormer (Focus Temps Réel)
**Justifications du choix :**
SegFormer (Xie et al., 2021) représente une approche Transformer vision-optimisée pour la segmentation sémantique. **L'analyse du benchmark Cityscapes révèle que SegFormer-B0 égale les performances de DeepLabv3+** (75.3% vs 75.2% mIoU) tout en fonctionnant à **résolution réduite** (côté court 768px vs résolution pleine). Cette efficacité computationnelle supérieure suggère un potentiel d'amélioration face à notre baseline FPN, DeepLabv3+ étant théoriquement plus performant que FPN.
**Objectif et hypothèses de recherche :**
1. **SegFormer-B0** devrait surpasser FPN+EfficientNetB0 (78.67% mIoU baseline) grâce à l'attention globale native
2. **SegFormer-B1** permettra d'explorer le scaling architectural (non documenté dans le papier original)
3. **Impact du ratio d'image** : Analyser comment la déformation 2:1→1:1 affecte les architectures CNN vs Transformer
**Contraintes et adaptations :**
- Migration framework obligatoire : TensorFlow/Keras → PyTorch pour accès aux modèles SegFormer récents
- Résolutions contraintes par GPU T4 : 512×512 et 768×768 maximum
- Protocole différent du papier original : images carrées vs rectangulaires natives
---
## Références Bibliographiques
1. **Xie, E., Wang, W., Yu, Z., et al.** (2021). *SegFormer: Simple and Efficient Design for Semantic Segmentation with Transformers*. NeurIPS 2021. [Architecture Transformer de référence]
2. **Chen, L.C., Zhu, Y., Papandreou, G., et al.** (2018). *Encoder-Decoder with Atrous Separable Convolution for Semantic Image Segmentation*. ECCV 2018. [Baseline comparative DeepLabv3+]
3. **Cordts, M., Omran, M., Ramos, S., et al.** (2016). *The Cityscapes Dataset for Semantic Urban Scene Understanding*. CVPR 2016. [Dataset de référence]
---
## Explication de la Démarche de Test
### Méthode Baseline
**FPN + EfficientNetB0/ResNet34** : Réentraînement des modèles du projet précédent aux nouvelles résolutions 512×512 et 768×768 avec déformation du ratio d'image. Performance baseline FPN+EfficientNetB0 : 78.67% mIoU (baseline de référence).
### Méthode de Test SegFormer
**Évaluation comparative temps réel** :
1. **SegFormer-B0** : Modèle compact ciblé (3.7M paramètres) pour validation du concept temps réel
2. **SegFormer-B1** : Exploration scaling architectural (13.7M paramètres) non documenté dans le papier
3. **Comparaison 512×512 vs 768×768** : Trade-off résolution/performance sur images déformées
4. **Analyse différentielle** : Impact du ratio d'image 1:1 vs 2:1 natif Cityscapes
**Métriques d'évaluation** :
- Mean IoU (métrique principale) et accuracy pixel-wise
- Performance par classe sémantique (focus classes critiques : Human, Vehicle)
- Temps d'inférence CPU/GPU pour validation déploiement pratique
### Preuve de Concept
**Interface Streamlit** déployée sur serveur NAS personnel (CPU Intel N100) permettant :
- Upload d'images urbaines avec **inférence comparative multi-modèles**
- **Visualisation côte-à-côte** : FPN+ResNet34 vs SegFormer-B1 (meilleurs représentants)
- Affichage temps d'inférence réel et métriques de performance détaillées
- **Analyse exploratoire dataset** : Distribution classes, statistiques pixel-wise interactives
**Hypothèses de validation** :
1. **SegFormer-B1 > FPN baselines** malgré contraintes ratio d'image
2. **SegFormer-B0 vs FPN** : Révélation possible de limitations Transformer sur images déformées
3. **Performances générales** potentiellement supérieures au papier original grâce à l'optimisation ratio 1:1
**Code réutilisé** : Framework `segmentation_models_pytorch` pour les implémentations. **Application originale** : protocole d'évaluation sur images carrées et analyse comparative CNN vs Transformer sous contraintes géométriques spécifiques.
---
**Note méthodologique** : Cette approche permet d'analyser les trade-offs pratiques architecture/performance dans un contexte de contraintes réelles (hardware limité, déformation d'images), offrant une perspective complémentaire aux évaluations académiques standard.

View file

@ -1,57 +1,57 @@
# This reverse proxy configuration aims to make calls to different services running under different ports (Streamlit :8501 and FastAPI :8000) by calling only one port : the nginx one (configurable via NGINX_PORT)
# The NGINX_PORT has to be opened (Dockerfile) and used by app.py (streamlit) in order to make right calls.
worker_processes 1;
events { worker_connections 1024; }
http {
# ✅ AJOUT: Limite d'upload augmentée
client_max_body_size 200M; # Permet uploads jusqu'à 200MB
server {
listen ${NGINX_PORT};
# ✅ AJOUT: Timeouts pour gros fichiers
client_body_timeout 60s;
client_header_timeout 60s;
keepalive_timeout 60s;
send_timeout 60s;
location /api/ {
proxy_pass http://127.0.0.1:8000/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
# ✅ AJOUT: Timeouts pour uploads
proxy_read_timeout 300s;
proxy_connect_timeout 75s;
proxy_send_timeout 300s;
}
location / {
proxy_pass http://127.0.0.1:8501/;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
# ✅ AJOUT: Timeouts pour Streamlit uploads
proxy_read_timeout 300s;
proxy_connect_timeout 75s;
proxy_send_timeout 300s;
}
location /health {
return 200 'OK';
add_header Content-Type text/plain;
}
}
}
# This reverse proxy configuration aims to make calls to different services running under different ports (Streamlit :8501 and FastAPI :8000) by calling only one port : the nginx one (configurable via NGINX_PORT)
# The NGINX_PORT has to be opened (Dockerfile) and used by app.py (streamlit) in order to make right calls.
worker_processes 1;
events { worker_connections 1024; }
http {
# ✅ AJOUT: Limite d'upload augmentée
client_max_body_size 200M; # Permet uploads jusqu'à 200MB
server {
listen ${NGINX_PORT};
# ✅ AJOUT: Timeouts pour gros fichiers
client_body_timeout 60s;
client_header_timeout 60s;
keepalive_timeout 60s;
send_timeout 60s;
location /api/ {
proxy_pass http://127.0.0.1:8000/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
# ✅ AJOUT: Timeouts pour uploads
proxy_read_timeout 300s;
proxy_connect_timeout 75s;
proxy_send_timeout 300s;
}
location / {
proxy_pass http://127.0.0.1:8501/;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
# ✅ AJOUT: Timeouts pour Streamlit uploads
proxy_read_timeout 300s;
proxy_connect_timeout 75s;
proxy_send_timeout 300s;
}
location /health {
return 200 'OK';
add_header Content-Type text/plain;
}
}
}

File diff suppressed because it is too large Load diff

104
start.sh
View file

@ -1,52 +1,52 @@
#!/bin/bash
set -e
# Set default port si non fourni
export NGINX_PORT=${NGINX_PORT:-8080}
export MULTISEG_API_BASE_URL=${MULTISEG_API_BASE_URL:-http://localhost:$NGINX_PORT/api}
echo "=== Multi-Segmentation API Docker Startup ==="
echo "NGINX_PORT: $NGINX_PORT"
echo "API_BASE_URL: $MULTISEG_API_BASE_URL"
# Substitute environment variables dans nginx config
envsubst '${NGINX_PORT}' < /etc/nginx/nginx.conf.template > /etc/nginx/nginx.conf
# S'assurer que les répertoires nginx sont accessibles
mkdir -p /var/cache/nginx /var/run/nginx /var/log/nginx
chown -R www-data:www-data /var/cache/nginx /var/run/nginx /var/log/nginx
# Créer le dossier uploads temporaire
mkdir -p /tmp/uploads
echo "Starting FastAPI server..."
uvicorn app.main:app --host 0.0.0.0 --port 8000 --loop asyncio &
echo "Starting Streamlit app..."
streamlit run app/streamlit_app.py \
--server.port 8501 \
--server.address 0.0.0.0 \
--server.enableXsrfProtection false \
--server.enableCORS false \
--server.headless true \
&
# Vérifier que FastAPI est prêt
echo "Waiting for FastAPI to be ready..."
until curl -s http://127.0.0.1:8000/health > /dev/null; do
echo " FastAPI not ready yet, waiting..."
sleep 2
done
echo "✅ FastAPI is ready!"
# Vérifier que Streamlit est prêt
echo "Waiting for Streamlit to be ready..."
until curl -s http://127.0.0.1:8501 > /dev/null; do
echo " Streamlit not ready yet, waiting..."
sleep 2
done
echo "✅ Streamlit is ready!"
echo "🚀 Launching NGINX reverse proxy on port $NGINX_PORT..."
nginx -c /etc/nginx/nginx.conf -g 'daemon off;'
#!/bin/bash
set -e
# Set default port si non fourni
export NGINX_PORT=${NGINX_PORT:-8080}
export MULTISEG_API_BASE_URL=${MULTISEG_API_BASE_URL:-http://localhost:$NGINX_PORT/api}
echo "=== Multi-Segmentation API Docker Startup ==="
echo "NGINX_PORT: $NGINX_PORT"
echo "API_BASE_URL: $MULTISEG_API_BASE_URL"
# Substitute environment variables dans nginx config
envsubst '${NGINX_PORT}' < /etc/nginx/nginx.conf.template > /etc/nginx/nginx.conf
# S'assurer que les répertoires nginx sont accessibles
mkdir -p /var/cache/nginx /var/run/nginx /var/log/nginx
chown -R www-data:www-data /var/cache/nginx /var/run/nginx /var/log/nginx
# Créer le dossier uploads temporaire
mkdir -p /tmp/uploads
echo "Starting FastAPI server..."
uvicorn app.main:app --host 0.0.0.0 --port 8000 --loop asyncio &
echo "Starting Streamlit app..."
streamlit run app/streamlit_app.py \
--server.port 8501 \
--server.address 0.0.0.0 \
--server.enableXsrfProtection false \
--server.enableCORS false \
--server.headless true \
&
# Vérifier que FastAPI est prêt
echo "Waiting for FastAPI to be ready..."
until curl -s http://127.0.0.1:8000/health > /dev/null; do
echo " FastAPI not ready yet, waiting..."
sleep 2
done
echo "✅ FastAPI is ready!"
# Vérifier que Streamlit est prêt
echo "Waiting for Streamlit to be ready..."
until curl -s http://127.0.0.1:8501 > /dev/null; do
echo " Streamlit not ready yet, waiting..."
sleep 2
done
echo "✅ Streamlit is ready!"
echo "🚀 Launching NGINX reverse proxy on port $NGINX_PORT..."
nginx -c /etc/nginx/nginx.conf -g 'daemon off;'

File diff suppressed because it is too large Load diff