Segmentation d’Images
Fonctions :
-
Segmentation d’Images (exemple)
La segmentation d’images consiste à attribuer une étiquette à chaque pixel d’une image, afin de délimiter précisément les objets ou zones d’intérêt. Elle est utilisée dans la vision par ordinateur pour identifier des régions spécifiques comme des objets, personnes, routes, etc. La segmentation s’appuie souvent sur des architectures de réseaux de neurones convolutifs (CNN) spécialisées comme U-Net, qui apprennent à segmenter finement les images en classes multiples, pixel par pixel.
Exemple de code :
import tensorflow as tf import tensorflow_datasets as tfds import matplotlib.pyplot as plt # Paramètres IMG_SIZE = 128 BATCH_SIZE = 128 EPOCHS = 1 NUM_CLASSES = 3 # oxford_iiit_pet a 3 classes dans les masques (fond, bord, objet) # Charger le dataset avec annotations de segmentation dataset, info = tfds.load('oxford_iiit_pet:4.0.0', with_info=True) # train_ds et test_ds sont des tuples (image, segmentation_mask) train_ds = dataset['train'] test_ds = dataset['test'] def normalize(datapoint): input_image = datapoint['image'] input_mask = datapoint['segmentation_mask'] input_image = tf.image.resize(input_image, (IMG_SIZE, IMG_SIZE)) input_image = input_image / 255.0 input_mask = tf.image.resize(input_mask, (IMG_SIZE, IMG_SIZE), method='nearest') input_mask = tf.cast(input_mask, tf.int32) - 1 return input_image, input_mask # Préparer les datasets train = train_ds.map(normalize).cache().shuffle(1000).batch(BATCH_SIZE).prefetch(tf.data.AUTOTUNE) test = test_ds.map(normalize).batch(BATCH_SIZE).prefetch(tf.data.AUTOTUNE) # U-Net simple def unet_model(output_channels): inputs = tf.keras.layers.Input(shape=[IMG_SIZE, IMG_SIZE, 3]) # Encoder c1 = tf.keras.layers.Conv2D(64, 3, activation='relu', padding='same')(inputs) p1 = tf.keras.layers.MaxPooling2D()(c1) c2 = tf.keras.layers.Conv2D(128, 3, activation='relu', padding='same')(p1) p2 = tf.keras.layers.MaxPooling2D()(c2) # Bottleneck b = tf.keras.layers.Conv2D(256, 3, activation='relu', padding='same')(p2) # Decoder u1 = tf.keras.layers.UpSampling2D()(b) c3 = tf.keras.layers.Conv2D(128, 3, activation='relu', padding='same')(u1) u2 = tf.keras.layers.UpSampling2D()(c3) c4 = tf.keras.layers.Conv2D(64, 3, activation='relu', padding='same')(u2) outputs = tf.keras.layers.Conv2D(output_channels, 1, activation='softmax')(c4) return tf.keras.Model(inputs=inputs, outputs=outputs) model = unet_model(NUM_CLASSES) model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy']) # Entraînement model.fit(train, epochs=EPOCHS) # Fonction d'affichage def display(display_list): plt.figure(figsize=(15, 5)) title = ['Image', 'Masque vrai', 'Masque prédit'] for i in range(len(display_list)): plt.subplot(1, len(display_list), i + 1) plt.title(title[i]) if i == 0: plt.imshow(display_list[i]) else: # Affiche masque en couleurs avec palette plt.imshow(tf.keras.preprocessing.image.array_to_img(display_list[i]), cmap='gray', vmin=0, vmax=NUM_CLASSES-1) plt.axis('off') plt.show() # Test sur quelques images for image, mask in test.take(3): pred_mask = model.predict(image) pred_mask = tf.argmax(pred_mask, axis=-1) pred_mask = tf.expand_dims(pred_mask, axis=-1) for i in range(image.shape[0]): display([image[i], mask[i], pred_mask[i]])
Explication du code :
1. Définition des paramètres
- Taille des images redimensionnées : 128x128 pixels. - Taille des batchs : 128. - Nombre d’époques d’entraînement : 1. - Nombre de classes dans les masques : 3 (fond, bord, objet).2. Chargement du dataset Oxford-IIIT Pet
- Chargement via `tensorflow_datasets` avec les images et les masques de segmentation. - Séparation en datasets d’entraînement et de test.3. Normalisation et préparation des données
- Fonction `normalize` : - Redimensionnement des images à 128x128 pixels et normalisation des pixels entre 0 et 1. - Redimensionnement des masques avec interpolation « nearest » pour préserver les labels. - Conversion des masques en entiers et décalage des labels de 1 à 0 (fond), 1 (bord), 2 (objet).4. Construction des pipelines de données
- Application de la normalisation sur train et test. - Entraînement : cache, mélange aléatoire, batchs de 32, préchargement asynchrone. - Test : cache, batchs de 32, préchargement asynchrone.5. Définition du modèle U-Net simplifié
- Entrée : images 128x128x3. - Encoder : deux blocs convolution + max pooling (64 puis 128 filtres). - Bottleneck : convolution avec 256 filtres. - Decoder : deux blocs upsampling + convolution (128 puis 64 filtres). - Sortie : convolution 1x1 avec activation softmax sur 3 classes.6. Compilation et entraînement du modèle
- Optimiseur Adam, fonction perte `sparse_categorical_crossentropy`. - Métrique : accuracy. - Entraînement sur 1 époques.7. Fonction d’affichage des résultats
- Affichage côte à côte : image d’entrée, masque vrai, masque prédit. - Masques affichés en niveaux de gris avec palette adaptée aux 3 classes.8. Test et visualisation
- Prédiction sur 3 batchs du dataset test. - Application d’un argmax sur les prédictions pour obtenir la classe la plus probable. - Affichage individuel des images, masques vrais et masques prédits pour chaque image.