Gesichtsausschnitte des Wörterbuchs visualisieren

Beginner

This tutorial is from open-source community. Access the source code

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.