Segmentación de monedas griegas con agrupamiento espectral

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, usaremos el agrupamiento espectral para segmentar una imagen de monedas griegas en múltiples regiones parcialmente homogéneas. El agrupamiento espectral es una técnica poderosa que se puede utilizar para identificar grupos en un conjunto de datos basado en la similitud entre sus características. En este laboratorio, usaremos el agrupamiento espectral para segmentar una imagen creando un gráfico a partir de la diferencia entre voxeles en una imagen y luego rompiendo la imagen en múltiples regiones parcialmente homogéneas.

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 ml(("Machine Learning")) -.-> ml/FrameworkandSoftwareGroup(["Framework and Software"]) ml/FrameworkandSoftwareGroup -.-> ml/sklearn("scikit-learn") subgraph Lab Skills ml/sklearn -.-> lab-49083{{"Segmentación de monedas griegas con agrupamiento espectral"}} end

Cargar y preprocesar la imagen

Comenzaremos cargando la imagen de monedas griegas y la preprocesaremos para que sea más fácil de trabajar. Redimensionaremos la imagen al 20% de su tamaño original y aplicaremos un filtro Gaussiano para suavizarla antes de reducir la escala para reducir artefactos de alias.

## cargar las monedas como una matriz de numpy
monedas_orig = monedas()

## Redimensionarla al 20% de su tamaño original para acelerar el procesamiento
## Aplicando un filtro Gaussiano para suavizar antes de reducir la escala
## reduce los artefactos de alias.
monedas_suavizadas = filtro_gaussiano(monedas_orig, sigma=2)
monedas_redimensionadas = reescalar(monedas_suavizadas, 0.2, modo="reflect", anti_aliasing=False)

Convertir la imagen en un gráfico con el valor del gradiente en los bordes

Convertiremos la imagen en un gráfico con el valor del gradiente en los bordes. Entre menor sea beta, más independiente será la segmentación de la imagen real. Para beta = 1, la segmentación es cercana a una voronoi.

## Convertir la imagen en un gráfico con el valor del gradiente en los
## bordes.
grafica = imagen.img_to_graph(monedas_redimensionadas)

## Tomar una función decreciente del gradiente: una exponencial
beta = 10
eps = 1e-6
grafica.data = np.exp(-beta * grafica.data / grafica.data.std()) + eps

Aplicar el agrupamiento espectral

Aplicaremos el agrupamiento espectral utilizando el eigen_solver='arpack' por defecto. Se puede utilizar cualquier resolvente implementado: eigen_solver='arpack', 'lobpcg' o 'amg'. Elegir eigen_solver='amg' requiere un paquete adicional llamado 'pyamg'. La calidad de la segmentación y la velocidad de cálculo se determinan en gran medida por la elección del resolvente y el valor de la tolerancia 'eigen_tol'.

## Aplicar el agrupamiento espectral utilizando el eigen_solver='arpack' por defecto.
## Se puede utilizar cualquier resolvente implementado: eigen_solver='arpack', 'lobpcg', o 'amg'.
## Elegir eigen_solver='amg' requiere un paquete adicional llamado 'pyamg'.
## La calidad de la segmentación y la velocidad de cálculo se determinan en gran medida
## por la elección del resolvente y el valor de la tolerancia 'eigen_tol'.
n_regiones = 26
n_regiones_más = 3
for assign_labels in ("kmeans", "discretize", "cluster_qr"):
    t0 = time.time()
    labels = spectral_clustering(
        grafica,
        n_clusters=(n_regiones + n_regiones_más),
        eigen_tol=1e-7,
        assign_labels=assign_labels,
        random_state=42,
    )
    t1 = time.time()
    labels = labels.reshape(monedas_redimensionadas.shape)

Visualizar la segmentación

Visualizaremos las regiones resultantes trazando la imagen original y superponiendo los contornos de las regiones segmentadas.

plt.figure(figsize=(5, 5))
plt.imshow(monedas_redimensionadas, cmap=plt.cm.gray)
plt.xticks(())
plt.yticks(())
title = "Agrupamiento espectral: %s, %.2fs" % (assign_labels, (t1 - t0))
print(title)
plt.title(title)
for l in range(n_regiones):
    colors = [plt.cm.nipy_spectral((l + 4) / float(n_regiones + 4))]
    plt.contour(labels == l, colors=colors)
plt.show()

Resumen

En este laboratorio, utilizamos el agrupamiento espectral para segmentar una imagen de monedas griegas en múltiples regiones parcialmente homogéneas. Preprocesamos la imagen, la convertimos en un gráfico con el valor del gradiente en los bordes, aplicamos el agrupamiento espectral y visualizamos las regiones resultantes. El agrupamiento espectral es una técnica poderosa que se puede utilizar para identificar grupos en un conjunto de datos basados en la similitud entre sus características.