Classification spectrale pour la segmentation d'images

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 à effectuer la segmentation d'images à l'aide de la classification spectrale. Nous allons générer une image avec de multiples cercles connectés et utiliser la classification spectrale pour séparer les cercles.

Conseils sur la machine virtuelle

Une fois le démarrage de la machine virtuelle terminé, cliquez dans le coin supérieur gauche pour basculer vers l'onglet Carnet de notes pour accéder au carnet Jupyter pour pratiquer.

Parfois, vous devrez peut-être attendre quelques secondes pour que le carnet Jupyter ait fini de charger. La validation des opérations ne peut pas être automatisée en raison des limitations du carnet Jupyter.

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 les données

Nous allons générer une image avec quatre cercles à l'aide de numpy. Nous ajouterons ensuite du bruit à l'image et créerons un masque pour limiter l'image au plan d'avant.

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 l'image en graphe

Nous allons utiliser img_to_graph de sklearn.feature_extraction.image pour convertir l'image en graphe. La valeur du gradient sur les arêtes sera également calculée.

from sklearn.feature_extraction import image

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

Classification spectrale

Nous allons utiliser la fonction spectral_clustering de sklearn.cluster pour effectuer une classification spectrale. Le paramètre n_clusters est défini sur 4 pour séparer les quatre cercles.

from sklearn.cluster import spectral_clustering

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

Tracer les résultats

Nous allons tracer l'image d'origine et l'image segmentée côte à côte à l'aide de 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()

Tracer deux cercles

Nous allons répéter le processus ci-dessus, mais ne considérer que les deux premiers cercles générés.

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()

Sommaire

Dans ce laboratoire, nous avons appris à effectuer la segmentation d'images à l'aide de la classification spectrale. Nous avons généré une image avec plusieurs cercles connectés, converti l'image en graphe, effectué une classification spectrale et tracé les résultats.