Menu
CoddyTech

Rückblick: Gesichtsscanner

Teil des Abschnitts Unüberwachtes Lernen der Machine Learning-Journey von Coddy. Lektion 33 von 51.

challenge icon

Aufgabe

Mittel

Eine Bürotürkamera speichert möglicherweise nur k Zahlen pro Gesicht; das Programm liest k ein. Der Startcode zeichnet 300 Gesichter mit jeweils 16 mal 16 Pixeln in X.

  1. Führe PCA mit k Komponenten durch. Gib den Anteil der erhaltenen Varianz wie unten aus.
  2. Zeichne Gesicht 0 auf axs[0] und seine Rekonstruktion aus k Zahlen auf axs[1], beide mit cmap="gray".
  3. Zeichne Komponente 1 auf axs[2] mit cmap="gray_r". Zeige die Abbildung an.

Für eine andere Kamera und 4:

Kept: 80.5% of the variance with 4 numbers per face

Drei Bilder mit jeweils 16 mal 16 Pixeln: ein lächelndes Gesicht, seine etwas glattere Rekonstruktion aus 4 Zahlen und Komponente 1, eine dunkle Gesichtsform auf weißem Hintergrund

Coddy beschreibt anschließend deine drei Bereiche.

Probier es selbst

import numpy as np
import matplotlib.pyplot as plt
from sklearn.decomposition import PCA


# Erzeugt count Gesichter mit 16 × 16 Pixeln: pro Gesicht eine flache Zeile mit 256 Helligkeitswerten (0 bis 1)
def make_faces(count, seed):
    rng = np.random.default_rng(seed)
    cols, rows = np.meshgrid(np.arange(16), np.arange(16))
    faces = []
    for i in range(count):
        light = rng.uniform(0.55, 0.95)
        side = rng.uniform(-0.25, 0.25)
        head = ((cols - 7.5) / 6.2) ** 2 + ((rows - 8) / 7.6) ** 2 < 1
        face = head * (light + side * (cols - 7.5) / 7.5)
        eye_row = rng.uniform(5, 7)
        gap = rng.uniform(2.2, 3.6)
        for eye_col in [7.5 - gap, 7.5 + gap]:
            face = face - 0.7 * np.exp(-((cols - eye_col) ** 2 + (rows - eye_row) ** 2) / 1.2)
        smile = rng.uniform(-2, 2)
        mouth_row = 11.5 - smile * ((cols - 7.5) / 3.5) ** 2
        mouth = np.exp(-((rows - mouth_row) ** 2) / 0.4) * (np.abs(cols - 7.5) < 3.6)
        face = face - 0.6 * mouth + rng.normal(0, 0.04, size=(16, 16))
        faces.append(np.clip(face, 0, 1).flatten())
    return np.round(np.array(faces), 2)


# 300 Gesichter, die die Türkamera gesehen hat, und wie viele Zahlen sie pro Gesicht behalten darf
X = make_faces(300, seed=7)
k = int(input())

# Ändere die folgenden Zeilen nicht
fig, axs = plt.subplots(1, 3)
axs[0].set_title("Face")
axs[1].set_title(f"Rebuilt from {k}")
axs[2].set_title("Component 1")

# Schreibe deinen Code darunter

Alle Lektionen in Unüberwachtes Lernen

Übe selbstständig: Online-Python-Compiler