Menu
CoddyTech

복습: 얼굴 스캐너

Coddy Machine Learning 여정의 비지도 학습 섹션에 포함된 레슨. 51개 중 33번째.

challenge icon

챌린지

중급

사무실 문 카메라는 얼굴당 k개의 숫자만 저장할 수 있으며, 프로그램은 k를 읽습니다. 시작 코드는 16×16픽셀 얼굴 300개를 X에 그립니다.

  1. k개의 구성 요소로 PCA를 학습합니다. 아래와 같이 유지된 분산의 비율을 출력합니다.
  2. axs[0]에 얼굴 0을 그리고, 얼굴당 k개의 숫자로 복원한 얼굴을 axs[1]에 그립니다. 둘 다 cmap="gray"를 사용합니다.
  3. axs[2]에 구성 요소 1을 cmap="gray_r"로 그립니다. 표시합니다.

다른 카메라와 4를 사용하면 다음과 같습니다.

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

16×16 그림 세 개: 웃는 얼굴, 숫자 4개로 복원한 약간 더 매끄러운 얼굴, 그리고 흰색 배경에 어두운 얼굴 모양으로 표시된 구성 요소 1

그러면 Coddy가 세 패널을 설명합니다.

직접 해보기

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


# 16 × 16픽셀 크기의 얼굴을 count개 그립니다. 얼굴마다 밝기 값(0부터 1까지) 256개를 한 줄로 펼칩니다
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개와 얼굴마다 보관할 수 있는 숫자의 개수
X = make_faces(300, seed=7)
k = int(input())

# 아래 줄은 변경하지 마세요
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")

# 아래에 코드를 작성하세요

비지도 학습의 모든 레슨

직접 연습해 보세요: 온라인 Python 컴파일러