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.