Menu
CoddyTech

Riepilogo: scanner facciale

Fa parte della sezione Apprendimento non supervisionato del percorso Machine Learning di Coddy. Lezione 33 di 51.

challenge icon

Sfida

Medio

Una telecamera sulla porta di un ufficio può conservare solo k numeri per volto; il programma legge k. Il codice iniziale disegna 300 volti di 16 per 16 pixel in X.

  1. Adatta la PCA con k componenti. Stampa la quota di varianza conservata, come sotto.
  2. Disegna il volto 0 su axs[0] e la sua ricostruzione dai k numeri su axs[1], entrambi con cmap="gray".
  3. Disegna la componente 1 su axs[2] con cmap="gray_r". Mostra.

Per un’altra telecamera e 4:

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

Tre immagini di 16 per 16: un volto sorridente, la sua ricostruzione leggermente più uniforme da 4 numeri e la componente 1, una forma scura di volto su sfondo bianco

Coddy descrive quindi i tuoi tre pannelli.

Provalo tu

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


# Disegna count volti di 16 per 16 pixel: una riga piatta di 256 valori di luminosità (da 0 a 1) per volto
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 volti ripresi dalla telecamera della porta e quanti numeri può conservare per ciascun volto
X = make_faces(300, seed=7)
k = int(input())

# Non modificare le righe qui sotto
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")

# Scrivi il tuo codice qui sotto

Tutte le lezioni di Apprendimento non supervisionato

Esercitati da solo: Compilatore Python online