Segmentación de imágenes con agrupamiento jerárquico

Machine LearningMachine LearningBeginner
Practicar Ahora

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

💡 Este tutorial está traducido por IA desde la versión en inglés. Para ver la versión original, puedes hacer clic aquí

Introducción

En este laboratorio, aprenderemos a usar el agrupamiento jerárquico para segmentar una imagen bidimensional. El agrupamiento jerárquico es un algoritmo de agrupamiento que agrupa puntos de datos similares. En el contexto de la segmentación de imágenes, el agrupamiento jerárquico se puede usar para agrupar píxeles con intensidades de color similares, lo que puede ser útil para identificar regiones o objetos distintos en una imagen.

Usaremos la biblioteca scikit-learn de Python para realizar el agrupamiento jerárquico en una imagen de monedas.

Consejos sobre la VM

Una vez finalizada la inicialización de la VM, haga clic en la esquina superior izquierda para cambiar a la pestaña Cuaderno y acceder a Jupyter Notebook para practicar.

A veces, es posible que tenga que esperar unos segundos a que Jupyter Notebook termine de cargarse. La validación de las operaciones no se puede automatizar debido a las limitaciones de Jupyter Notebook.

Si tiene problemas durante el aprendizaje, no dude en preguntar a Labby. Deje sus comentarios después de la sesión y lo resolveremos rápidamente para usted.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL sklearn(("Sklearn")) -.-> sklearn/CoreModelsandAlgorithmsGroup(["Core Models and Algorithms"]) sklearn(("Sklearn")) -.-> sklearn/DataPreprocessingandFeatureEngineeringGroup(["Data Preprocessing and Feature Engineering"]) ml(("Machine Learning")) -.-> ml/FrameworkandSoftwareGroup(["Framework and Software"]) 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{{"Segmentación de imágenes con agrupamiento jerárquico"}} sklearn/feature_extraction -.-> lab-49084{{"Segmentación de imágenes con agrupamiento jerárquico"}} ml/sklearn -.-> lab-49084{{"Segmentación de imágenes con agrupamiento jerárquico"}} end

Generar datos

Comenzaremos generando los datos. Usaremos el conjunto de datos coins de scikit-image, que es una imagen en escala de grises bidimensional de monedas. Redimensionaremos la imagen al 20% de su tamaño original para acelerar el procesamiento.

from skimage.data import coins
import numpy as np
from scipy.ndimage import gaussian_filter
from skimage.transform import rescale

orig_coins = coins()

## Redimensionarla al 20% de su tamaño original para acelerar el procesamiento
## Aplicar un filtro Gaussiano para suavizar antes de la reducción de escala
## reduce los artefactos de 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))

Definir la estructura de los datos

Los píxeles en una imagen están conectados a sus vecinos. Para realizar el agrupamiento jerárquico en una imagen, necesitamos definir la estructura de los datos. Podemos usar la función grid_to_graph de scikit-learn para crear una matriz de conectividad que defina la estructura de los datos.

from sklearn.feature_extraction.image import grid_to_graph

connectivity = grid_to_graph(*rescaled_coins.shape)

Calcular el agrupamiento

Con los datos y la matriz de conectividad definidos, ahora podemos realizar el agrupamiento jerárquico. Usaremos la clase AgglomerativeClustering de scikit-learn para realizar el agrupamiento. Estableceremos el número de clusters en 27, que es el número de monedas en la imagen. Usaremos el método de enlace "ward", que minimiza la varianza de las distancias entre los clusters que se están fusionando. También pasaremos la matriz de conectividad que creamos en el paso 2.

from sklearn.cluster import AgglomerativeClustering
import time as time

print("Compute structured hierarchical clustering...")
st = time.time()
n_clusters = 27  ## número de regiones
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}")

Representar los resultados

Finalmente, podemos representar los resultados en una imagen. Usaremos matplotlib para representar la imagen escalada y los contornos de los clusters. Recorreremos cada cluster y representaremos el contorno de los píxeles en ese 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()

Resumen

En este laboratorio, aprendimos cómo usar el agrupamiento jerárquico para segmentar una imagen bidimensional. Generamos los datos, definimos la estructura de los datos, realizamos el agrupamiento jerárquico y representamos los resultados en una imagen. Esta técnica puede ser útil para identificar regiones o objetos distintos en una imagen.