커널 PCA 를 이용한 이미지 잡음 제거

Beginner

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

소개

이 실험은 커널 PCA 를 사용하여 이미지를 잡음 제거하는 방법을 보여줍니다. 잡음이 없는 이미지에서 PCA 기저를 학습하고 이를 사용하여 잡음이 있는 이미지를 재구성하고 잡음을 제거하는 것이 아이디어입니다. 이를 위해 USPS 숫자 데이터셋을 사용합니다.

VM 팁

VM 시작이 완료되면 왼쪽 상단 모서리를 클릭하여 Notebook 탭으로 전환하여 연습을 위한 Jupyter Notebook에 접근합니다.

때때로 Jupyter Notebook 이 로드되는 데 몇 초 정도 기다려야 할 수 있습니다. Jupyter Notebook 의 제한으로 인해 작업의 유효성 검사는 자동화될 수 없습니다.

학습 중 문제가 발생하면 Labby 에 문의하십시오. 세션 후 피드백을 제공하면 문제를 신속하게 해결해 드리겠습니다.

OpenML 을 통해 데이터셋 로드

scikit-learn 의 fetch_openml() 함수를 사용하여 USPS 숫자 데이터셋을 로드합니다. 그런 다음 데이터를 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)

학습 및 테스트 데이터셋 생성

데이터셋을 1000 개의 샘플을 가진 학습 데이터셋과 100 개의 샘플을 가진 테스트 데이터셋으로 분할합니다. 테스트 데이터셋에 가우시안 잡음을 추가하고 원본 데이터의 두 개 복사본을 생성합니다. 하나는 잡음이 있고 하나는 잡음이 없는 데이터입니다.

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

테스트 이미지 플롯

테스트 이미지를 플롯하는 도우미 함수를 정의합니다. 이 함수를 사용하여 손상되지 않은 테스트 이미지와 잡음이 있는 테스트 이미지를 플롯합니다.

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, "Uncorrupted test images")
plot_digits(
    X_test_noisy, f"Noisy test images\nMSE: {np.mean((X_test - X_test_noisy) ** 2):.2f}"
)

PCA 기저 학습

선형 PCA 와 커널 PCA 를 모두 사용하여 PCA 기저를 학습합니다. 커널 PCA 는 방사 기저 함수 (RBF) 커널을 사용하여 기저를 학습합니다.

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)

테스트 이미지 재구성 및 잡음 제거

PCA 와 커널 PCA 를 모두 사용하여 잡음이 있는 테스트 데이터 세트를 변환하고 재구성합니다. 그런 다음 재구성된 이미지를 플롯하여 결과를 비교합니다.

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, "Uncorrupted test images")
plot_digits(
    X_reconstructed_pca,
    f"PCA reconstruction\nMSE: {np.mean((X_test - X_reconstructed_pca) ** 2):.2f}",
)
plot_digits(
    X_reconstructed_kernel_pca,
    (
        "Kernel PCA reconstruction\n"
        f"MSE: {np.mean((X_test - X_reconstructed_kernel_pca) ** 2):.2f}"
    ),
)

요약

이 실험에서는 이미지의 잡음을 제거하기 위해 커널 PCA 를 사용하는 방법을 배웠습니다. USPS 숫자 데이터 세트를 사용하여 이 과정을 보여주었습니다. 잡음이 없는 이미지에서 PCA 기저를 학습하고, 이를 사용하여 잡음이 있는 이미지를 재구성하고 잡음을 제거했습니다. 선형 PCA 와 커널 PCA 의 결과를 비교한 결과, 커널 PCA 가 배경 잡음을 제거하고 더 매끄러운 이미지를 제공하는 데 더 효율적인 것으로 나타났습니다. 그러나 n_components, gamma, alpha 값을 적절하게 선택하는 데 주의해야 합니다.