Sujet : Implémentation et comparaison de plusieurs variantes U-Net pour la segmentation d'images médicales — avec/sans skip connections, et avec backbones pré-entraînés (VGG16, MobileNetV2).
Ce projet couvre trois expériences de segmentation :
| Partie | Dataset | Tâche | Modèles |
|---|---|---|---|
| 1 — U-Net scratch | Dataset multiclasse custom (.png + .tif) |
7 classes | U-Net avec skip connections |
| 2 — Sans skip | Même dataset | 7 classes | U-Net sans skip connections |
| Exercice | ISIC 2016 (lésions cutanées) | Binaire (peau vs lésion) | VGG16-UNet, MobileNetV2-UNet |
unet-image-segmentation/
│
├── TP5_Sirin_GRIRA.ipynb ← Notebook principal (Google Colab)
├── requirements.txt
├── README.md
└── .gitignore
⚠️ Ce notebook est conçu pour Google Colab + Google Drive.
Les datasets et modèles entraînés ne sont pas inclus dans le repo (trop lourds).
Voir section "Données" ci-dessous.
Structure attendue dans Google Drive :
tp5/
└── Dataset_Unet_multiclass/
├── train/
│ ├── orig/ ← images .png (grayscale)
│ └── gt/ ← masques .tif (7 classes encodées par valeur de pixel)
└── test/
├── orig/
└── gt/
Téléchargeable sur ISIC Archive.
tp5/partie2/
├── ISBI2016_ISIC_Part1_Training_Data/
├── ISBI2016_ISIC_Part1_Training_GroundTruth/
├── ISBI2016_ISIC_Part1_Test_Data/
└── ISBI2016_ISIC_Part1_Test_GroundTruth/
INPUT 256×256×1
│
┌───────────────┘
[ENCODER] [DECODER]
Conv×2(16) → MaxPool ─────────────→ ConvTranspose + Skip → Conv×2(16)
Conv×2(32) → MaxPool ─────────────→ ConvTranspose + Skip → Conv×2(32)
Conv×2(64) → MaxPool ─────────────→ ConvTranspose + Skip → Conv×2(64)
Conv×2(128)→ MaxPool ─────────────→ ConvTranspose + Skip → Conv×2(128)
│
[BOTTLENECK]
Conv×2(256)
│
Conv(7, 1×1, softmax)
OUTPUT 256×256×7
Chaque bloc Conv×2 contient : Conv2D → BatchNorm → Dropout → Conv2D → BatchNorm
| Paramètre | Valeur |
|---|---|
| Optimiseur | Adam |
| Loss | Categorical Crossentropy |
| Époques | 200 |
| Batch size | 16 |
| Classes | 7 |
| Métrique d'évaluation | Mean IoU |
- LabelEncoder — encode les valeurs de pixel des masques en entiers 0→6
- normalize() (Keras) — normalisation des images sur l'axe 1
- to_categorical() — masques encodés en one-hot pour la loss softmax
- train_test_split — 80% train / 20% validation (random_state=1)
Architecture identique à la Partie 1, mais les concatenate([u_i, c_i]) sont supprimés dans le décodeur. Le décodeur reçoit uniquement les features upsamplées, sans les features haute résolution de l'encodeur.
Conséquence : perte des détails spatiaux fins → contours de segmentation moins précis.
| Modèle | Backbone | Skip connections extraites de |
|---|---|---|
| VGG16-UNet | VGG16 (ImageNet) | block1_conv2, block2_conv2, block3_conv3, block4_conv3, block5_conv3 |
| MobileNetV2-UNet | MobileNetV2 (ImageNet) | block_1_expand_relu, block_3_expand_relu, block_6_expand_relu, block_13_expand_relu, block_16_project |
| Paramètre | Valeur |
|---|---|
| Input size | 128×128×3 |
| Loss | Binary Crossentropy |
| Activation sortie | Sigmoid |
| Époques | 20 |
| Batch size | 8 |
| Modèle | Mean IoU |
|---|---|
| U-Net avec skip connections | ~0.75+ |
| U-Net sans skip connections | ~0.55–0.65 |
Les skip connections permettent de récupérer les détails spatiaux perdus lors du downsampling → segmentation des contours nettement plus précise.
| Modèle | IoU |
|---|---|
| VGG16-UNet | ~0.85+ |
| MobileNetV2-UNet | ~0.82+ |
VGG16 offre une meilleure précision grâce à sa profondeur. MobileNetV2 présente un bon compromis précision/vitesse, utile pour des applications temps réel.
- Les skip connections sont essentielles pour préserver les détails spatiaux en segmentation d'images médicales
- L'utilisation de backbones pré-entraînés sur ImageNet améliore significativement les performances même sur des domaines très différents (lésions cutanées)
- VGG16-UNet > MobileNetV2-UNet en précision, mais MobileNetV2 est plus léger et plus rapide
- La BatchNormalization et le Dropout dans chaque bloc stabilisent l'entraînement sur 200 epochs
Ce notebook est optimisé pour Google Colab (GPU requis pour 200 epochs).
1. Uploader le notebook sur Google Colab
2. Monter Google Drive (drive.mount('/content/drive'))
3. Organiser les datasets dans Drive (voir section Données)
4. Exécuter les cellules dans l'ordre
Pour une exécution locale (GPU recommandé) :
git clone https://github.com/<votre-username>/unet-image-segmentation.git
cd unet-image-segmentation
python -m venv venv && source venv/bin/activate
pip install -r requirements.txt
jupyter notebook TP5_Sirin_GRIRA.ipynb