Menu
CoddyTech

Repaso: escáner facial

Parte de la sección Aprendizaje no supervisado del Journey de Machine Learning de Coddy. Lección 33 de 51.

challenge icon

Desafío

Intermedio

La cámara de la puerta de una oficina puede conservar solo k números por cara; el programa lee k. El código inicial dibuja 300 caras de 16 por 16 píxeles en X.

  1. Ajusta PCA con k componentes. Imprime la proporción de la varianza conservada, como se muestra a continuación.
  2. Dibuja la cara 0 en axs[0] y su reconstrucción a partir de k números en axs[1], ambas con cmap="gray".
  3. Dibuja el componente 1 en axs[2] con cmap="gray_r". Muestra el gráfico.

Para otra cámara y 4:

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

Tres imágenes de 16 por 16: una cara sonriente, su reconstrucción ligeramente más suave a partir de 4 números y el componente 1, una forma de cara oscura sobre fondo blanco

Coddy describe después tus tres paneles.

Pruébalo tú mismo

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


# Dibuja count caras de 16 por 16 píxeles: una fila plana de 256 valores de brillo (de 0 a 1) por cara
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 caras que vio la cámara de la puerta y cuántos números puede conservar por cara
X = make_faces(300, seed=7)
k = int(input())

# No cambies las líneas de abajo
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")

# Escribe tu código abajo

Todas las lecciones de Aprendizaje no supervisado

Practica por tu cuenta: Compilador de Python online