티스토리 뷰

반응형

이번 글은 cnn 딥러닝 기법을 이용하여 다양한 꽃을 분류하는 과정을 설명한다.

제일 먼저 해야할 작업은 다양한 꽃의 사진을 수집하고 분류하여 폴더에 저장한다. 이는 구글에서 이미지를 수집하고 꽃의 종류별 폴더를 생성하고 저장한다.
분류하고자 꽃의 종류는 4종으로 한다. 장미, 튜립, 해바라기, 코스모스가 4종에 해당한다. 

이를 위해서 구글에서 이미지를 검색하여 다운받는다.

 

4종에 대해서 다음 그림처럼 폴더별로 저장한다.

 

이제 폴더별 저장된 수집된 이미지를 image generator 함수를 이용해서 cnn에서 이용할 수 있는 형태로 입력데이터를 다음 구문을 입력하여 생성한다.

반응형
base_dir="C:/python_work/data/flower/"

IMAGE_SIZE=224
BATCH_SIZE=64

#pre=processing
train_datagen=tf.keras.preprocessing.image.ImageDataGenerator(
    rescale=1./255,
    shear_range=0.2,
    zoom_range=0.2,
    horizontal_flip=True,
    validation_split=0.1
    )

test_datagen=tf.keras.preprocessing.image.ImageDataGenerator(
     rescale=1./255,
     validation_split=0.1
)

train_datagen=train_datagen.flow_from_directory(
    base_dir,
    target_size=(IMAGE_SIZE,IMAGE_SIZE),
    batch_size=BATCH_SIZE,
    subset='training'
)

test_datagen=test_datagen.flow_from_directory(
    base_dir,
    target_size=(IMAGE_SIZE,IMAGE_SIZE),
    batch_size=BATCH_SIZE,
    subset='validation'
)

입력데이터가 마련되었다면 꽃 종류를 분류예측하기 위한 딥러닝 패키지를 불러온다.

 

from PIL import Image
import os

import tensorflow as tf
import numpy as np

import matplotlib.pyplot as plt

%matplotlib inline


5종의 꽃을 분류하기 위해 다음과 같이 cnn 기본모델을 개발한다.

 

cnn=tf.keras.Sequential()
cnn.add(tf.keras.layers.Conv2D(filters=64,padding='same',strides=2,kernel_size=3,activation='relu',input_shape=(224,224,3)))
cnn.add(tf.keras.layers.MaxPool2D(pool_size=2,strides=2))

cnn.add(tf.keras.layers.Conv2D(filters=32,padding='same',strides=2,kernel_size=3,activation='relu'))
cnn.add(tf.keras.layers.MaxPool2D(pool_size=2,strides=2))

cnn.add(tf.keras.layers.Conv2D(filters=32,padding='same',strides=2,kernel_size=3,activation='relu'))
cnn.add(tf.keras.layers.MaxPool2D(pool_size=2))

cnn.add(tf.keras.layers.Flatten())
cnn.add(tf.keras.layers.Dense(4,activation='softmax'))

개발된 모델의 최적화를 구현한다. 손실함수는 categorical_crossentropy 함수를 이용하고 성능 평가척도는 accuracy 척도를 이용하며 최적화 방식은 Adam()함수를 이용한다.

cnn.compile(optimizer=tf.keras.optimizers.Adam(),loss='categorical_crossentropy',metrics=['accuracy'])

최적화하기 위한 옵션이 선택이 모델을 학습하고 평가한다.

 

history = cnn.fit(train_datagen,epochs=20,validation_data=test_datagen)

 

모델 성능 평가를 그래프로 표현한다. 이를 평가된 내용이 무엇인지 확인한다.

history.history.keys()

# dict_keys(['loss', 'accuracy', 'val_loss', 'val_accuracy'])

두가지 내용이 출력된다. loss와 accuracy이다.

손실값과 정확도를 이용해서 그래프를 그린다. 손실값은 학습자료를 이용한 손실값과 검증자료를 이용한 손실값이 있고 정확도도 마찬가지이다.

 

손실값 분포그래프 그리기

 

fig, [ax1, ax2] = plt.subplots(1,2, figsize=(20,10))
fig.suptitle('cnn model performacne')

ax1.set_title("loss change")
ax1.plot(history.history["loss"])
ax1.plot(history.history["val_loss"])

ax2.set_title("accuracy change")
ax2.plot(history.history["accuracy"])
ax2.plot(history.history["val_accuracy"])

plt.show()

그래프 결과로서 파란색은 학습데이터, 주황색은 검증데이터를 이용한 결과이다.

반응형
댓글