Menu
CoddyTech

סיכום: סורק פנים

חלק מהיחידה למידה בלתי מונחית במסלול ה-Machine Learning של Coddy. שיעור 33 מתוך 51.

challenge icon

אתגר

בינוני

מצלמת דלת משרדית יכולה לשמור רק k מספרים לכל פנים; התוכנית קוראת את k. קוד הפתיחה מצייר 300 פנים בגודל 16 על 16 פיקסלים לתוך X.

  1. התאימו PCA עם k רכיבים. הדפיסו את החלק היחסי של השונות שנשמרה, כמו למטה.
  2. ציירו את פנים 0 על axs[0] ואת השחזור שלה מ־k מספרים על axs[1], את שניהם עם cmap="gray".
  3. ציירו את רכיב 1 על axs[2] עם 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


# מצייר count פנים בגודל 16 על 16 פיקסלים: שורה שטוחה אחת של 256 ערכי בהירות (0 עד 1) לכל פנים
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 אונליין