Построение графиков для патчей лиц из словаря

Machine LearningMachine LearningBeginner
Практиковаться сейчас

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

💡 Этот учебник переведен с английского с помощью ИИ. Чтобы просмотреть оригинал, вы можете перейти на английский оригинал

Введение

В этом практическом занятии показано, как использовать API scikit-learn для обработки большого набора изображений лиц и обучения набора изображений патчей размером 20x20, представляющих лица. Главной особенностью этого практического занятия является использование онлайн-обучения, при котором мы загружаем и обрабатываем изображения по одному и извлекаем 50 случайных патчей из каждого изображения. Затем мы накапливаем 500 патчей (из 10 изображений) и запускаем метод partial_fit объекта online KMeans, MiniBatchKMeans.

Советы по работе с ВМ

После запуска ВМ кликните в левом верхнем углу, чтобы переключиться на вкладку Notebook и приступить к практике в Jupyter Notebook.

Иногда может потребоваться подождать несколько секунд, пока Jupyter Notebook полностью загрузится. Валидация операций не может быть автоматизирована из-за ограничений Jupyter Notebook.

Если вы сталкиваетесь с проблемами во время обучения, не стесняйтесь обращаться к Labby. Оставьте отзыв после занятия, и мы оперативно решим проблему для вас.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL sklearn(("Sklearn")) -.-> sklearn/CoreModelsandAlgorithmsGroup(["Core Models and Algorithms"]) sklearn(("Sklearn")) -.-> sklearn/DataPreprocessingandFeatureEngineeringGroup(["Data Preprocessing and Feature Engineering"]) ml(("Machine Learning")) -.-> ml/FrameworkandSoftwareGroup(["Framework and Software"]) sklearn/CoreModelsandAlgorithmsGroup -.-> sklearn/cluster("Clustering") sklearn/DataPreprocessingandFeatureEngineeringGroup -.-> sklearn/feature_extraction("Feature Extraction") ml/FrameworkandSoftwareGroup -.-> ml/sklearn("scikit-learn") subgraph Lab Skills sklearn/cluster -.-> lab-49104{{"Построение графиков для патчей лиц из словаря"}} sklearn/feature_extraction -.-> lab-49104{{"Построение графиков для патчей лиц из словаря"}} ml/sklearn -.-> lab-49104{{"Построение графиков для патчей лиц из словаря"}} end

Загрузка данных

Сначала мы загружаем датасет 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 для обучения словаря изображений и построили графики результатов.