본문 바로가기

AI

[CNN] 개 고양이 분류 모델 만들기

 

데이터셋 다운 받기 

!wget --no-check-certificate \
https://storage.googleapis.com/mledu-datasets/cats_and_dogs_filtered.zip \
-O /tmp/cats_and_dogs_filtered.zip

 

데이터셋 경로 지정하기 

import os

base_dir = 'C:/dev/ai/tmp/cats_and_dogs_filtered'

train_dir = os.path.join(base_dir, 'train')
validation_dir = os.path.join(base_dir, 'validation')

# 훈련에 사용되는 고양이/개 이미지 경로
train_cats_dir = os.path.join(train_dir, 'cats')
train_dogs_dir = os.path.join(train_dir, 'dogs')
print(train_cats_dir)
print(train_dogs_dir)

# 테스트에 사용되는 고양이/개 이미지 경로
validation_cats_dir = os.path.join(validation_dir, 'cats')
validation_dogs_dir = os.path.join(validation_dir, 'dogs')
print(validation_cats_dir)
print(validation_dogs_dir)

 

모델 구성하기 

#합성곱신경망(CNN)
import tensorflow as tf


model = tf.keras.models.Sequential([
  tf.keras.layers.Conv2D(16, (3,3), activation='relu', input_shape=(150, 150, 3)),
  tf.keras.layers.MaxPooling2D(2,2),
  tf.keras.layers.Conv2D(32, (3,3), activation='relu'),
  tf.keras.layers.MaxPooling2D(2,2),
  tf.keras.layers.Conv2D(64, (3,3), activation='relu'),
  tf.keras.layers.MaxPooling2D(2,2),
  tf.keras.layers.Flatten(),
  tf.keras.layers.Dense(512, activation='relu'),
  tf.keras.layers.Dense(1, activation='sigmoid')
])

model.summary() #신경망 구조를 확인할 수 있음

 

합성 곱 신경망(CNN, Convolutional neural network)이란? 

컴퓨터 과학의 일종으로 시각적 이미지를 분석하는데 쓰이는 인공 신경망의 한 종류수동으로 특징을 추출할 필요 없이 데이터로부터 직접 학습하는 딥러닝을 위한 신경망 아키텍처 

 

모델 컴파일하기

from tensorflow.keras.optimizers import RMSprop #RMSprop는 훈련 과정 중에 학습률을 적절하게 변화시킨다

model.compile(optimizer=RMSprop(lr=0.001),
            loss='binary_crossentropy',
            metrics = ['accuracy'])

 

이미지 전처리하기

from tensorflow.keras.preprocessing.image import ImageDataGenerator


train_datagen = ImageDataGenerator( rescale = 1.0/255. )
test_datagen  = ImageDataGenerator( rescale = 1.0/255. )

#훈련에 사용할 데이터
train_generator = train_datagen.flow_from_directory(train_dir, #이미지가 위치한 경로
                                                  batch_size=20, #이미지의 크기를 조정함
                                                  class_mode='binary',
                                                  target_size=(150, 150))

#테스트에 사용할 데이터
validation_generator =  test_datagen.flow_from_directory(validation_dir,
                                                       batch_size=20,
                                                       class_mode  = 'binary',
                                                       target_size = (150, 150))

 

모델 훈련하기 

history = model.fit(train_generator,
                    validation_data=validation_generator,
                    steps_per_epoch=100,  #한 훈련당 100개 이미지 보여줌
                    epochs=100, #백번 훈련
                    validation_steps=50, #한 훈련당 50번 테스트함
                    verbose=2)

 

모델 저장하기

model.save("model.h5")

 

저장된 모델 불러오기

from tensorflow.keras.models import load_model
model = load_model("model.h5")

 

정확도 및 손실 확인하기

import matplotlib.pyplot as plt

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

epochs = range(len(acc))

plt.plot(epochs, acc, 'bo', label='Training accuracy')
plt.plot(epochs, val_acc, 'b', label='Validation accuracy')
plt.title('Training and validation accuracy')
plt.legend()

plt.figure()

plt.plot(epochs, loss, 'go', label='Training Loss')
plt.plot(epochs, val_loss, 'g', label='Validation Loss')
plt.title('Training and validation loss')
plt.legend()

plt.show()

 

 

 

과대적합 

아무리 훈련해도 정확도가 70퍼센트정도로 유지되는 것 . 이 예제 따라할 때 과적합이발생했다. 

 

 

모델 테스트하기

 

from tensorflow.keras.preprocessing import image
img = image.load_img('./dog.jpg', target_size=(150, 150))     #인터넷에서 다운받은 개 이미지
#2차원 배열을 3차원으로 바꿔주기
#모델은 3차원 데이터만 분류가능함
x=image.img_to_array(img)
x=np.expand_dims(x, axis=0)
images = np.vstack([x])

classes = model.predict(images, batch_size=10)

if classes[0]>0:
    print("Image is a dog")
else:
    print("Image is a cat")

 

 

 

참고

https://codetorial.net/tensorflow/classifying_the_cats_and_dogs.html

 

12. 고양이와 개 이미지 분류하기 - Codetorial

12. 고양이와 개 이미지 분류하기 이전의 예제에서 다루었던 MNIST, Fashion MNIST 데이터셋은 이미지 패턴이 비교적 단순하며 흑백의 색상을 가지고, 이미지가 모두 같은 크기를 가지기 때문에 상대

codetorial.net