소개
이 실습에서는 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 를 사용하여 이미지 사전을 학습하고 결과를 플롯했습니다.