Skip to content

Si-Rin/semantic-segmentation-with-U-Net

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

1 Commit
 
 
 
 
 
 
 
 

Repository files navigation

🩺 Segmentation Sémantique avec U-Net — Multi-classe & Binaire

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).


📌 Objectif

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

🗂️ Structure du projet

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.


🗃️ Données

Partie 1 & 2 — Dataset multiclasse custom

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/

Exercice — ISIC 2016 Skin Lesion Dataset

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/

🔬 Pipeline d'analyse

Partie 1 — U-Net from scratch (7 classes)

Architecture U-Net

                    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

Prétraitement

  1. LabelEncoder — encode les valeurs de pixel des masques en entiers 0→6
  2. normalize() (Keras) — normalisation des images sur l'axe 1
  3. to_categorical() — masques encodés en one-hot pour la loss softmax
  4. train_test_split — 80% train / 20% validation (random_state=1)

Partie 2 — U-Net SANS Skip Connections

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.


Exercice — U-Net avec backbones pré-entraînés (ISIC)

Segmentation binaire de lésions cutanées

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

📊 Résultats obtenus

Partie 1 vs 2 — Mean IoU (dataset multiclasse)

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.

Exercice — IoU sur ISIC (segmentation binaire)

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.


🏆 Conclusions

  • 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

⚙️ Installation & Exécution

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

🔧 Technologies utilisées

Python TensorFlow Keras OpenCV scikit-learn NumPy

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

No releases published

Packages

 
 
 

Contributors