Введение
В этом практическом занятии показано, как использовать API scikit-learn для обработки большого набора изображений лиц и обучения набора изображений патчей размером 20x20, представляющих лица. Главной особенностью этого практического занятия является использование онлайн-обучения, при котором мы загружаем и обрабатываем изображения по одному и извлекаем 50 случайных патчей из каждого изображения. Затем мы накапливаем 500 патчей (из 10 изображений) и запускаем метод partial_fit объекта online KMeans, MiniBatchKMeans.
Советы по работе с ВМ
После запуска ВМ кликните в левом верхнем углу, чтобы переключиться на вкладку Notebook и приступить к практике в Jupyter Notebook.
Иногда может потребоваться подождать несколько секунд, пока Jupyter Notebook полностью загрузится. Валидация операций не может быть автоматизирована из-за ограничений Jupyter Notebook.
Если вы сталкиваетесь с проблемами во время обучения, не стесняйтесь обращаться к Labby. Оставьте отзыв после занятия, и мы оперативно решим проблему для вас.
Загрузка данных
Сначала мы загружаем датасет Olivetti faces из scikit-learn.
from sklearn import datasets
faces = datasets.fetch_olivetti_faces()
Обучение словаря изображений
Мы используем MiniBatchKMeans для обучения словаря изображений. Мы задаем количество кластеров равным 81, устанавливаем случайное состояние и включаем подробный режим. Затем мы создаем буфер для хранения патчей и перебираем каждое изображение в наборе данных. Мы извлекаем 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()
## The online learning part: cycle over the whole dataset 6 times
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(
"Patches of faces\nTrain time %.1fs on %d patches" % (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 для обучения словаря изображений и построили графики результатов.