본문 바로가기
AI/Contents

꽃 이미지로 배우는 CNN 모델 구현 및 평가

by AI미남홀란드 2024. 3. 15.
728x90

딥러닝 기술이 급속도로 발전하면서, 이미지 분류는 다양한 분야에서 중요한 역할을 수행하게 되었습니다. 오늘은 TensorFlow를 사용하여 꽃 이미지를 분류하는 간단한 컨볼루션 신경망(CNN) 모델을 구현하고 평가해 보겠습니다.

 

데이터셋 준비하기

프로젝트를 시작하기 전, 먼저 TensorFlow의 데이터셋 라이브러리에서 제공하는 꽃 이미지 데이터셋을 다운로드합니다. 이 데이터셋은 다섯 가지 종류의 꽃 이미지(데이지, 덴델리온, 장미, 해바라기, 튤립)로 구성되어 있으며, 총 3,700장의 사진을 포함하고 있습니다.

 

모델 구성하기

이미지 분류를 위한 CNN 모델을 구성합니다. 모델은 여러 개의 컨볼루션 레이어와 풀링 레이어를 포함하며, 마지막에는 완전 연결 레이어를 통해 분류를 수행합니다.

 

모델 학습 및 평가

모델을 컴파일하고, 준비된 데이터셋을 사용하여 모델을 학습시킵니다. 학습 과정에서는 정확도와 손실을 모니터링하여 모델의 성능을 평가합니다.

 

성능 시각화

학습 과정에서의 정확도와 손실을 시각화하여, 모델의 학습 상태와 성능을 확인할 있습니다. 이를 통해 모델의 학습이 적절히 이루어지고 있는지, 과적합이 발생하고 있는지 등을 판단할 있습니다.

 

# 필요한 라이브러리를 불러옵니다.
import os
import numpy as np
import tensorflow as tf
from glob import glob
from PIL import Image
import matplotlib.pyplot as plt

# 데이터셋 준비
import pathlib
dataset_url = "https://storage.googleapis.com/download.tensorflow.org/example_images/flower_photos.tgz"
data_dir = tf.keras.utils.get_file('flower_photos', origin=dataset_url, untar=True)
data_dir = pathlib.Path(data_dir)

# 이미지 데이터셋 로드 및 전처리
batch_size = 32
img_height = 180
img_width = 180

train_ds = tf.keras.utils.image_dataset_from_directory(
  data_dir,
  validation_split=0.2,
  subset="training",
  seed=123,
  image_size=(img_height, img_width),
  batch_size=batch_size)

val_ds = tf.keras.utils.image_dataset_from_directory(
  data_dir,
  validation_split=0.2,
  subset="validation",
  seed=123,
  image_size=(img_height, img_width),
  batch_size=batch_size)

# 모델 구성 (간단한 CNN 모델)
num_classes = 5

model = tf.keras.Sequential([
  tf.keras.layers.Rescaling(1./255),
  tf.keras.layers.Conv2D(32, 3, activation='relu'),
  tf.keras.layers.MaxPooling2D(),
  tf.keras.layers.Conv2D(32, 3, activation='relu'),
  tf.keras.layers.MaxPooling2D(),
  tf.keras.layers.Conv2D(32, 3, activation='relu'),
  tf.keras.layers.MaxPooling2D(),
  tf.keras.layers.Flatten(),
  tf.keras.layers.Dense(128, activation='relu'),
  tf.keras.layers.Dense(num_classes)
])

# 모델 컴파일
model.compile(optimizer='adam',
              loss=tf.losses.SparseCategoricalCrossentropy(from_logits=True),
              metrics=['accuracy'])

# 모델 학습
epochs=10
history = model.fit(
  train_ds,
  validation_data=val_ds,
  epochs=epochs
)

# 모델 성능 시각화
acc = history.history['accuracy']
val_acc = history.history['val_accuracy']

loss = history.history['loss']
val_loss = history.history['val_loss']

plt.figure(figsize=(8, 8))
plt.subplot(2, 1, 1)
plt.plot(acc, label='Training Accuracy')
plt.plot(val_acc, label='Validation Accuracy')
plt.legend(loc='lower right')
plt.title('Training and Validation Accuracy')

plt.subplot(2, 1, 2)
plt.plot(loss, label='Training Loss')
plt.plot(val_loss, label='Validation Loss')
plt.legend(loc='upper right')
plt.title('Training and Validation Loss')
plt.show()

 

이 스크립트는 다음 단계로 구성됩니다:

  • 필요한 라이브러리를 불러옵니다.
  • 데이터셋을 다운로드하고, 경로를 설정합니다.
  • image_dataset_from_directory 함수를 사용해 훈련 및 검증 데이터셋을 로드합니다. 이때, 데이터셋은 자동으로 분할됩니다.
  • 간단한 컨볼루션 신경망(CNN) 모델을 구성하고 컴파일합니다. 모델은 이미지를 분류하기 위해 몇 개의 컨볼루션 레이어와 풀링 레이어, 완전 연결 레이어를 포함합니다.
  • 모델을 훈련시키고, 훈련 및 검증 세트에 대한 정확도와 손실을 시각화합니다.

이러한 과정을 통해, CNN 사용한 이미지 분류의 기본적인 접근 방법을 실습해볼 있습니다.

728x90

'AI > Contents' 카테고리의 다른 글

텍스트처리로 문장에 감성분석  (2) 2024.03.15
W5X00-EVB-Pico with SSL/TLS  (3) 2024.03.08
Attention Mechanism 이란? - (1)  (4) 2024.03.04
Chat With RTX 사용방법과 후기  (4) 2024.02.20
Stream을 아시나요?  (4) 2024.02.15