Initial commit of scripts
This commit is contained in:
parent
59a126cf49
commit
6bdda85438
17 changed files with 5353 additions and 5353 deletions
212
.dockerignore
212
.dockerignore
|
|
@ -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
|
||||||
|
|
|
||||||
82
.env.example
82
.env.example
|
|
@ -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
|
||||||
|
|
|
||||||
88
Dockerfile
88
Dockerfile
|
|
@ -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
230
README.MD
|
|
@ -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.
|
||||||
216
app/README.MD
216
app/README.MD
|
|
@ -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
|
||||||
|
|
|
||||||
1666
app/main.py
1666
app/main.py
File diff suppressed because it is too large
Load diff
|
|
@ -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
|
||||||
|
|
|
||||||
3778
app/streamlit_app.py
3778
app/streamlit_app.py
File diff suppressed because it is too large
Load diff
|
|
@ -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"]
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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>
|
||||||
|
|
@ -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
|
||||||
|
|
||||||

|

|
||||||
*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
|
||||||
|
|
||||||

|

|
||||||
*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.
|
||||||
|
|
@ -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.
|
||||||
114
nginx.conf
114
nginx.conf
|
|
@ -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
104
start.sh
|
|
@ -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;'
|
||||||
|
|
|
||||||
1314
utils/utils.py
1314
utils/utils.py
File diff suppressed because it is too large
Load diff
Loading…
Add table
Reference in a new issue