얼굴 패치 사전 플롯

Beginner

This tutorial is from open-source community. Access the source code

소개

이 실습에서는 scikit-learn API 를 사용하여 얼굴 이미지의 대규모 데이터셋을 처리하고 얼굴을 나타내는 20x20 이미지 패치 세트를 학습하는 방법을 보여줍니다. 이 실습의 핵심은 온라인 학습을 사용하는 것입니다. 이미지를 하나씩 로드하고 처리하며 각 이미지에서 50 개의 임의 패치를 추출합니다. 10 개의 이미지에서 500 개의 패치를 축적한 후 온라인 KMeans 객체, MiniBatchKMeans 의 partial_fit 메서드를 실행합니다.

VM 팁

VM 시작이 완료되면 왼쪽 상단 모서리를 클릭하여 Notebook 탭으로 전환하여 연습을 위한 Jupyter Notebook에 접근할 수 있습니다.

때때로 Jupyter Notebook 이 로드되는 데 몇 초 정도 기다려야 할 수 있습니다. Jupyter Notebook 의 제한으로 인해 작업의 유효성 검사를 자동화할 수 없습니다.

학습 중 문제가 발생하면 Labby 에 문의하십시오. 세션 후 피드백을 제공하면 문제를 신속하게 해결해 드리겠습니다.

데이터 로드

먼저 scikit-learn 에서 Olivetti 얼굴 데이터셋을 로드합니다.

from sklearn import datasets

faces = datasets.fetch_olivetti_faces()

이미지 사전 학습

MiniBatchKMeans 를 사용하여 이미지 사전을 학습합니다. 클러스터 수를 81 로 설정하고, 랜덤 상태를 설정하며, verbose 모드를 활성화합니다. 패치를 저장할 버퍼를 생성하고 데이터셋의 각 이미지를 반복합니다. 각 이미지에서 50 개의 패치를 추출하고 데이터를 재구성합니다. 그런 다음 데이터를 버퍼에 추가하고 인덱스를 증가시킵니다. 인덱스가 10 의 배수이면 버퍼를 연결하고 데이터에 partial_fit 을 실행합니다. 인덱스가 100 의 배수이면 지금까지 적합된 패치 수를 나타내는 메시지를 출력합니다.

import time
import numpy as np
from sklearn.cluster import MiniBatchKMeans
from sklearn.feature_extraction.image import extract_patches_2d

print("Learning the dictionary... ")
rng = np.random.RandomState(0)
kmeans = MiniBatchKMeans(n_clusters=81, random_state=rng, verbose=True, n_init=3)
patch_size = (20, 20)

buffer = []
t0 = time.time()

## 온라인 학습 부분: 전체 데이터셋을 6 번 반복합니다.
index = 0
for _ in range(6):
    for img in faces.images:
        data = extract_patches_2d(img, patch_size, max_patches=50, random_state=rng)
        data = np.reshape(data, (len(data), -1))
        buffer.append(data)
        index += 1
        if index % 10 == 0:
            data = np.concatenate(buffer, axis=0)
            data -= np.mean(data, axis=0)
            data /= np.std(data, axis=0)
            kmeans.partial_fit(data)
            buffer = []
        if index % 100 == 0:
            print("Partial fit of %4i out of %i" % (index, 6 * len(faces.images)))

dt = time.time() - t0
print("done in %.2fs." % dt)

결과 플롯

마지막으로 얼굴 패치를 플롯하고 학습 시간을 표시합니다.

import matplotlib.pyplot as plt

plt.figure(figsize=(4.2, 4))
for i, patch in enumerate(kmeans.cluster_centers_):
    plt.subplot(9, 9, i + 1)
    plt.imshow(patch.reshape(patch_size), cmap=plt.cm.gray, interpolation="nearest")
    plt.xticks(())
    plt.yticks(())


plt.suptitle(
    "얼굴 패치\n학습 시간 %.1fs, %d개 패치" % (dt, 8 * len(faces.images)),
    fontsize=16,
)
plt.subplots_adjust(0.08, 0.02, 0.92, 0.85, 0.08, 0.23)

plt.show()

요약

이 실험에서는 대규모 얼굴 데이터셋을 처리하고 얼굴을 나타내는 이미지 패치 집합을 학습하는 방법을 온라인 학습을 통해 보여주었습니다. MiniBatchKMeans 를 사용하여 이미지 사전을 학습하고 결과를 플롯했습니다.