Desruído de Imagens com PCA de Kernel

Beginner

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

Introdução

Este laboratório demonstra como usar a PCA do Kernel para remover ruído de imagens. A ideia é aprender uma base PCA em imagens sem ruído e usá-la para reconstruir e remover o ruído das imagens com ruído. Usamos o conjunto de dados de dígitos USPS para este propósito.

Dicas da Máquina Virtual

Após o arranque da VM, clique no canto superior esquerdo para mudar para a aba Notebook para aceder ao Jupyter Notebook para praticar.

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

Se tiver problemas durante a aprendizagem, não hesite em contactar o Labby. Forneça feedback após a sessão e resolveremos prontamente o problema para si.

Carregar o conjunto de dados através do OpenML

Carregamos o conjunto de dados de dígitos USPS usando a função fetch_openml() do scikit-learn. Os dados são então normalizados usando MinMaxScaler().

import numpy as np
from sklearn.datasets import fetch_openml
from sklearn.preprocessing import MinMaxScaler
from sklearn.model_selection import train_test_split

X, y = fetch_openml(data_id=41082, as_frame=False, return_X_y=True, parser="pandas")
X = MinMaxScaler().fit_transform(X)

Criar Conjuntos de Treino e Teste

Dividimos o conjunto de dados em um conjunto de treino com 1000 amostras e um conjunto de teste com 100 amostras. Adicionamos ruído Gaussiano ao conjunto de teste e criamos duas cópias dos dados originais; uma com ruído e outra sem ruído.

X_train, X_test, y_train, y_test = train_test_split(
    X, y, stratify=y, random_state=0, train_size=1_000, test_size=100
)

rng = np.random.RandomState(0)
noise = rng.normal(scale=0.25, size=X_test.shape)
X_test_noisy = X_test + noise

noise = rng.normal(scale=0.25, size=X_train.shape)
X_train_noisy = X_train + noise

Plotar Imagens de Teste

Definimos uma função auxiliar para plotar as imagens de teste. Usamos esta função para plotar as imagens de teste não corrompidas e ruidosas.

import matplotlib.pyplot as plt

def plot_digits(X, title):
    fig, axs = plt.subplots(nrows=10, ncols=10, figsize=(8, 8))
    for img, ax in zip(X, axs.ravel()):
        ax.imshow(img.reshape((16, 16)), cmap="Greys")
        ax.axis("off")
    fig.suptitle(title, fontsize=24)

plot_digits(X_test, "Imagens de teste não corrompidas")
plot_digits(
    X_test_noisy, f"Imagens de teste ruidosas\nMSE: {np.mean((X_test - X_test_noisy) ** 2):.2f}"
)

Aprender a Base PCA

Aprendemos a base PCA usando PCA linear e PCA de kernel. O PCA de kernel utiliza o kernel de função de base radial (RBF) para aprender a base.

from sklearn.decomposition import PCA, KernelPCA

pca = PCA(n_components=32, random_state=42)
kernel_pca = KernelPCA(
    n_components=400,
    kernel="rbf",
    gamma=1e-3,
    fit_inverse_transform=True,
    alpha=5e-3,
    random_state=42,
)

pca.fit(X_train_noisy)
_ = kernel_pca.fit(X_train_noisy)

Reconstruir e Desruir Ruído em Imagens de Teste

Transformamos e reconstruímos o conjunto de teste ruidoso usando PCA e PCA de kernel. Em seguida, plotamos as imagens reconstruídas para comparar os resultados.

X_reconstructed_kernel_pca = kernel_pca.inverse_transform(
    kernel_pca.transform(X_test_noisy)
)
X_reconstructed_pca = pca.inverse_transform(pca.transform(X_test_noisy))

plot_digits(X_test, "Imagens de teste não corrompidas")
plot_digits(
    X_reconstructed_pca,
    f"Reconstrução PCA\nMSE: {np.mean((X_test - X_reconstructed_pca) ** 2):.2f}",
)
plot_digits(
    X_reconstructed_kernel_pca,
    (
        "Reconstrução PCA de Kernel\n"
        f"MSE: {np.mean((X_test - X_reconstructed_kernel_pca) ** 2):.2f}"
    ),
)

Resumo

Neste laboratório, aprendemos a utilizar o PCA de Kernel para remover ruído de imagens. Utilizamos o conjunto de dados de dígitos USPS para demonstrar o processo. Aprendemos uma base PCA em imagens sem ruído e a utilizamos para reconstruir e remover o ruído das imagens ruidosas. Comparámos os resultados do PCA linear e do PCA de kernel, e verificámos que o PCA de kernel é mais eficiente na remoção de ruído de fundo e na produção de imagens mais suaves. No entanto, precisamos de ter cuidado na seleção dos valores apropriados para n_components, gamma e alpha.