Agrupamiento Espectral para la Segmentación de Imágenes

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 realizar la segmentación de imágenes utilizando agrupamiento espectral. Generaremos una imagen con múltiples círculos conectados y usaremos el agrupamiento espectral para separar los círculos.

Consejos sobre la VM

Una vez que se haya iniciado 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-49278{{"Agrupamiento Espectral para la Segmentación de Imágenes"}} sklearn/feature_extraction -.-> lab-49278{{"Agrupamiento Espectral para la Segmentación de Imágenes"}} ml/sklearn -.-> lab-49278{{"Agrupamiento Espectral para la Segmentación de Imágenes"}} end

Generar los datos

Generaremos una imagen con cuatro círculos utilizando numpy. Luego, agregaremos algo de ruido a la imagen y crearemos una máscara para limitar la imagen al primer plano.

import numpy as np

l = 100
x, y = np.indices((l, l))

center1 = (28, 24)
center2 = (40, 50)
center3 = (67, 58)
center4 = (24, 70)

radius1, radius2, radius3, radius4 = 16, 14, 15, 14

circle1 = (x - center1[0]) ** 2 + (y - center1[1]) ** 2 < radius1**2
circle2 = (x - center2[0]) ** 2 + (y - center2[1]) ** 2 < radius2**2
circle3 = (x - center3[0]) ** 2 + (y - center3[1]) ** 2 < radius3**2
circle4 = (x - center4[0]) ** 2 + (y - center4[1]) ** 2 < radius4**2

img = circle1 + circle2 + circle3 + circle4

mask = img.astype(bool)

img = img.astype(float)
img += 1 + 0.2 * np.random.randn(*img.shape)

Convertir la imagen en un gráfico

Usaremos img_to_graph de sklearn.feature_extraction.image para convertir la imagen en un gráfico. También se calculará el valor del gradiente en los bordes.

from sklearn.feature_extraction import image

graph = image.img_to_graph(img, mask=mask)

Agrupamiento espectral

Usaremos la función spectral_clustering de sklearn.cluster para realizar el agrupamiento espectral. El parámetro n_clusters se establece en 4 para separar los cuatro círculos.

from sklearn.cluster import spectral_clustering

labels = spectral_clustering(graph, n_clusters=4, eigen_solver="arpack")

Graficar los resultados

Graficaremos la imagen original y la imagen segmentada lado a lado utilizando matshow de matplotlib.pyplot.

import matplotlib.pyplot as plt

label_im = np.full(mask.shape, -1.0)
label_im[mask] = labels

fig, axs = plt.subplots(nrows=1, ncols=2, figsize=(10, 5))
axs[0].matshow(img)
axs[1].matshow(label_im)

plt.show()

Graficando dos círculos

Repetiremos el proceso anterior, pero solo consideraremos los primeros dos círculos generados.

img = circle1 + circle2
mask = img.astype(bool)
img = img.astype(float)

img += 1 + 0.2 * np.random.randn(*img.shape)

graph = image.img_to_graph(img, mask=mask)
graph.data = np.exp(-graph.data / graph.data.std())

labels = spectral_clustering(graph, n_clusters=2, eigen_solver="arpack")
label_im = np.full(mask.shape, -1.0)
label_im[mask] = labels

fig, axs = plt.subplots(nrows=1, ncols=2, figsize=(10, 5))
axs[0].matshow(img)
axs[1].matshow(label_im)

plt.show()

Resumen

En este laboratorio, aprendimos cómo realizar la segmentación de imágenes utilizando el agrupamiento espectral. Generamos una imagen con múltiples círculos conectados, convertimos la imagen en un gráfico, realizamos el agrupamiento espectral y graficamos los resultados.