Plotar Patches de Rostos no Dicionário

Beginner

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

Introdução

Este laboratório demonstra como usar a API scikit-learn para processar um grande conjunto de dados de rostos e aprender um conjunto de patches de imagem de 20 x 20 que representam rostos. O aspecto chave deste laboratório é o uso de aprendizado online, onde carregamos e processamos imagens uma de cada vez e extraímos 50 patches aleatórios de cada imagem. Acumulamos 500 patches (de 10 imagens) e, em seguida, executamos o objeto KMeans online, o método partial_fit de MiniBatchKMeans.

Dicas da Máquina Virtual

Após o término da inicialização da máquina virtual, clique no canto superior esquerdo para mudar para a aba Notebook para acessar o Jupyter Notebook para praticar.

Às vezes, pode ser necessário aguardar alguns segundos para que o Jupyter Notebook termine de carregar. A validação das operações não pode ser automatizada devido a limitações no Jupyter Notebook.

Se você enfrentar problemas durante o aprendizado, sinta-se à vontade para perguntar ao Labby. Forneça feedback após a sessão e resolveremos o problema rapidamente para você.

Carregar os Dados

Primeiro, carregamos o conjunto de dados de rostos Olivetti do scikit-learn.

from sklearn import datasets

faces = datasets.fetch_olivetti_faces()

Aprender o Dicionário de Imagens

Usamos MiniBatchKMeans para aprender o dicionário de imagens. Definimos o número de clusters para 81, definimos um estado aleatório e ativamos o modo verbose. Em seguida, criamos um buffer para armazenar patches e iteramos sobre cada imagem no conjunto de dados. Extraímos 50 patches de cada imagem e redimensionamos os dados. Em seguida, anexamos os dados ao buffer e incrementamos o índice. Se o índice for um múltiplo de 10, concatenamos o buffer e executamos partial_fit nos dados. Se o índice for um múltiplo de 100, imprimimos uma mensagem indicando o número de patches que foram ajustados até agora.

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

print("Aprendendo o dicionário... ")
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()

## A parte de aprendizado online: ciclo sobre todo o conjunto de dados 6 vezes
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("Ajuste parcial de %4i de %i" % (index, 6 * len(faces.images)))

dt = time.time() - t0
print("Concluído em %.2fs." % dt)

Plotar os Resultados

Finalmente, plotamos os patches dos rostos e exibimos o tempo de treinamento.

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 de rostos\nTempo de treinamento %.1fs em %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()

Resumo

Neste laboratório, demonstramos como usar o aprendizado online para processar um grande conjunto de dados de rostos e aprender um conjunto de patches de imagens que representam rostos. Usamos MiniBatchKMeans para aprender o dicionário de imagens e plotamos os resultados.