Introduction
Dans ce laboratoire, nous allons apprendre à utiliser l'agrégation hiérarchique pour segmenter une image 2D. L'agrégation hiérarchique est un algorithme d'agrégation qui regroupe des points de données similaires. Dans le contexte de la segmentation d'image, l'agrégation hiérarchique peut être utilisée pour regrouper des pixels ayant des intensités de couleur similaires, ce qui peut être utile pour identifier des régions ou des objets distincts dans une image.
Nous utiliserons la bibliothèque scikit-learn de Python pour effectuer une agrégation hiérarchique sur une image de pièces.
Conseils sur la VM
Une fois le démarrage de la VM terminé, cliquez dans le coin supérieur gauche pour basculer vers l'onglet Notebook pour accéder à Jupyter Notebook pour la pratique.
Parfois, vous devrez peut-être attendre quelques secondes pour que Jupyter Notebook ait fini de charger. La validation des opérations ne peut pas être automatisée en raison des limitations de Jupyter Notebook.
Si vous rencontrez des problèmes pendant l'apprentissage, n'hésitez pas à demander à Labby. Donnez votre feedback après la session, et nous réglerons rapidement le problème pour vous.
Générer des données
Nous allons commencer par générer les données. Nous utiliserons l'ensemble de données coins de scikit-image, qui est une image en niveaux de gris 2D de pièces. Nous allons redimensionner l'image à 20% de sa taille d'origine pour accélérer le traitement.
from skimage.data import coins
import numpy as np
from scipy.ndimage import gaussian_filter
from skimage.transform import rescale
orig_coins = coins()
## Redimensionnez-la à 20% de sa taille d'origine pour accélérer le traitement
## Appliquer un filtre gaussien pour le lissage avant le redimensionnement vers le bas
## réduit les artefacts d'aliasing.
smoothened_coins = gaussian_filter(orig_coins, sigma=2)
rescaled_coins = rescale(
smoothened_coins,
0.2,
mode="reflect",
anti_aliasing=False,
)
X = np.reshape(rescaled_coins, (-1, 1))
Définir la structure des données
Les pixels dans une image sont connectés à leurs voisins. Pour effectuer une agrégation hiérarchique sur une image, nous devons définir la structure des données. Nous pouvons utiliser la fonction grid_to_graph de scikit-learn pour créer une matrice de connectivité qui définit la structure des données.
from sklearn.feature_extraction.image import grid_to_graph
connectivity = grid_to_graph(*rescaled_coins.shape)
Calculer l'agglomération
Avec les données et la matrice de connectivité définies, nous pouvons maintenant effectuer une agglomération hiérarchique. Nous utiliserons la classe AgglomerativeClustering de scikit-learn pour effectuer l'agglomération. Nous définirons le nombre de clusters à 27, qui est le nombre de pièces dans l'image. Nous utiliserons la méthode de liaison "ward", qui minimise la variance des distances entre les clusters en cours de fusion. Nous passerons également la matrice de connectivité que nous avons créée dans l'étape 2.
from sklearn.cluster import AgglomerativeClustering
import time as time
print("Compute structured hierarchical clustering...")
st = time.time()
n_clusters = 27 ## nombre de régions
ward = AgglomerativeClustering(
n_clusters=n_clusters, linkage="ward", connectivity=connectivity
)
ward.fit(X)
label = np.reshape(ward.labels_, rescaled_coins.shape)
print(f"Elapsed time: {time.time() - st:.3f}s")
print(f"Number of pixels: {label.size}")
print(f"Number of clusters: {np.unique(label).size}")
Tracer les résultats
Enfin, nous pouvons tracer les résultats sur une image. Nous utiliserons matplotlib pour tracer l'image redimensionnée et les contours des clusters. Nous parcourrons chaque cluster et traçons le contour des pixels de ce cluster.
import matplotlib.pyplot as plt
plt.figure(figsize=(5, 5))
plt.imshow(rescaled_coins, cmap=plt.cm.gray)
for l in range(n_clusters):
plt.contour(
label == l,
colors=[
plt.cm.nipy_spectral(l / float(n_clusters)),
],
)
plt.axis("off")
plt.show()
Sommaire
Dans ce laboratoire, nous avons appris à utiliser l'agglomération hiérarchique pour segmenter une image 2D. Nous avons généré les données, défini la structure des données, effectué une agglomération hiérarchique et tracé les résultats sur une image. Cette technique peut être utile pour identifier des régions ou des objets distincts dans une image.