Ismail Ben Alla

SegNet Semantic Segmentation

Étiquetage pixel par pixel avec unpooling par indices de pooling

Vision par ordinateur · sept. 2023 · Terminé

Donnez-lui une photo et il étiquette chaque pixel : route, voiture, panneau de signalisation, animal ou fond.

Construit avecPyTorchtorchvisionpytestMatplotlibNumPyKaggleGoogle Colab

SegNet Semantic Segmentation — vue d’ensemble

Présentation

La segmentation sémantique attribue une classe à chaque pixel. SegNet le fait avec un encodeur-décodeur : les 13 couches de convolution de VGG16 réduisent l’image d’un facteur 32, puis un décodeur miroir la ramène à sa taille d’origine. Son idée propre tient à la façon dont le décodeur suréchantillonne. Chaque max-pool de l’encodeur enregistre aussi lequel des quatre pixels de chaque fenêtre contenait le maximum, et le décodeur replace chaque valeur à cette position. Les frontières restent nettes et le décodeur stocke quelques bits par fenêtre au lieu de cartes de caractéristiques complètes.

Je l’ai implémenté en PyTorch pur, sans poids pré-entraînés ni bibliothèque de segmentation : l’encodeur VGG16-BN, le décodeur à max-unpooling par indices, une perte d’entropie croisée plus soft dice qui ignore les pixels non étiquetés, la précision pixel et le mIoU calculés à partir d’une matrice de confusion sur l’ensemble du jeu de validation. La largeur est un seul nombre : le même code donne le modèle à 29.5M paramètres de l’article sur GPU ou un modèle à 1.8M paramètres sur CPU.

Le projet a commencé en 2023 comme un notebook TensorFlow sur les panneaux de signalisation de Mapillary Vistas. Le portage a révélé plusieurs bugs : le jeu d’entraînement avait été écrasé par le jeu de validation, les PNG de labels en palette étaient décodés en niveaux de gris, l’image et son masque étaient retournés indépendamment, et la perte était une MSE sur les identifiants de classe. Le package corrige chacun d’eux et conserve le notebook dans un dossier legacy avec la liste. La suite de tests vérifie qu’un petit SegNet mémorise quatre images de formes ; les chiffres de runs plus longs ne sont pas encore publiés.

La question

Que fait réellement l’unpooling par indices de pooling de SegNet, et une implémentation from scratch sans poids pré-entraînés peut-elle apprendre à étiqueter chaque pixel sur des images jouets et réelles ?

Fonctionnalités clés

Comment ça marche

  1. Encoder et mémoriser les maxima

    Cinq étages de conv, batch-norm et ReLU, chacun suivi d’un max-pool 2 × 2, réduisent une image H × W à H/32 × W/32 ; chaque pool renvoie aussi lequel de ses quatre pixels contenait le max.

  2. Unpooling avec les indices

    Chaque étage du décodeur replace ses valeurs aux positions enregistrées, laisse les trois autres positions de chaque fenêtre à zéro, et des convolutions complètent la carte creuse.

  3. Un logit par classe

    Une dernière convolution 1 × 1 donne num_classes logits par pixel ; l’entraînement utilise l’entropie croisée softmax plus un terme soft dice optionnel, et la prédiction prend l’argmax.

  4. Mesurer sur tout le split

    Une matrice de confusion est accumulée sur chaque pixel de validation ; la précision pixel et le mIoU en sont tirés, et le checkpoint au meilleur mIoU est conservé.

  5. Choisir les données

    Les formes vérifient le pipeline en quelques minutes, Oxford-IIIT Pet fournit les premières vraies photos, et les labels en palette de Mapillary Vistas passent par une table de correspondance vers toutes les classes ou un sous-ensemble choisi.

Exemples

Entrée

segnet-train --dataset shapes --image-size 64 --base-channels 16 --shapes-train-size 1000 --epochs 12 --lr 3e-3 --output-dir checkpoints/shapes

Sortie

checkpoints/shapes/: best.pt (best validation mIoU, with configs and class names), last.pt, history.json (per-epoch train / val loss, pixel accuracy, mIoU, lr), history.png and predictions.png (image / ground truth / prediction for 4 validation images).

La recette CPU du README : un SegNet à 1.8M paramètres sur des formes synthétiques, sans téléchargement.

Entrée

segnet-predict --checkpoint checkpoints/pets/best.pt --images cat.jpg dog.jpg

Sortie

outputs/cat_mask.png, outputs/cat_overlay.png, outputs/dog_mask.png, outputs/dog_overlay.png

Inférence sur vos propres photos avec un checkpoint entraîné sur Oxford-IIIT Pet : un masque d’identifiants de classe et une superposition colorée par image.

Stack technique

Ce que j’ai appris

Limites

Mots-clés

SegNet · segmentation sémantique · encodeur-décodeur · max-unpooling · indices de pooling · VGG16 · PyTorch · mIoU · dice loss · Oxford-IIIT Pet · Mapillary Vistas · segmentation des panneaux de signalisation · vision par ordinateur · deep learning