본문 바로가기

카테고리 없음

KNN(K-Nearest Neighbors) 활용한 이미지 분류

이미지 분류를 KNN(K-Nearest Neighbors) 알고리즘을 사용하여 구현할 수 있습니다. KNN은 레이블이 있는 데이터를 기반으로 새로운 데이터 포인트의 범주를 예측하는 비지도 학습 알고리즘으로, 이미지 분류에도 사용할 수 있습니다. 하지만 KNN은 이미지와 같이 고차원 데이터를 다룰 때 성능이 떨어질 수 있으며, 비교적 간단한 특징 벡터를 추출한 후 사용해야 효율적입니다.

KNN을 사용한 이미지 분류 구현 방법

  1. 데이터 준비 및 전처리

    • 이미지 데이터를 수집하고, 각 이미지를 벡터화합니다.
    • 이미지 크기를 조정하고, 그레이스케일 또는 RGB 픽셀 값을 특징 벡터로 변환합니다.
  2. KNN 알고리즘을 사용한 분류 Python의 scikit-learn 라이브러리를 활용하여 KNN을 쉽게 구현할 수 있습니다.

1. 데이터 준비

  • CIFAR-10, MNIST 등의 이미지 데이터셋을 사용하여 예시를 보여줄 수 있습니다.
  • 예를 들어, MNIST 데이터셋을 사용할 경우, 이미지는 28x28 크기의 손글씨 숫자 이미지입니다.
from sklearn.datasets import fetch_openml
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier
from sklearn.metrics import accuracy_score
import numpy as np

# MNIST 데이터셋 로드
mnist = fetch_openml('mnist_784')

# 특징 벡터와 레이블 준비
X = mnist.data
y = mnist.target

# 데이터를 훈련 및 테스트 세트로 분리 (80% 훈련, 20% 테스트)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

2. KNN 알고리즘 적용

scikit-learn에서 제공하는 KNeighborsClassifier를 사용해 KNN 모델을 생성하고 훈련시킵니다. 여기서 n_neighbors는 K값을 지정합니다.

# KNN 모델 정의 (K=3)
knn = KNeighborsClassifier(n_neighbors=3)

# 모델 훈련
knn.fit(X_train, y_train)

# 테스트 데이터로 예측
y_pred = knn.predict(X_test)

# 정확도 출력
accuracy = accuracy_score(y_test, y_pred)
print(f"KNN Test Accuracy: {accuracy:.4f}")

3. KNN의 특징 및 문제점

KNN은 계산 비용이 많이 들고, 이미지처럼 고차원 데이터에 적합하지 않을 수 있습니다. 따라서 성능을 향상시키기 위해 다음과 같은 방법을 고려할 수 있습니다:

  • 차원 축소: PCA(Principal Component Analysis) 또는 SVD(Singular Value Decomposition)를 사용해 차원을 줄이는 방법.
  • 데이터 정규화: 이미지 데이터를 정규화하여 픽셀 간의 차이를 줄임.

4. 차원 축소를 통한 KNN 성능 향상

고차원 데이터를 처리할 때 차원 축소 기법을 사용하여 KNN 성능을 향상시킬 수 있습니다. 여기서는 PCA를 사용해 차원을 축소한 후 KNN을 적용하는 예시를 보여드립니다.

from sklearn.decomposition import PCA

# PCA로 차원 축소 (예: 50개의 주요 성분만 사용)
pca = PCA(n_components=50)
X_train_pca = pca.fit_transform(X_train)
X_test_pca = pca.transform(X_test)

# KNN 모델을 차원 축소된 데이터에 적용
knn_pca = KNeighborsClassifier(n_neighbors=3)
knn_pca.fit(X_train_pca, y_train)

# 예측 및 정확도 계산
y_pred_pca = knn_pca.predict(X_test_pca)
accuracy_pca = accuracy_score(y_test, y_pred_pca)
print(f"KNN with PCA Test Accuracy: {accuracy_pca:.4f}")

5. 결과 해석

KNN 알고리즘은 비교적 간단하지만 이미지와 같은 고차원 데이터에서는 성능이 떨어질 수 있습니다. 차원 축소 기법을 적용하거나, 이미지의 주요 특징을 추출한 후 KNN을 적용하면 성능을 높일 수 있습니다.

KNN을 사용한 이미지 분류 요약:

  • KNN 모델 생성: 이미지 데이터를 벡터화한 후, KNeighborsClassifier를 사용하여 모델을 학습.
  • 차원 축소: 이미지 데이터를 고차원에서 다루는 것이 비효율적일 수 있으므로, PCA 등을 사용해 차원 축소 후 적용 가능.
  • 성능: KNN은 단순하지만 계산 비용이 높고 고차원 데이터에 적합하지 않을 수 있으므로, 데이터 정규화 및 차원 축소가 필요할 수 있음.

이 방법으로 손쉽게 이미지를 분류할 수 있으며, 성능을 향상시키기 위해 여러 기법을 추가로 적용할 수 있습니다. 추가적으로 궁금한 점이 있으면 말씀해 주세요!