Introduction
Ce laboratoire montre comment utiliser l'API scikit-learn pour traiter un grand ensemble de données d'images de visages et apprendre un ensemble de patches d'images de 20 x 20 représentant des visages. L'aspect clé de ce laboratoire est l'utilisation de l'apprentissage en ligne, où nous chargeons et traitons les images une par une et extraisons 50 patches aléatoires de chaque image. Nous accumulons 500 patches (à partir de 10 images) puis exécutons la méthode partial_fit de l'objet MiniBatchKMeans pour le KMeans en ligne.
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 Notebook pour accéder à Jupyter Notebook pour la pratique.
Parfois, vous devrez peut-être attendre quelques secondes pour que Jupyter Notebook ait fini de charger. La validation des opérations ne peut pas être automatisée en raison des limitations de Jupyter Notebook.
Si vous rencontrez des problèmes pendant l'apprentissage, n'hésitez pas à demander à Labby. Donnez des commentaires après la session et nous résoudrons rapidement le problème pour vous.
Charger les données
Nous commençons par charger l'ensemble de données d'images de visages Olivetti à partir de scikit-learn.
from sklearn import datasets
faces = datasets.fetch_olivetti_faces()
Apprendre le dictionnaire d'images
Nous utilisons MiniBatchKMeans pour apprendre le dictionnaire d'images. Nous définissons le nombre de clusters sur 81, définissons un état aléatoire et activons le mode verbeux. Nous créons ensuite un tampon pour stocker les patches et parcourons chaque image dans l'ensemble de données. Nous extrayons 50 patches de chaque image et redimensionnons les données. Nous ajoutons ensuite les données au tampon et incrémentons l'index. Si l'index est un multiple de 10, nous concaténons le tampon et exécutons partial_fit sur les données. Si l'index est un multiple de 100, nous affichons un message indiquant le nombre de patches qui ont été ajustés jusqu'à présent.
import time
import numpy as np
from sklearn.cluster import MiniBatchKMeans
from sklearn.feature_extraction.image import extract_patches_2d
print("Learning the dictionary... ")
rng = np.random.RandomState(0)
kmeans = MiniBatchKMeans(n_clusters=81, random_state=rng, verbose=True, n_init=3)
patch_size = (20, 20)
buffer = []
t0 = time.time()
## The online learning part: cycle over the whole dataset 6 times
index = 0
for _ in range(6):
for img in faces.images:
data = extract_patches_2d(img, patch_size, max_patches=50, random_state=rng)
data = np.reshape(data, (len(data), -1))
buffer.append(data)
index += 1
if index % 10 == 0:
data = np.concatenate(buffer, axis=0)
data -= np.mean(data, axis=0)
data /= np.std(data, axis=0)
kmeans.partial_fit(data)
buffer = []
if index % 100 == 0:
print("Partial fit of %4i out of %i" % (index, 6 * len(faces.images)))
dt = time.time() - t0
print("done in %.2fs." % dt)
Tracer les résultats
Enfin, nous traçons les patches de visages et affichons le temps d'entraînement.
import matplotlib.pyplot as plt
plt.figure(figsize=(4.2, 4))
for i, patch in enumerate(kmeans.cluster_centers_):
plt.subplot(9, 9, i + 1)
plt.imshow(patch.reshape(patch_size), cmap=plt.cm.gray, interpolation="nearest")
plt.xticks(())
plt.yticks(())
plt.suptitle(
"Patches of faces\nTrain time %.1fs on %d patches" % (dt, 8 * len(faces.images)),
fontsize=16,
)
plt.subplots_adjust(0.08, 0.02, 0.92, 0.85, 0.08, 0.23)
plt.show()
Sommaire
Dans ce laboratoire, nous avons montré comment utiliser l'apprentissage en ligne pour traiter un grand ensemble de données d'images de visages et apprendre un ensemble de patches d'images représentant des visages. Nous avons utilisé MiniBatchKMeans pour apprendre le dictionnaire d'images et tracé les résultats.