Python DeepLearning

CNN을 활용한 이미지 분류 모델 구현

PyExplorer 2025. 4. 17. 15:13
728x90

CNN을 활용한 이미지 분류 모델 구현

1. CNN(Convolutional Neural Network) 개요

합성곱 신경망(Convolutional Neural Network, CNN)은 이미지와 같은 2차원 데이터의 패턴을 효과적으로 학습할 수 있도록 설계된 신경망입니다. CNN은 일반적으로 다음과 같은 계층을 포함합니다:

  • 합성곱 층(Convolutional Layer): 이미지의 특징을 추출하는 계층
  • 풀링 층(Pooling Layer): 특징 맵의 차원을 줄이고 중요한 정보를 유지하는 계층
  • 완전 연결층(Fully Connected Layer): 추출된 특징을 바탕으로 최종 분류를 수행하는 계층

이번 포스팅에서는 CNN을 활용하여 이미지 분류 모델을 구축하는 방법을 단계별로 설명하겠습니다.


2. 데이터셋 준비 (CIFAR-10 활용)

CIFAR-10 데이터셋은 10개의 클래스로 구성된 60,000장의 컬러 이미지(32x32 픽셀)로 이루어져 있습니다. TensorFlowkeras.datasets 모듈을 이용하여 간단하게 가져올 수 있습니다.

import tensorflow as tf
from tensorflow.keras.datasets import cifar10
from tensorflow.keras.utils import to_categorical
import matplotlib.pyplot as plt

# 데이터 로드 및 전처리
(x_train, y_train), (x_test, y_test) = cifar10.load_data()

# 데이터 정규화 (0~1 범위로 조정)
x_train, x_test = x_train / 255.0, x_test / 255.0

# 레이블을 원-핫 인코딩으로 변환
y_train = to_categorical(y_train, 10)
y_test = to_categorical(y_test, 10)

# 데이터 시각화
def plot_sample_images(x, y):
    fig, axes = plt.subplots(1, 5, figsize=(10, 5))
    for i in range(5):
        axes[i].imshow(x[i])
        axes[i].set_title(f"Label: {y[i].argmax()}")
        axes[i].axis('off')
    plt.show()

plot_sample_images(x_train, y_train)

위 코드는 CIFAR-10 데이터를 로드한 후, 정규화하고 원-핫 인코딩을 적용하는 과정입니다. 또한, 일부 샘플 이미지를 출력하여 데이터의 구성을 확인할 수 있습니다.


3. CNN 모델 구현

CNN 모델을 구축하기 위해 tensorflow.kerasSequential API를 활용합니다.

from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Conv2D, MaxPooling2D, Flatten, Dense, Dropout

# CNN 모델 정의
model = Sequential([
    Conv2D(32, (3, 3), activation='relu', padding='same', input_shape=(32, 32, 3)),
    MaxPooling2D((2, 2)),
    Conv2D(64, (3, 3), activation='relu', padding='same'),
    MaxPooling2D((2, 2)),
    Conv2D(128, (3, 3), activation='relu', padding='same'),
    MaxPooling2D((2, 2)),
    Flatten(),
    Dense(128, activation='relu'),
    Dropout(0.5),
    Dense(10, activation='softmax')
])

# 모델 요약
model.summary()

모델 구조 설명

  1. Conv2D 층: 3x3 필터를 사용하여 특징을 추출하며, ReLU 활성화 함수를 사용합니다.
  2. MaxPooling2D 층: 2x2 풀링을 통해 차원을 줄이고 계산량을 감소시킵니다.
  3. Flatten 층: CNN 층에서 추출된 특징을 1D 벡터로 변환합니다.
  4. Dense 층: Fully Connected Layer로, 128개의 뉴런을 사용합니다.
  5. Dropout 층: 과적합을 방지하기 위해 일부 뉴런을 랜덤하게 제외합니다.
  6. Softmax 출력층: 10개의 클래스에 대한 확률을 출력합니다.

4. 모델 컴파일 및 학습

모델을 학습시키기 위해 손실 함수, 옵티마이저, 평가지표를 설정한 후 훈련을 수행합니다.

# 모델 컴파일
model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])

# 모델 학습
history = model.fit(x_train, y_train, epochs=20, batch_size=64, validation_data=(x_test, y_test))

하이퍼파라미터 설명

  • 옵티마이저(Optimizer): adam을 사용하여 가중치를 업데이트합니다.
  • 손실 함수(Loss Function): 다중 클래스 분류이므로 categorical_crossentropy를 사용합니다.
  • 평가지표(Metrics): 정확도(accuracy)를 사용하여 성능을 평가합니다.

5. 모델 평가 및 성능 분석

학습이 완료된 후 테스트 데이터에서 성능을 평가하고 학습 곡선을 시각화합니다.

# 모델 평가
test_loss, test_acc = model.evaluate(x_test, y_test)
print(f"테스트 데이터 정확도: {test_acc:.4f}")

학습 곡선 시각화

import matplotlib.pyplot as plt

plt.plot(history.history['accuracy'], label='Train Accuracy')
plt.plot(history.history['val_accuracy'], label='Validation Accuracy')
plt.xlabel('Epochs')
plt.ylabel('Accuracy')
plt.legend()
plt.title('CNN 모델 학습 곡선')
plt.show()

위 그래프를 통해 학습 과정에서 정확도가 어떻게 변화하는지 확인할 수 있습니다.


6. 모델 저장 및 활용

학습이 완료된 모델을 저장하여 나중에 다시 불러올 수 있습니다.

# 모델 저장
model.save('cnn_cifar10_model.h5')

# 저장된 모델 불러오기
from tensorflow.keras.models import load_model
saved_model = load_model('cnn_cifar10_model.h5')

이제 저장된 모델을 사용하여 새로운 이미지를 분류할 수 있습니다.

import numpy as np

def predict_image(img):
    img = img.reshape(1, 32, 32, 3) / 255.0  # 정규화
    prediction = saved_model.predict(img)
    return np.argmax(prediction)

7. 결론

이번 포스팅에서는 CNN을 활용하여 CIFAR-10 데이터셋을 분류하는 모델을 구현하였습니다. CNN의 핵심 개념을 살펴보고, TensorFlow/Keras를 이용한 모델 구성, 학습, 평가, 저장 및 예측 과정을 다루었습니다.

728x90