Einführung
In diesem Lab wird gezeigt, wie die scikit-learn-API verwendet wird, um einen großen Datensatz von Gesichtern zu verarbeiten und einen Satz von 20 x 20-Bildausschnitten zu lernen, die Gesichter repräsentieren. Der Schlüsselaspekt dieses Labs ist die Verwendung des Online-Lernens, bei dem wir Bilder nacheinander laden und verarbeiten und 50 zufällige Ausschnitte aus jedem Bild extrahieren. Wir sammeln 500 Ausschnitte (aus 10 Bildern) und führen dann die partielle_fit-Methode des Online-KMeans-Objekts MiniBatchKMeans aus.
Tipps für die VM
Nachdem der VM-Start abgeschlossen ist, klicken Sie in der oberen linken Ecke, um zur Registerkarte Notebook zu wechseln und Jupyter Notebook für die Übung zu nutzen.
Manchmal müssen Sie einige Sekunden warten, bis Jupyter Notebook vollständig geladen ist. Die Validierung von Vorgängen kann aufgrund der Einschränkungen in Jupyter Notebook nicht automatisiert werden.
Wenn Sie bei der Lernphase Probleme haben, können Sie Labby fragen. Geben Sie nach der Sitzung Feedback ab, und wir werden das Problem für Sie prompt beheben.
Daten laden
Wir laden zunächst den Olivetti Faces-Datensatz aus scikit-learn.
from sklearn import datasets
faces = datasets.fetch_olivetti_faces()
Lernen des Bildwörterbuchs
Wir verwenden MiniBatchKMeans, um das Bildwörterbuch zu lernen. Wir setzen die Anzahl der Cluster auf 81, legen einen Zufallszustand fest und aktivieren den detaillierten Modus. Anschließend erstellen wir einen Puffer, um die Ausschnitte zu speichern, und iterieren über jedes Bild im Datensatz. Wir extrahieren 50 Ausschnitte aus jedem Bild und formen die Daten um. Danach fügen wir die Daten dem Puffer hinzu und erhöhen den Index. Wenn der Index ein Vielfaches von 10 ist, verbinden wir den Puffer und führen partial_fit auf den Daten aus. Wenn der Index ein Vielfaches von 100 ist, geben wir eine Nachricht aus, die die Anzahl der bisher angepassten Ausschnitte angibt.
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)
Ergebnisse visualisieren
Schließlich visualisieren wir die Gesichtsausschnitte und geben die Trainingszeit aus.
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()
Zusammenfassung
In diesem Lab haben wir gezeigt, wie das Online-Lernen verwendet werden kann, um einen großen Datensatz von Gesichtern zu verarbeiten und einen Satz von Bildausschnitten zu lernen, die Gesichter repräsentieren. Wir haben MiniBatchKMeans verwendet, um das Bildwörterbuch zu lernen und die Ergebnisse visualisiert.