Segmentation d'image avec agglomération hiérarchique

Machine LearningMachine LearningBeginner
Pratiquer maintenant

This tutorial is from open-source community. Access the source code

💡 Ce tutoriel est traduit par l'IA à partir de la version anglaise. Pour voir la version originale, vous pouvez cliquer ici

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.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL ml(("Machine Learning")) -.-> ml/FrameworkandSoftwareGroup(["Framework and Software"]) sklearn(("Sklearn")) -.-> sklearn/CoreModelsandAlgorithmsGroup(["Core Models and Algorithms"]) sklearn(("Sklearn")) -.-> sklearn/DataPreprocessingandFeatureEngineeringGroup(["Data Preprocessing and Feature Engineering"]) sklearn/CoreModelsandAlgorithmsGroup -.-> sklearn/cluster("Clustering") sklearn/DataPreprocessingandFeatureEngineeringGroup -.-> sklearn/feature_extraction("Feature Extraction") ml/FrameworkandSoftwareGroup -.-> ml/sklearn("scikit-learn") subgraph Lab Skills sklearn/cluster -.-> lab-49084{{"Segmentation d'image avec agglomération hiérarchique"}} sklearn/feature_extraction -.-> lab-49084{{"Segmentation d'image avec agglomération hiérarchique"}} ml/sklearn -.-> lab-49084{{"Segmentation d'image avec agglomération hiérarchique"}} end

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.