📝딥러닝 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
'인공지능 > Deep Learning' 카테고리의 다른 글
[Deep Learning] 사진 분류하는 딥러닝 Transfer Learning으로 해보기 (MobileNetV2 활용) (0) | 2023.01.02 |
---|---|
[Deep Learning] 원본 파일을 train / test 파일로 분리하기 (0) | 2023.01.02 |
[Deep Learning] CNN TensorFlow 이미지 분류하는 딥러닝 해보기 (0) | 2022.12.30 |
[Deep Learning] 이미지 파일 학습 데이터로 만들기(+이미지 증강) ImageDataGenerator (0) | 2022.12.30 |
[Deep Learning] 파이썬으로 압축 파일 풀기 zipfile (0) | 2022.12.30 |
댓글