Eigenfaces: cómo PCA comprime rostros
Clase 7 de 12 • Curso Avanzado de Álgebra Lineal y Machine Learning: PCA y SVD
Contenido del curso
Clase 7 de 12 • Curso Avanzado de Álgebra Lineal y Machine Learning: PCA y SVD
Contenido del curso
Gabriel Obregón
Jesús Alberto Romero Hernández
📘PCA & EIGENFACES
🎯 ❓ Pregunta clave
➡️ ¿Se puede representar un rostro con mucha menos información sin perder su esencia?
✅ Sí, usando PCA y eigenfaces.
🧠 💡 Idea central
🧩 Un rostro puede expresarse como una combinación ponderada de eigenfaces.
✔️ Menos datos
✔️ Misma identidad
✔️ Estructura facial conservada
➡️ Base del reconocimiento facial y la compresión de imágenes.
👻 🧩 ¿Qué son los eigenfaces?
👤 Los eigenfaces son los componentes principales obtenidos al aplicar PCA a un conjunto de rostros.
Representan patrones comunes del conjunto:
🧠 Cada eigenface es una “cara fantasma” que captura una parte de la variación total.
🔢 🧠 Representación de un rostro
📌 Un rostro se reconstruye así:
🔍 Efecto del número de componentes:
📉 🎯 ¿Por qué usar PCA?
✔️ Reduce dimensionalidad
✔️ Elimina redundancia
✔️ Mantiene la estructura esencial
📊 De 4096 píxeles → 150 valores con alta fidelidad.
🗂️ 📦 Dataset: Olivetti Faces
👥 400 imágenes de rostros 📐 Tamaño: 64 × 64 píxeles 🔢 4096 características por imagen 🧪 Dataset incluido en Scikit-learn
🛠️ 🧰 Herramientas usadas
🔄 🔧 Flujo de trabajo con PCA
➡️ 1️⃣ Cargar imágenes
➡️ 2️⃣ Ajustar PCA (fit)
➡️ 3️⃣ Comprimir rostro (transform)
➡️ 4️⃣ Reconstruir rostro (inverse_transform)
➡️ 5️⃣ Visualizar y comparar resultados
⚠️ Si se usan menos componentes:
Aplicamos La Biblioteca Pillow para crear un array de Numpy. Hay que tener presente que PCA solo trabaja con arrays de 2D máximo por lo que se transformará la ima´gen de 3D a 2D y luego se le devolverá la 3ra dimensión antes de graficar:
### Importación de Bibliotecas y Carga de Imágenes import numpy as np import matplotlib.pyplot as plt from sklearn.decomposition import PCA from PIL import Image img = Image.open('../varian-halcyon.jpg') # Convertir a array de numpy img_array = np.array(img) print(img_array.shape) # Suponiendo que img_array es (alto, ancho, 3) (854, 1280, 3) alto, ancho, canales = img_array.shape ''' Ya que PCA de Scikit-Learn solo acepta arreglos 2D, cambiamos la forma de 3D a 2D (alto, ancho * 3(canales)) para que cada fila sea un píxel con sus 3 valores RGB''' img_reshape = img_array.reshape(alto, ancho * canales) pca = PCA(n_components=100) # Ajusta n_components según lo que querramos conservar pca.fit(img_reshape) def reconstruir_con_k_componentes(k): # Proyectamos los datos originales a los primeros k componentes # En lugar de hacer slice manual y padding, usamos transform e inverse_transform # 1. Transformar la imagen original a sus componentes principales proyeccion = pca.transform(img_reshape) # 2. Creamos una copia donde borramos (ponemos a 0) los componentes > k proyeccion_reducida = proyeccion.copy() proyeccion_reducida[:, k:] = 0 # 3. Reconstruir al espacio original (alto * ancho * 3) reconstruccion = pca.inverse_transform(proyeccion_reducida) # 4. Volver a la forma de imagen original (con los 3 canales) return reconstruccion.reshape(alto, ancho, canales).astype(int) fig, axes = plt.subplots(1, 4, figsize=(16, 5)) # Imagen Original (Asegúrate de pasarle los 3 canales si es color) axes[0].imshow(img_reshape.reshape(alto, ancho, canales)) axes[0].set_title('Original') # Reconstrucciones for i, k_val in enumerate([10, 50, 100], 1): axes[i].imshow(reconstruir_con_k_componentes(k=k_val)) axes[i].set_title(f'k={k_val}') plt.show()