본문 바로가기
인공지능/Deep Learning

[Deep Learning] CNN 개와 고양이 사진을 분류하는 딥러닝 해보기

by coding_su 2023. 1. 2.

📝딥러닝 CNN으로 개와 고양이 사진을 분류하는 딥러닝 해보기

이미지는 캐글 "Dogs vs. Cats" dataset 에서 2,000개만 가져왔다

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

 

가져온 파일 압축을 풀고

import zipfile

file = zipfile.ZipFile('/tmp/cats_and_dogs_filtered.zip')
file.extractall('/tmp')

 

학습용 개 사진이 저장된 디렉토리안에 있는 파일명을 확인

import os

# train_dir 경로에 dogs 라는 폴더
os.listdir(train_dir + '/dogs')

# 이미지 각각 몇개씩인지 확인
os.listdir(train_dir)
len(os.listdir(train_dir + '/dogs'))
len(os.listdir(train_dir + '/cats'))

 

이미지 파일 학습 데이터로 만들기

from keras.preprocessing.image import ImageDataGenerator

train_datagen = ImageDataGenerator(rescale= 1/255.0)
test_datagen = ImageDataGenerator(rescale= 1/255.0)

train_generator = train_datagen.flow_from_directory(train_dir, target_size= (150, 150), class_mode= 'binary', batch_size= 20)
test_generator = test_datagen.flow_from_directory(test_dir, target_size= (150, 150), class_mode= 'binary', batch_size= 20)

 

이미지의 사이즈를 150x150, 칼라(rgb) 로 처리해서 모델링

import tensorflow as tf
from keras.models import Sequential
from keras.layers import Conv2D, MaxPool2D, Flatten, Dense

def build_model() :
  model = Sequential()
  model.add( Conv2D(16, (3, 3), activation= 'relu', input_shape= (150, 150, 3) ) )
  model.add( MaxPool2D( (2, 2), 2 ) )
  model.add( Conv2D(32, (3, 3), activation= 'relu' ) )
  model.add( MaxPool2D( (2, 2), 2 ) )
  model.add( Conv2D(64, (3, 3), activation= 'relu' ) )
  model.add( MaxPool2D( (2, 2), 2 ) )

  model.add( Flatten() )
  model.add( Dense( 512, 'relu' ) )
  model.add( Dense( 1, 'sigmoid' ) )

  model.compile( 'rmsprop', 'binary_crossentropy', metrics= ['accuracy'] )
  return model

 

학습 후 테스트

epoch_history = model.fit(train_generator, epochs= 15, validation_data= (test_generator), steps_per_epoch= 100)

model.evaluate(test_generator)

# 실제 이미지 파일을 넣어서 예측하는 코드
import numpy as np
from google.colab import files
from tensorflow.keras.preprocessing import image

uploaded = files.upload()

for fn in uploaded.keys() :
  path = '/content/' + fn
  img = image.load_img(path, target_size=(150,150))
  x = image.img_to_array(img) / 255.0
  print(x)
  print(x.shape)

  x = np.expand_dims(x, axis = 0)

  print(x.shape)

  images = np.vstack( [x] )
  classes = model.predict( images, batch_size = 10 )
  
  print(classes)

  if classes[0] > 0.5 :
    print(fn + " is a cats")
  else :
    print(fn + " is a dogs")

 

성능이 그렇게 좋은편이 아니라 이미 잘 만들어진 뉴널네트워크를 활용하여 성능을 올려보았다

→ Transfer Learning 활용 https://coding-jisu.tistory.com/169

댓글