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

View file

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

View file

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

230
README.MD
View file

@ -1,116 +1,116 @@
# Street Vision PoC - Segmentation Sémantique Urbaine # Street Vision PoC - Segmentation Sémantique Urbaine
## 🎯 Description du Projet ## 🎯 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). **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). 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 ### 🔬 Contexte Technique
- **Dataset** : Cityscapes (2,975 images haute résolution annotées pixel-par-pixel) - **Dataset** : Cityscapes (2,975 images haute résolution annotées pixel-par-pixel)
- **Architectures comparées** : - **Architectures comparées** :
- **CNN traditionnel** : FPN + EfficientNet-B0/ResNet34 - **CNN traditionnel** : FPN + EfficientNet-B0/ResNet34
- **Vision Transformer** : SegFormer-B0/B1 - **Vision Transformer** : SegFormer-B0/B1
- **Résolutions d'évaluation** : 512×512 et 768×768 pixels - **Résolutions d'évaluation** : 512×512 et 768×768 pixels
- **Métrique principale** : Mean Intersection over Union (mIoU) - **Métrique principale** : Mean Intersection over Union (mIoU)
## 📊 Résultats Principaux ## 📊 Résultats Principaux
| **Modèle** | **mIoU** | **Paramètres** | **Taille** | **Performance** | | **Modèle** | **mIoU** | **Paramètres** | **Taille** | **Performance** |
|------------|----------|----------------|------------|-----------------| |------------|----------|----------------|------------|-----------------|
| **SegFormer-B1** | **79.98%** | 13.68M | 52MB | ⭐ **Meilleur** | | **SegFormer-B1** | **79.98%** | 13.68M | 52MB | ⭐ **Meilleur** |
| **FPN+ResNet34** | 79.22% | 23.16M | 88MB | 🔄 Baseline forte | | **FPN+ResNet34** | 79.22% | 23.16M | 88MB | 🔄 Baseline forte |
| **FPN+EfficientNet-B0** | 78.67% | 5.76M | 22MB | 💡 Compact | | **FPN+EfficientNet-B0** | 78.67% | 5.76M | 22MB | 💡 Compact |
| **SegFormer-B0** | 77.91% | 3.72M | 14MB | ⚡ Ultra-léger | | **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. **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 ### 🎯 Gains Significatifs par Classes Critiques
- **Human** : +1.78% IoU (sécurité critique) - **Human** : +1.78% IoU (sécurité critique)
- **Vehicle** : +1.05% IoU (obstacles mobiles) - **Vehicle** : +1.05% IoU (obstacles mobiles)
- **Object** : +0.56% IoU (signalétique urbaine) - **Object** : +0.56% IoU (signalétique urbaine)
## 🚀 Déploiement Rapide ## 🚀 Déploiement Rapide
### Docker Hub ### Docker Hub
L'application est containerisée et disponible sur Docker Hub : L'application est containerisée et disponible sur Docker Hub :
```bash ```bash
docker pull grgmdmn/street-vision-poc_api docker pull grgmdmn/street-vision-poc_api
``` ```
### Configuration avec Docker Compose ### Configuration avec Docker Compose
1. Copiez le fichier d'exemple de configuration : 1. Copiez le fichier d'exemple de configuration :
```bash ```bash
cp docker-compose.yml.example docker-compose.yml cp docker-compose.yml.example docker-compose.yml
``` ```
2. Configurez les variables d'environnement dans `docker-compose.yml`. 2. Configurez les variables d'environnement dans `docker-compose.yml`.
3. Lancez l'application : 3. Lancez l'application :
```bash ```bash
docker-compose up -d docker-compose up -d
``` ```
4. Accédez à l'interface : `http://localhost:$(port)` 4. Accédez à l'interface : `http://localhost:$(port)`
## 🎮 Fonctionnalités de l'Interface ## 🎮 Fonctionnalités de l'Interface
### Dashboard Interactif ### Dashboard Interactif
- **Upload d'images** : Glisser-déposer d'images urbaines - **Upload d'images** : Glisser-déposer d'images urbaines
- **Double inférence** : Comparaison simultanée FPN vs SegFormer - **Double inférence** : Comparaison simultanée FPN vs SegFormer
- **Visualisation** : Masques de segmentation colorés par classe - **Visualisation** : Masques de segmentation colorés par classe
- **Métriques temps réel** : Temps d'inférence et scores de confiance - **Métriques temps réel** : Temps d'inférence et scores de confiance
- **Export** : Téléchargement des résultats de segmentation - **Export** : Téléchargement des résultats de segmentation
- **Accessibilité WCAG** : Interface conforme aux standards d'accessibilité - **Accessibilité WCAG** : Interface conforme aux standards d'accessibilité
### Analyse Exploratoire des Données ### Analyse Exploratoire des Données
- **Statistiques Cityscapes** : Distribution des classes, résolutions natives - **Statistiques Cityscapes** : Distribution des classes, résolutions natives
- **Graphiques interactifs** : Répartition pixel par méta-classe - **Graphiques interactifs** : Répartition pixel par méta-classe
- **Exemples annotés** : Visualisation échantillons du dataset - **Exemples annotés** : Visualisation échantillons du dataset
## 📈 Méthodologie d'Évaluation ## 📈 Méthodologie d'Évaluation
### Approche Comparative ### Approche Comparative
1. **Baseline CNN** : Réentraînement FPN+EfficientNet/ResNet aux résolutions supérieures 1. **Baseline CNN** : Réentraînement FPN+EfficientNet/ResNet aux résolutions supérieures
2. **Nouvelle approche** : Évaluation SegFormer avec attention globale 2. **Nouvelle approche** : Évaluation SegFormer avec attention globale
3. **Protocole rigoureux** : Validation croisée, métriques standardisées 3. **Protocole rigoureux** : Validation croisée, métriques standardisées
4. **Analyse par classe** : Performance détaillée sur 8 méta-classes urbaines 4. **Analyse par classe** : Performance détaillée sur 8 méta-classes urbaines
### Limites Identifiées ### Limites Identifiées
- **Résolution fixe** : Évaluation sans sliding window (vs protocole original) - **Résolution fixe** : Évaluation sans sliding window (vs protocole original)
- **Ressources limitées** : Tests uniquement sur SegFormer-B0/B1 - **Ressources limitées** : Tests uniquement sur SegFormer-B0/B1
- **Conditions contrôlées** : Dataset Cityscapes uniquement (météo favorable) - **Conditions contrôlées** : Dataset Cityscapes uniquement (météo favorable)
## 🔬 Insights Techniques ## 🔬 Insights Techniques
### Avantages SegFormer ### Avantages SegFormer
- **Attention globale** : Chaque pixel "voit" toute l'image simultanément - **Attention globale** : Chaque pixel "voit" toute l'image simultanément
- **Architecture plus légère** : Modèle compact avec moins de paramètres - **Architecture plus légère** : Modèle compact avec moins de paramètres
- **Robustesse contextuelle** : Meilleure gestion occlusions et objets complexes - **Robustesse contextuelle** : Meilleure gestion occlusions et objets complexes
- **Potentiel d'amélioration** : Versions B2-B5 promettraient des gains significatifs - **Potentiel d'amélioration** : Versions B2-B5 promettraient des gains significatifs
### Trade-offs Identifiés ### Trade-offs Identifiés
- **Vitesse CPU classique** : ~2× plus lent que FPN sur processeurs haute performance (Xeon, 9600X) - **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) - **Vitesse CPU économe** : 3× plus rapide sur processeurs économes en énergie (N100)
- **Optimisation GPU** : Architecture Transformer favorisée par accélération matérielle - **Optimisation GPU** : Architecture Transformer favorisée par accélération matérielle
## 📚 Références ## 📚 Références
- **Xie, E. et al.** (2021). *SegFormer: Simple and Efficient Design for Semantic Segmentation with Transformers*. NeurIPS 2021. - **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. - **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) - **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. **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 # Dashboard de Comparaison de Modèles
## Conformité aux Exigences ## Conformité aux Exigences
### Analyse Exploratoire des Données Non Structurées (Images) ### Analyse Exploratoire des Données Non Structurées (Images)
**Présentation d'exemples d'images selon les catégories :** **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 - 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 - 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 - Interface de navigation par catégories avec noms d'affichage conviviaux
**Comptage et répartition des données :** **Comptage et répartition des données :**
- Graphiques en secteurs (pie charts) détaillant la répartition des 25,000 images Cityscapes - 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 - Visualisation de l'utilisation projet : 80% train / 20% validation / 100% test
- Graphique de distribution des classes dans le dataset d'entraînement - Graphique de distribution des classes dans le dataset d'entraînement
- Tableaux récapitulatifs avec statistiques détaillées par split - Tableaux récapitulatifs avec statistiques détaillées par split
**Transformations des images :** **Transformations des images :**
- Démonstration interactive du preprocessing : redimensionnement et normalisation - Démonstration interactive du preprocessing : redimensionnement et normalisation
- Visualisation des augmentations de données aléatoires (rotation, flip, luminosité, etc.) - Visualisation des augmentations de données aléatoires (rotation, flip, luminosité, etc.)
- Comparaison avant/après transformations avec alignement visuel - Comparaison avant/après transformations avec alignement visuel
- Documentation complète des 6 types d'augmentations possibles - Documentation complète des 6 types d'augmentations possibles
### Sélection de Données d'Entrée ### Sélection de Données d'Entrée
**Interface de sélection multiple :** **Interface de sélection multiple :**
- Liste déroulante pour images test Cityscapes avec informations sur la vérité terrain - Liste déroulante pour images test Cityscapes avec informations sur la vérité terrain
- Upload de fichiers personnels (JPEG, PNG) avec validation de format - Upload de fichiers personnels (JPEG, PNG) avec validation de format
- Prévisualisation des images sélectionnées avant traitement - Prévisualisation des images sélectionnées avant traitement
- Gestion des erreurs et feedback utilisateur en temps réel - Gestion des erreurs et feedback utilisateur en temps réel
### Résultats de Prédiction ### Résultats de Prédiction
**Comparaison complète de modèles :** **Comparaison complète de modèles :**
- Affichage côte à côte des prédictions des deux meilleurs 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 - Visualisations avec image originale, masques prédits et vérité terrain
- Détection et mise en évidence des erreurs de segmentation - Détection et mise en évidence des erreurs de segmentation
- Statistiques détaillées par classe avec pourcentages et nombre de pixels - Statistiques détaillées par classe avec pourcentages et nombre de pixels
**Métriques de performance :** **Métriques de performance :**
- Temps d'inférence comparatif avec analyse de vitesse - Temps d'inférence comparatif avec analyse de vitesse
- Scores de performance (mIoU, Accuracy) par modèle - Scores de performance (mIoU, Accuracy) par modèle
- IoU par classe pour analyse fine des performances - IoU par classe pour analyse fine des performances
- Graphiques comparatifs interactifs des résultats - Graphiques comparatifs interactifs des résultats
### Déploiement Cloud ### Déploiement Cloud
**Architecture déployée :** **Architecture déployée :**
- Application FastAPI pour l'API de comparaison de modèles - Application FastAPI pour l'API de comparaison de modèles
- Interface Streamlit pour le dashboard utilisateur - Interface Streamlit pour le dashboard utilisateur
- Déploiement sur infrastructure cloud avec haute disponibilité - Déploiement sur infrastructure cloud avec haute disponibilité
- Gestion automatique des ressources et montée en charge - Gestion automatique des ressources et montée en charge
### Accessibilité WCAG ### Accessibilité WCAG
**Conformité aux critères essentiels :** **Conformité aux critères essentiels :**
#### Contraste des Couleurs (WCAG AA) #### Contraste des Couleurs (WCAG AA)
- Palette de couleurs avec ratios de contraste ≥ 4.1:1 pour éléments graphiques - 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 - Ratios de contraste ≥ 4.5:1 pour le texte sur fond
- 8 couleurs principales validées : bleu (#0066CC), rouge (#CC0000), vert (#006600), etc. - 8 couleurs principales validées : bleu (#0066CC), rouge (#CC0000), vert (#006600), etc.
- Remplacement des dégradés par des couleurs unies à contraste élevé - Remplacement des dégradés par des couleurs unies à contraste élevé
#### Alternatives Textuelles #### Alternatives Textuelles
- Descriptions alternatives détaillées pour tous les graphiques générées automatiquement - Descriptions alternatives détaillées pour tous les graphiques générées automatiquement
- Textes explicatifs pour chaque visualisation (pie charts, bar charts) - Textes explicatifs pour chaque visualisation (pie charts, bar charts)
- Labels ARIA appropriés pour les éléments interactifs - Labels ARIA appropriés pour les éléments interactifs
- Documentation textuelle complète des transformations d'images - Documentation textuelle complète des transformations d'images
#### Indication Non-Couleur Uniquement #### Indication Non-Couleur Uniquement
- Motifs et hachures complémentaires aux couleurs (optionnel via checkbox) - Motifs et hachures complémentaires aux couleurs (optionnel via checkbox)
- 6 motifs différents : diagonales, verticales, horizontales, points, croix - 6 motifs différents : diagonales, verticales, horizontales, points, croix
- Différenciation par forme et texture en plus des couleurs - Différenciation par forme et texture en plus des couleurs
- Bordures et contours renforcés pour la distinction visuelle - Bordures et contours renforcés pour la distinction visuelle
#### Navigation Clavier #### Navigation Clavier
- CSS focus visible avec contours bleus (#0066CC) de 2px - CSS focus visible avec contours bleus (#0066CC) de 2px
- Support complet de la navigation par tabulation - Support complet de la navigation par tabulation
- Indicateurs visuels clairs pour les éléments focusés - Indicateurs visuels clairs pour les éléments focusés
- Respect de l'ordre logique de navigation - Respect de l'ordre logique de navigation
#### Tableaux de Données Accessibles #### Tableaux de Données Accessibles
- Tableaux structurés complémentaires à tous les graphiques - Tableaux structurés complémentaires à tous les graphiques
- En-têtes appropriés avec scope et descriptions - En-têtes appropriés avec scope et descriptions
- Données exportables et lisibles par lecteurs d'écran - Données exportables et lisibles par lecteurs d'écran
- Configuration responsive pour tous les écrans - Configuration responsive pour tous les écrans
**Fonctionnalités d'assistance intégrées :** **Fonctionnalités d'assistance intégrées :**
- Checkbox "Activer les motifs (accessibilité visuelle)" pour personnalisation - Checkbox "Activer les motifs (accessibilité visuelle)" pour personnalisation
- Descriptions automatiques des graphiques avec statistiques complètes - Descriptions automatiques des graphiques avec statistiques complètes
- Interface adaptable aux besoins des utilisateurs en situation de handicap - Interface adaptable aux besoins des utilisateurs en situation de handicap
- Documentation complète des fonctionnalités d'accessibilité via endpoint `/accessibility-info` - Documentation complète des fonctionnalités d'accessibilité via endpoint `/accessibility-info`
## Architecture Technique ## Architecture Technique
**Stack technologique :** **Stack technologique :**
- Backend : FastAPI + PyTorch pour l'inférence des modèles - Backend : FastAPI + PyTorch pour l'inférence des modèles
- Frontend : Streamlit avec composants accessibles - Frontend : Streamlit avec composants accessibles
- Visualisations : Matplotlib avec palettes WCAG - Visualisations : Matplotlib avec palettes WCAG
- API REST documentée avec validation Pydantic - API REST documentée avec validation Pydantic
- Gestion d'état optimisée pour les comparaisons de modèles - Gestion d'état optimisée pour les comparaisons de modèles
**Performance et fiabilité :** **Performance et fiabilité :**
- Temps d'inférence optimisés (< 1 seconde par image) - Temps d'inférence optimisés (< 1 seconde par image)
- Gestion mémoire efficace avec fermeture automatique des figures - Gestion mémoire efficace avec fermeture automatique des figures
- Validation des formats et tailles de fichiers - Validation des formats et tailles de fichiers
- Nettoyage automatique des fichiers temporaires - 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 # Multi-Class Segmentation API - Requirements
# ============================================================================= # =============================================================================
# ===== CORE WEB FRAMEWORK ===== # ===== CORE WEB FRAMEWORK =====
fastapi==0.115.14 fastapi==0.115.14
uvicorn==0.35.0 uvicorn==0.35.0
starlette==0.46.2 starlette==0.46.2
pydantic==2.11.7 pydantic==2.11.7
pydantic_core==2.33.2 pydantic_core==2.33.2
python-multipart==0.0.20 # uploads FastAPI python-multipart==0.0.20 # uploads FastAPI
# ===== STREAMLIT ===== # ===== STREAMLIT =====
streamlit==1.46.1 streamlit==1.46.1
altair==5.5.0 # utilisé par Streamlit altair==5.5.0 # utilisé par Streamlit
blinker==1.9.0 # dépendance Streamlit blinker==1.9.0 # dépendance Streamlit
# ===== HTTP CLIENTS ===== # ===== HTTP CLIENTS =====
requests==2.32.4 requests==2.32.4
httpx==0.28.1 # utilisé en interne par FastAPI httpx==0.28.1 # utilisé en interne par FastAPI
httpcore==1.0.9 httpcore==1.0.9
h11==0.16.0 h11==0.16.0
# ===== MACHINE LEARNING CORE (PyTorch) ===== # ===== MACHINE LEARNING CORE (PyTorch) =====
torch==2.8.0 # version stable PyTorch torch==2.8.0 # version stable PyTorch
torchvision==0.23.0 # utile pour les modèles pré-entraînés torchvision==0.23.0 # utile pour les modèles pré-entraînés
torchaudio==2.8.0 # optionnel (mais recommandé pour compatibilité PyTorch) torchaudio==2.8.0 # optionnel (mais recommandé pour compatibilité PyTorch)
segmentation-models-pytorch==0.5.0 segmentation-models-pytorch==0.5.0
albumentations==2.0.8 albumentations==2.0.8
# version PyTorch de ToTensor # version PyTorch de ToTensor
albumentations[imgaug,opencv] albumentations[imgaug,opencv]
numpy>=1.24.0,<2.0.0 numpy>=1.24.0,<2.0.0
scipy==1.16.0 scipy==1.16.0
scikit-learn==1.7.0 scikit-learn==1.7.0
# ===== COMPUTER VISION ===== # ===== COMPUTER VISION =====
pillow==11.3.0 pillow==11.3.0
opencv-python-headless==4.9.0.80 opencv-python-headless==4.9.0.80
scikit-image==0.25.2 scikit-image==0.25.2
imageio==2.37.0 imageio==2.37.0
# ===== DATA SCIENCE ===== # ===== DATA SCIENCE =====
pandas==2.3.0 pandas==2.3.0
matplotlib==3.10.3 matplotlib==3.10.3
networkx==3.5 networkx==3.5
tifffile==2025.6.11 tifffile==2025.6.11
lazy_loader==0.4 lazy_loader==0.4
# ===== MLFLOW & MODEL REGISTRY ===== # ===== MLFLOW & MODEL REGISTRY =====
mlflow==3.2.0 mlflow==3.2.0
mlflow-skinny==3.2.0 mlflow-skinny==3.2.0
mlflow-tracing==3.2.0 mlflow-tracing==3.2.0
# ===== AWS/S3 SUPPORT ===== # ===== AWS/S3 SUPPORT =====
boto3==1.39.2 boto3==1.39.2
botocore==1.39.2 botocore==1.39.2
s3transfer==0.13.0 s3transfer==0.13.0
# ===== UTILITIES ===== # ===== UTILITIES =====
click==8.2.1 click==8.2.1
tqdm==4.67.1 tqdm==4.67.1
joblib==1.5.1 joblib==1.5.1
python-dateutil python-dateutil
packaging packaging
typing_extensions==4.14.0 typing_extensions==4.14.0
# ===== MATPLOTLIB ADDONS ===== # ===== MATPLOTLIB ADDONS =====
cycler==0.12.1 cycler==0.12.1
fonttools==4.58.5 fonttools==4.58.5
plotly==5.24.1 plotly==5.24.1

File diff suppressed because it is too large Load diff

View file

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

View file

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

View file

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

View file

@ -1,295 +1,295 @@
# Note Méthodologique : Preuve de concept SegFormer vs FPN # Note Méthodologique : Preuve de concept SegFormer vs FPN
## Dataset retenu ## Dataset retenu
### Cityscapes Dataset : Référence en Segmentation Urbaine ### 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. 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 :** **Composition du dataset :**
- **Train** : 2,975 images finement annotées - **Train** : 2,975 images finement annotées
- **Validation** : 500 images avec annotations de référence - **Validation** : 500 images avec annotations de référence
- **Test** : 1,525 images (annotations non-publiques) - **Test** : 1,525 images (annotations non-publiques)
- **Coarse** : 20,000 images avec annotations grossières - **Coarse** : 20,000 images avec annotations grossières
**Architecture de classes hiérarchique :** **Architecture de classes hiérarchique :**
Le dataset organise 34 classes détaillées en **8 méta-classes** pour la segmentation : Le dataset organise 34 classes détaillées en **8 méta-classes** pour la segmentation :
| Méta-classe | Classes incluses | Importance | | Méta-classe | Classes incluses | Importance |
|-------------|------------------|------------| |-------------|------------------|------------|
| **Flat** | Route, trottoir, parkings | Navigation de base | | **Flat** | Route, trottoir, parkings | Navigation de base |
| **Human** | Piéton, cycliste | **Sécurité critique** | | **Human** | Piéton, cycliste | **Sécurité critique** |
| **Vehicle** | Voiture, camion, bus, train | Obstacles dynamiques | | **Vehicle** | Voiture, camion, bus, train | Obstacles dynamiques |
| **Construction** | Bâtiment, mur, clôture, pont | Structure urbaine | | **Construction** | Bâtiment, mur, clôture, pont | Structure urbaine |
| **Object** | Poteau, feu, panneau | Signalétique | | **Object** | Poteau, feu, panneau | Signalétique |
| **Nature** | Végétation, terrain | Environnement | | **Nature** | Végétation, terrain | Environnement |
| **Sky** | Ciel | Contexte | | **Sky** | Ciel | Contexte |
| **Void** | Zones non-définies | Exclusion | | **Void** | Zones non-définies | Exclusion |
**Particularité méthodologique critique :** **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). 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 ## Les concepts de l'algorithme récent
### SegFormer : Architecture Transformer Vision-Optimisée Temps Réel ### 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. **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 ### Innovations Architecturales Clés
**1. Encodeur Hiérarchique Sans Encodage Positionnel** **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 : 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\}$$ $$\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}\}$ avec résolutions $\{\frac{H}{4}, \frac{H}{8}, \frac{H}{16}, \frac{H}{32}\}$
**Efficient Self-Attention :** **Efficient Self-Attention :**
Réduction de complexité par sous-échantillonnage des clés : 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$$ $$\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. 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** **2. Mix-FFN : Hybridation CNN-Transformer**
Innovation clé : intégration de **convolutions 3×3** dans les couches Feed-Forward : 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))$$ $$\text{Mix-FFN}(x) = \text{MLP}(\text{GELU}(\text{Conv}_{3×3}(\text{MLP}(x)) + x))$$
Cette approche permet : Cette approche permet :
- **Élimination totale des encodages positionnels** - **Élimination totale des encodages positionnels**
- **Capture locale + compréhension globale** simultanées - **Capture locale + compréhension globale** simultanées
- **Robustesse aux variations de résolution** d'entrée - **Robustesse aux variations de résolution** d'entrée
**3. Décodeur MLP Ultra-Léger** **3. Décodeur MLP Ultra-Léger**
Simplification drastique vs décodeurs complexes traditionnels : 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)$$ $$\text{Seg} = \text{MLP}\left(\text{Concat}[\text{Upsample}(F_1), F_2, F_3, F_4]\right)$$
**Avantages :** **Avantages :**
- **Réduction massive des paramètres** : Focus sur l'encodeur performant - **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 - **Inférence accélérée** : Décodeur 10× plus rapide que ASPP/PSP
- **Architecture unifiée** : Traitement multi-échelle sans modules ad-hoc - **Architecture unifiée** : Traitement multi-échelle sans modules ad-hoc
### Positionnement Temps Réel vs État de l'Art ### Positionnement Temps Réel vs État de l'Art
**Analyse critique du benchmark original :** **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. 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 :** **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. 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 ## La modélisation
### Méthodologie Expérimentale Adaptée ### Méthodologie Expérimentale Adaptée
**Contraintes et adaptations :** **Contraintes et adaptations :**
Notre protocole d'évaluation diffère substantiellement du papier original pour s'adapter aux contraintes pratiques : Notre protocole d'évaluation diffère substantiellement du papier original pour s'adapter aux contraintes pratiques :
**Configuration matérielle :** **Configuration matérielle :**
- **Plateforme** : Google Colab Pro avec GPU T4 (15Go VRAM) - **Plateforme** : Google Colab Pro avec GPU T4 (15Go VRAM)
- **Framework** : Migration TensorFlow/Keras → PyTorch + Segmentation Models PyTorch - **Framework** : Migration TensorFlow/Keras → PyTorch + Segmentation Models PyTorch
- **Contraintes** : Plan payant avec unités de calcul limitées - **Contraintes** : Plan payant avec unités de calcul limitées
**Déformation géométrique :** **Déformation géométrique :**
- **Protocole original** : Préservation ratio 2:1 natif Cityscapes - **Protocole original** : Préservation ratio 2:1 natif Cityscapes
- **Notre protocole** : Déformation vers ratio 1:1 (images carrées) - **Notre protocole** : Déformation vers ratio 1:1 (images carrées)
- **Résolutions testées** : 512×512 et 768×768 pixels - **Résolutions testées** : 512×512 et 768×768 pixels
- **Impact attendu** : Analyse différentielle CNN vs Transformer sous contrainte géométrique - **Impact attendu** : Analyse différentielle CNN vs Transformer sous contrainte géométrique
### Preprocessing et Modèles Pré-entraînés ### Preprocessing et Modèles Pré-entraînés
**Modèles SegFormer (pré-entraînés ADE20K) :** **Modèles SegFormer (pré-entraînés ADE20K) :**
- **SegFormer-B0** : `segformer-b0-512x512-ade-160k` (3.7M paramètres) - **SegFormer-B0** : `segformer-b0-512x512-ade-160k` (3.7M paramètres)
- **SegFormer-B1** : `segformer-b1-512x512-ade-160k` (13.7M paramètres, exploration scaling) - **SegFormer-B1** : `segformer-b1-512x512-ade-160k` (13.7M paramètres, exploration scaling)
**Modèles FPN (pré-entraînés ImageNet) :** **Modèles FPN (pré-entraînés ImageNet) :**
- **FPN+ResNet34** : 23.16M paramètres - **FPN+ResNet34** : 23.16M paramètres
- **FPN+EfficientNet-B0** : 5.76M paramètres (baseline de référence @224x224 : 74.6% mIoU) - **FPN+EfficientNet-B0** : 5.76M paramètres (baseline de référence @224x224 : 74.6% mIoU)
### Configuration d'Entraînement Optimisée ### Configuration d'Entraînement Optimisée
**Configuration SegFormer :** **Configuration SegFormer :**
- **Loss Function** : Jaccard Loss pour optimisation IoU directe - **Loss Function** : Jaccard Loss pour optimisation IoU directe
- **Optimiseur** : AdamW (lr=1e-4, weight_decay=1e-4, spécialisé Transformers) - **Optimiseur** : AdamW (lr=1e-4, weight_decay=1e-4, spécialisé Transformers)
- **Scheduler** : Cosine Annealing (convergence douce, min_lr=1e-6) - **Scheduler** : Cosine Annealing (convergence douce, min_lr=1e-6)
- **Epochs** : Maximum 30 avec early stopping (patience=5) - **Epochs** : Maximum 30 avec early stopping (patience=5)
**Configuration FPN :** **Configuration FPN :**
- **Loss Function** : Focal + Jaccard Loss combinées (poids 1:1) - **Loss Function** : Focal + Jaccard Loss combinées (poids 1:1)
- **Optimiseur** : Adam (lr=1.5e-4, weight_decay=1e-5, optimisé CNN) - **Optimiseur** : Adam (lr=1.5e-4, weight_decay=1e-5, optimisé CNN)
- **Scheduler** : ReduceLROnPlateau (adaptation réactive, patience=4) - **Scheduler** : ReduceLROnPlateau (adaptation réactive, patience=4)
- **Epochs** : Maximum 20 avec early stopping (patience=7) - **Epochs** : Maximum 20 avec early stopping (patience=7)
**Stratégie d'entraînement :** **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. 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 ## Une synthèse des résultats
![mIoU + Accuracy](mIoU_accuracy.png) ![mIoU + Accuracy](mIoU_accuracy.png)
*Fig.1: Mean IoU et Accuracy par expérience* *Fig.1: Mean IoU et Accuracy par expérience*
### Performance Comparative : SegFormer vs FPN sous Contrainte Géométrique ### Performance Comparative : SegFormer vs FPN sous Contrainte Géométrique
**Résultats principaux (mIoU sur Cityscapes Validation) :** **Résultats principaux (mIoU sur Cityscapes Validation) :**
| **Modèle** | **mIoU** | **Gain vs Baseline** | **Paramètres** | **Taille** | **Temps CPU** | | **Modèle** | **mIoU** | **Gain vs Baseline** | **Paramètres** | **Taille** | **Temps CPU** |
|------------|----------|----------------------|----------------|------------|---------------| |------------|----------|----------------------|----------------|------------|---------------|
| **SegFormer-B1** | **79.98%** | **+1.31%** | **13.68M** | **52MB** | **1.39s** | | **SegFormer-B1** | **79.98%** | **+1.31%** | **13.68M** | **52MB** | **1.39s** |
| **FPN+ResNet34** | **79.22%** | **+0.55%** | **23.16M** | **88MB** | **0.73s** | | **FPN+ResNet34** | **79.22%** | **+0.55%** | **23.16M** | **88MB** | **0.73s** |
| **FPN+EfficientNet-B0** | **78.67%** | *baseline* | **5.76M** | **22MB** | **0.48s** | | **FPN+EfficientNet-B0** | **78.67%** | *baseline* | **5.76M** | **22MB** | **0.48s** |
| **SegFormer-B0** | **77.91%** | **-0.76%** | **3.72M** | **14MB** | **0.87s** | | **SegFormer-B0** | **77.91%** | **-0.76%** | **3.72M** | **14MB** | **0.87s** |
*Temps d'inférence : CPU Intel Xeon @ 2.20GHz (2 vCPUs) Google Colab* *Temps d'inférence : CPU Intel Xeon @ 2.20GHz (2 vCPUs) Google Colab*
### Révélations Critiques : Impact du Ratio d'Image ### Révélations Critiques : Impact du Ratio d'Image
**Résultat majeur inattendu :** **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. 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 :** **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 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 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) 3. **Scaling architectural** : SegFormer-B1 compense cette limitation par sa capacité supérieure (+1.31% mIoU)
### Analyse Détaillée par Classes Sémantiques ### Analyse Détaillée par Classes Sémantiques
![IoU Classe et Δ IoU par Classe](iou_delta_iou_per_class.png) ![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* *Fig.2: IoU et Δ IoU par Classe entre SegFormer-B1 et FPN-ResNet34*
**Performance par méta-classes Cityscapes :** **Performance par méta-classes Cityscapes :**
| **Classe** | **SegFormer-B1** | **FPN+ResNet34** | **Gain** | **Analyse** | | **Classe** | **SegFormer-B1** | **FPN+ResNet34** | **Gain** | **Analyse** |
|------------|-------------------|-------------------|----------|-------------| |------------|-------------------|-------------------|----------|-------------|
| **Flat** | **93.35%** | **93.38%** | **-0.03%** | Performance équivalente | | **Flat** | **93.35%** | **93.38%** | **-0.03%** | Performance équivalente |
| **Human** | **71.13%** | **69.35%** | **+1.78%** | ⭐ **Attention globale critique** | | **Human** | **71.13%** | **69.35%** | **+1.78%** | ⭐ **Attention globale critique** |
| **Vehicle** | **88.80%** | **87.75%** | **+1.05%** | ⭐ **Contexte multi-échelle** | | **Vehicle** | **88.80%** | **87.75%** | **+1.05%** | ⭐ **Contexte multi-échelle** |
| **Construction** | **85.94%** | **85.06%** | **+0.88%** | Structures complexes | | **Construction** | **85.94%** | **85.06%** | **+0.88%** | Structures complexes |
| **Object** | **49.24%** | **48.68%** | **+0.56%** | ⭐ **Signalétique petite taille** | | **Object** | **49.24%** | **48.68%** | **+0.56%** | ⭐ **Signalétique petite taille** |
| **Nature** | **89.14%** | **88.13%** | **+1.01%** | Textures variées | | **Nature** | **89.14%** | **88.13%** | **+1.01%** | Textures variées |
| **Sky** | **92.35%** | **91.67%** | **+0.68%** | Régions homogènes | | **Sky** | **92.35%** | **91.67%** | **+0.68%** | Régions homogènes |
| **Void** | **69.89%** | **69.76%** | **+0.13%** | Zones ambiguës | | **Void** | **69.89%** | **69.76%** | **+0.13%** | Zones ambiguës |
**Patterns d'amélioration SegFormer-B1 :** **Patterns d'amélioration SegFormer-B1 :**
- **Classes sécuritaires critiques** (Human +1.78%, Vehicle +1.05%) : Validation de l'attention globale pour objets contextuels - **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 - **Objets petite taille** (Object +0.56%) : Meilleure capture multi-échelle vs convolutions locales
- **Performance équivalente** sur surfaces homogènes (Flat -0.03%) - **Performance équivalente** sur surfaces homogènes (Flat -0.03%)
### Performance Surprenante vs Benchmark Original ### Performance Surprenante vs Benchmark Original
**Observation contre-intuitive :** **Observation contre-intuitive :**
Nos modèles atteignent des performances **supérieures au papier original** malgré la contrainte géométrique @768x768 : 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% - **SegFormer-B0 : 77.91%** vs 75.3%
- **FPN baselines : 78.67-79.22%** vs DeepLabV3+ 75.2% - **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) - **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 :** **Hypothèses explicatives :**
1. **Optimisation du ratio 1:1** : Réduction de l'aire d'image (×2) concentre l'information spatiale 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) 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. **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) 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 ## L'analyse de la feature importance globale et locale du nouveau modèle
### Limitations Méthodologiques de l'Explicabilité Transformer ### 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. 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 ### Insights Architecturaux via Patterns de Performance
**Analyse indirecte par performance différentielle :** **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 : 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 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** 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 3. **Scaling architectural efficace** : Bond B0→B1 (+2.07% mIoU) confirme l'efficacité du scaling Transformer
**Limitation fondamentale :** **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. 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 ## Limites et améliorations possibles
### Limitations Expérimentales Critiques ### Limitations Expérimentales Critiques
**1. Contraintes Protocolaires Majeures** **1. Contraintes Protocolaires Majeures**
- **Déformation géométrique forcée** : Ratio 2:1→1:1 non-représentatif du déploiement réel - **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) - **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 - **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é - **Métriques d'évaluation** : Temps d'inférence CPU non-représentatifs du déploiement GPU optimisé
**2. Généralisation Limitée** **2. Généralisation Limitée**
- **Dataset unique** : Évaluation exclusive sur Cityscapes urbain allemand - **Dataset unique** : Évaluation exclusive sur Cityscapes urbain allemand
- **Conditions météo** : Uniquement conditions favorables (pas de nuit/intempéries) - **Conditions météo** : Uniquement conditions favorables (pas de nuit/intempéries)
- **Scaling incomplet** : SegFormer-B2+ non-testés faute de ressources computationnelles - **Scaling incomplet** : SegFormer-B2+ non-testés faute de ressources computationnelles
### Améliorations Prioritaires Identifiées ### Améliorations Prioritaires Identifiées
**1. Robustesse Protocolaire** **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) - **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 - **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 - **Evaluation multi-dataset** : Validation BDD100K, Mapillary Vistas pour généralisation
**2. Scaling Architectural Complet** **2. Scaling Architectural Complet**
- **SegFormer variants complets** : B2, B3, B4 pour validation des gains à tous les niveaux de complexité vs papier original - **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 - **É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é - **Optimisations déploiement** : TensorRT, quantization FP16/INT8 pour inférence temps réel selon niveau de complexité
**3. Analyse Causale Approfondie** **3. Analyse Causale Approfondie**
1. **Prototypage rapide** : SegFormer-B1 comme référence architecturale moderne pour projets nécessitant performance maximale 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 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 3. **Adaptabilité clients** : Gamme SegFormer (B0-B1+) offrant scaling performance/ressources selon besoins spécifiques
### Perspectives de Déploiement Pratique ### Perspectives de Déploiement Pratique
**Applications industrielles validées :** **Applications industrielles validées :**
1. **Prototypage rapide** : SegFormer-B1 comme référence architecturale moderne pour projets nécessitant performance maximale 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 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 3. **Adaptabilité clients** : Gamme SegFormer (B0-B1+) offrant scaling performance/ressources selon besoins spécifiques
**ROI technique contextuel :** **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. 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 ## Conclusion Méthodologique
### Contribution Analytique Principale ### Contribution Analytique Principale
Cette étude apporte une **perspective complémentaire critique** aux évaluations académiques standard en révélant : 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 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 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 3. **Trade-offs pratiques** : Compromis performance/efficacité sous contraintes réelles
### Validation des Hypothèses de Recherche ### Validation des Hypothèses de Recherche
**Hypothèses confirmées :** **Hypothèses confirmées :**
- ✅ **SegFormer-B1 surpasse FPN** (+1.31% mIoU) avec efficacité paramétrique supérieure - ✅ **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%) - ✅ **Amélioration classes critiques** validée (Human +1.78%, Vehicle +1.05%)
- ✅ **Architecture Transformer viable** pour segmentation temps réel avec scaling approprié - ✅ **Architecture Transformer viable** pour segmentation temps réel avec scaling approprié
**Hypothèses infirmées :** **Hypothèses infirmées :**
- ❌ **SegFormer-B0 sous-performant** vs FPN sur images 1:1 - ❌ **SegFormer-B0 sous-performant** vs FPN sur images 1:1
- ❌ **Robustesse géométrique** Transformer surestimée vs CNN - ❌ **Robustesse géométrique** Transformer surestimée vs CNN
### Positionnement Scientifique ### 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. 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. 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 # Plan Prévisionnel - Preuve de Concept Segmentation Sémantique
**Projet** : Amélioration de la segmentation sémantique temps réel avec SegFormer **Projet** : Amélioration de la segmentation sémantique temps réel avec SegFormer
--- ---
## Dataset Retenu ## 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). **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. **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é ## Modèle Envisagé
### Algorithme : SegFormer (Focus Temps Réel) ### Algorithme : SegFormer (Focus Temps Réel)
**Justifications du choix :** **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. 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 :** **Objectif et hypothèses de recherche :**
1. **SegFormer-B0** devrait surpasser FPN+EfficientNetB0 (78.67% mIoU baseline) grâce à l'attention globale native 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) 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 3. **Impact du ratio d'image** : Analyser comment la déformation 2:1→1:1 affecte les architectures CNN vs Transformer
**Contraintes et adaptations :** **Contraintes et adaptations :**
- Migration framework obligatoire : TensorFlow/Keras → PyTorch pour accès aux modèles SegFormer récents - 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 - Résolutions contraintes par GPU T4 : 512×512 et 768×768 maximum
- Protocole différent du papier original : images carrées vs rectangulaires natives - Protocole différent du papier original : images carrées vs rectangulaires natives
--- ---
## Références Bibliographiques ## 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] 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+] 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] 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 ## Explication de la Démarche de Test
### Méthode Baseline ### 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). **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 ### Méthode de Test SegFormer
**Évaluation comparative temps réel** : **Évaluation comparative temps réel** :
1. **SegFormer-B0** : Modèle compact ciblé (3.7M paramètres) pour validation du concept 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 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 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 4. **Analyse différentielle** : Impact du ratio d'image 1:1 vs 2:1 natif Cityscapes
**Métriques d'évaluation** : **Métriques d'évaluation** :
- Mean IoU (métrique principale) et accuracy pixel-wise - Mean IoU (métrique principale) et accuracy pixel-wise
- Performance par classe sémantique (focus classes critiques : Human, Vehicle) - Performance par classe sémantique (focus classes critiques : Human, Vehicle)
- Temps d'inférence CPU/GPU pour validation déploiement pratique - Temps d'inférence CPU/GPU pour validation déploiement pratique
### Preuve de Concept ### Preuve de Concept
**Interface Streamlit** déployée sur serveur NAS personnel (CPU Intel N100) permettant : **Interface Streamlit** déployée sur serveur NAS personnel (CPU Intel N100) permettant :
- Upload d'images urbaines avec **inférence comparative multi-modèles** - Upload d'images urbaines avec **inférence comparative multi-modèles**
- **Visualisation côte-à-côte** : FPN+ResNet34 vs SegFormer-B1 (meilleurs représentants) - **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 - Affichage temps d'inférence réel et métriques de performance détaillées
- **Analyse exploratoire dataset** : Distribution classes, statistiques pixel-wise interactives - **Analyse exploratoire dataset** : Distribution classes, statistiques pixel-wise interactives
**Hypothèses de validation** : **Hypothèses de validation** :
1. **SegFormer-B1 > FPN baselines** malgré contraintes ratio d'image 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 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 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. **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. **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) # 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. # The NGINX_PORT has to be opened (Dockerfile) and used by app.py (streamlit) in order to make right calls.
worker_processes 1; worker_processes 1;
events { worker_connections 1024; } events { worker_connections 1024; }
http { http {
# ✅ AJOUT: Limite d'upload augmentée # ✅ AJOUT: Limite d'upload augmentée
client_max_body_size 200M; # Permet uploads jusqu'à 200MB client_max_body_size 200M; # Permet uploads jusqu'à 200MB
server { server {
listen ${NGINX_PORT}; listen ${NGINX_PORT};
# ✅ AJOUT: Timeouts pour gros fichiers # ✅ AJOUT: Timeouts pour gros fichiers
client_body_timeout 60s; client_body_timeout 60s;
client_header_timeout 60s; client_header_timeout 60s;
keepalive_timeout 60s; keepalive_timeout 60s;
send_timeout 60s; send_timeout 60s;
location /api/ { location /api/ {
proxy_pass http://127.0.0.1:8000/; proxy_pass http://127.0.0.1:8000/;
proxy_set_header Host $host; proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header X-Forwarded-Proto $scheme;
# ✅ AJOUT: Timeouts pour uploads # ✅ AJOUT: Timeouts pour uploads
proxy_read_timeout 300s; proxy_read_timeout 300s;
proxy_connect_timeout 75s; proxy_connect_timeout 75s;
proxy_send_timeout 300s; proxy_send_timeout 300s;
} }
location / { location / {
proxy_pass http://127.0.0.1:8501/; proxy_pass http://127.0.0.1:8501/;
proxy_http_version 1.1; proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade; proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade"; proxy_set_header Connection "upgrade";
proxy_set_header Host $host; proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header X-Forwarded-Proto $scheme;
# ✅ AJOUT: Timeouts pour Streamlit uploads # ✅ AJOUT: Timeouts pour Streamlit uploads
proxy_read_timeout 300s; proxy_read_timeout 300s;
proxy_connect_timeout 75s; proxy_connect_timeout 75s;
proxy_send_timeout 300s; proxy_send_timeout 300s;
} }
location /health { location /health {
return 200 'OK'; return 200 'OK';
add_header Content-Type text/plain; 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 #!/bin/bash
set -e set -e
# Set default port si non fourni # Set default port si non fourni
export NGINX_PORT=${NGINX_PORT:-8080} export NGINX_PORT=${NGINX_PORT:-8080}
export MULTISEG_API_BASE_URL=${MULTISEG_API_BASE_URL:-http://localhost:$NGINX_PORT/api} export MULTISEG_API_BASE_URL=${MULTISEG_API_BASE_URL:-http://localhost:$NGINX_PORT/api}
echo "=== Multi-Segmentation API Docker Startup ===" echo "=== Multi-Segmentation API Docker Startup ==="
echo "NGINX_PORT: $NGINX_PORT" echo "NGINX_PORT: $NGINX_PORT"
echo "API_BASE_URL: $MULTISEG_API_BASE_URL" echo "API_BASE_URL: $MULTISEG_API_BASE_URL"
# Substitute environment variables dans nginx config # Substitute environment variables dans nginx config
envsubst '${NGINX_PORT}' < /etc/nginx/nginx.conf.template > /etc/nginx/nginx.conf envsubst '${NGINX_PORT}' < /etc/nginx/nginx.conf.template > /etc/nginx/nginx.conf
# S'assurer que les répertoires nginx sont accessibles # S'assurer que les répertoires nginx sont accessibles
mkdir -p /var/cache/nginx /var/run/nginx /var/log/nginx 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 chown -R www-data:www-data /var/cache/nginx /var/run/nginx /var/log/nginx
# Créer le dossier uploads temporaire # Créer le dossier uploads temporaire
mkdir -p /tmp/uploads mkdir -p /tmp/uploads
echo "Starting FastAPI server..." echo "Starting FastAPI server..."
uvicorn app.main:app --host 0.0.0.0 --port 8000 --loop asyncio & uvicorn app.main:app --host 0.0.0.0 --port 8000 --loop asyncio &
echo "Starting Streamlit app..." echo "Starting Streamlit app..."
streamlit run app/streamlit_app.py \ streamlit run app/streamlit_app.py \
--server.port 8501 \ --server.port 8501 \
--server.address 0.0.0.0 \ --server.address 0.0.0.0 \
--server.enableXsrfProtection false \ --server.enableXsrfProtection false \
--server.enableCORS false \ --server.enableCORS false \
--server.headless true \ --server.headless true \
& &
# Vérifier que FastAPI est prêt # Vérifier que FastAPI est prêt
echo "Waiting for FastAPI to be ready..." echo "Waiting for FastAPI to be ready..."
until curl -s http://127.0.0.1:8000/health > /dev/null; do until curl -s http://127.0.0.1:8000/health > /dev/null; do
echo " FastAPI not ready yet, waiting..." echo " FastAPI not ready yet, waiting..."
sleep 2 sleep 2
done done
echo "✅ FastAPI is ready!" echo "✅ FastAPI is ready!"
# Vérifier que Streamlit est prêt # Vérifier que Streamlit est prêt
echo "Waiting for Streamlit to be ready..." echo "Waiting for Streamlit to be ready..."
until curl -s http://127.0.0.1:8501 > /dev/null; do until curl -s http://127.0.0.1:8501 > /dev/null; do
echo " Streamlit not ready yet, waiting..." echo " Streamlit not ready yet, waiting..."
sleep 2 sleep 2
done done
echo "✅ Streamlit is ready!" echo "✅ Streamlit is ready!"
echo "🚀 Launching NGINX reverse proxy on port $NGINX_PORT..." echo "🚀 Launching NGINX reverse proxy on port $NGINX_PORT..."
nginx -c /etc/nginx/nginx.conf -g 'daemon off;' nginx -c /etc/nginx/nginx.conf -g 'daemon off;'

File diff suppressed because it is too large Load diff