Ismail Ben Alla

U-Net Image Segmentation

Six variantes de segmentation mesurées sur les mêmes données

Vision par ordinateur · oct. 2026 · Terminé

Quels choix de conception du U-Net comptent vraiment : skip connections, pooling, profondeur des blocs et résidus, chacun réduit à un drapeau et à un chiffre.

Construit avecPyTorchtorchvisionpytestMatplotlibNumPyKaggleGoogle Colab

U-Net Image Segmentation — vue d’ensemble

Présentation

Tout a commencé par un notebook de cours de vision par ordinateur qui posait quatre questions sur le U-Net : le max-pooling bat-il une convolution à pas, qu’apportent les skip connections, comment un encodeur-décodeur se compare-t-il à un réseau entièrement connecté, et comment choisir le seuil d’inférence. Je l’ai reconstruit en un package où chaque question est un drapeau, les modèles sont petits (1 à 2M de paramètres, quelques minutes par run sur CPU) et chaque réponse est remesurée avec l’IoU et le Dice plutôt que la précision par pixel.

Six presets partagent une seule classe EncoderDecoder : le U-Net simple, une version à convolutions à pas, une version à convolution simple, une version résiduelle, un modèle de type SegNet sans skip connections, et une baseline entièrement connectée faite uniquement de couches Linear. Tous s’entraînent sur les mêmes formes synthétiques et sur un sous-ensemble d’Oxford-IIIT Pet, avec une perte BCE + Dice, et sont notés à partir d’une seule matrice de confusion. Un balayage de seuil sur la partition de validation choisit le seuil, jamais la partition de test.

Sur les formes, le U-Net simple atteint 0,560 d’IoU test contre 0,422 pour les convolutions à pas et 0,489 sans skips ; le modèle entièrement connecté obtient 0,102 avec dix fois plus de paramètres. Sur les photos d’animaux, le U-Net résiduel mène à 0,679, puis le U-Net 0,641, sans skips 0,630 et entièrement connecté 0,524. Le portage du notebook a aussi révélé que ses jeux de validation et de test étaient augmentés, que son balayage de seuil allait de 40 à 80 au lieu de 0,40 à 0,80, et que son modèle entièrement connecté se terminait par un ReLU qui interdisait les logits négatifs.

La question

Qu’apportent chacun les skip connections, le max-pooling, les doubles convolutions et les blocs résiduels à un réseau de segmentation, quand chaque variante est entraînée sur les mêmes données et notée avec la même métrique ?

Fonctionnalités clés

Comment ça marche

  1. Sous-échantillonner quatre fois

    Un ConvBlock d’entrée suivi de quatre étapes de descente divise la résolution par deux à chaque fois, par un max-pool 2 × 2 fixe ou une convolution 3 × 3 apprise de pas 2, avec une ou deux convolutions par bloc et un chemin résiduel optionnel.

  2. Sur-échantillonner et concaténer

    Quatre étapes ConvTranspose 2 × 2 ramènent le goulot d’étranglement à la taille d’origine ; avec les skips, chaque étape concatène la carte de l’encodeur de même taille, et sans skips le décodeur ne voit que le goulot d’étranglement.

  3. Ou se passer des convolutions

    La baseline entièrement connectée aplatit l’image, la fait passer par une pile de couches Linear et remet la sortie en forme, si bien qu’elle n’a ni localité ni hiérarchie.

  4. Entraîner avec BCE + Dice

    AdamW avec warm-up et décroissance cosinus, batch de 16, images de 96 px ; la BCE note chaque pixel et le Dice souple note le recouvrement, ce qui pousse les probabilités vers 0 ou 1.

  5. Noter et choisir le seuil

    Les probabilités au-dessus d’un seuil deviennent le masque ; IoU, Dice, précision et rappel se lisent sur une seule matrice de confusion, et le seuil est balayé sur la partition de validation avant de noter la partition de test.

Exemples

U-Net sur les formes synthétiques, une image par époque : le vert marque les pixels d’objet corrects, le rouge les faux positifs, le bleu les pixels manqués. Le réseau non entraîné peint presque tout en rouge ; à la dernière époque, le masque suit les contours.
Le même U-Net sur des photos d’Oxford-IIIT Pet, époque par époque : le masque se cale sur l’animal en quelques époques, et cette nouvelle exécution a reproduit exactement l’IoU test de 0,641 du tableau.
Les mêmes images de test à travers chaque variante, avec l’IoU par image sous chaque panneau. Le modèle à pas rate des petits triangles entiers, le modèle sans skips transforme les formes en taches arrondies, et le modèle entièrement connecté peint du bruit là où les objets se trouvent d’habitude.
Les mêmes images de test à travers chaque variante, avec l’IoU par image sous chaque panneau. Le modèle à pas rate des petits triangles entiers, le modèle sans skips transforme les formes en taches arrondies, et le modèle entièrement connecté peint du bruit là où les objets se trouvent d’habitude.
Photos d’animaux à travers le U-Net, le U-Net résiduel, le modèle sans skips et la baseline entièrement connectée. Les U-Net trouvent l’animal (rappel d’environ 0,85) mais peignent aussi l’arrière-plan de couleur similaire ; le modèle entièrement connecté prédit une tache centrée quelle que soit la pose.
Photos d’animaux à travers le U-Net, le U-Net résiduel, le modèle sans skips et la baseline entièrement connectée. Les U-Net trouvent l’animal (rappel d’environ 0,85) mais peignent aussi l’arrière-plan de couleur similaire ; le modèle entièrement connecté prédit une tache centrée quelle que soit la pose.
IoU de validation et perte d’entraînement par époque pour les six variantes sur les formes. L’IoU du modèle entièrement connecté chute après l’époque 2 lorsqu’il commence à mémoriser les 600 images d’entraînement.
IoU de validation et perte d’entraînement par époque pour les six variantes sur les formes. L’IoU du modèle entièrement connecté chute après l’époque 2 lorsqu’il commence à mémoriser les 600 images d’entraînement.

Entrée

unetseg-data shapes && python scripts/compare_all.py --data data/shapes --epochs 6 --max-train 600 --threads 1 --out runs/shapes

Sortie

test IoU: unet-single 0.660, unet-residual 0.633, unet 0.560, segnet 0.489, unet-strided 0.422, fcn 0.102 (Dice 0.796, 0.775, 0.718, 0.657, 0.593, 0.184); pixel accuracy above 0.83 for every model, including fcn.

Le run derrière le tableau des formes : 600 images d’entraînement en 96 px, 6 époques, BCE + Dice, 2 à 11 minutes par modèle sur un seul thread CPU.

Stack technique

Ce que j’ai appris

Limites

Mots-clés

U-Net · segmentation d’images · segmentation binaire · skip connections · max-pooling vs convolution à pas · blocs résiduels · SegNet · réseau entièrement convolutif · perte Dice · IoU · balayage de seuil · Oxford-IIIT Pet · PyTorch · vision par ordinateur · apprentissage profond