Menu
CoddyTech

Recapitulação: scanner facial

Parte da seção Aprendizado não supervisionado do Journey de Machine Learning da Coddy. Lição 33 de 51.

challenge icon

Desafio

Médio

Uma câmera na porta do escritório pode manter apenas k números por rosto; o programa lê k. O código inicial desenha 300 rostos de 16 por 16 pixels em X.

  1. Ajuste o PCA com k componentes. Imprima a proporção da variância mantida, como abaixo.
  2. Desenhe o rosto 0 em axs[0] e sua reconstrução a partir de k números em axs[1], ambos com cmap="gray".
  3. Desenhe o componente 1 em axs[2] com cmap="gray_r". Exiba.

Para outra câmera e 4:

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

Três imagens de 16 por 16: um rosto sorridente, sua reconstrução ligeiramente mais suave a partir de 4 números e o componente 1, um formato de rosto escuro sobre fundo branco

Em seguida, Coddy descreve seus três painéis.

Experimente você mesmo

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


# Desenha count rostos de 16 por 16 pixels: uma linha plana de 256 valores de brilho (0 a 1) por rosto
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 rostos capturados pela câmera da porta e quantos números ela pode guardar por rosto
X = make_faces(300, seed=7)
k = int(input())

# Não altere as linhas abaixo
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")

# Escreva seu código abaixo

Todas as lições de Aprendizado não supervisionado

Pratique por conta própria: Compilador de Python online