Python/Keras
[P]Keras 패키지를 이용하여 개와 고양이 이미지 분류하기 -1-
씩2
2022. 2. 21. 17:51
데이터셋 : Cats & Dogs dataset
데이터셋 설명 : 고양이와 강아지사진이 각 12500장씩 들어있는 데이터 셋이다.
사용된 패키지 :
import os
import shutil
from keras import layers
from keras import models
from keras import optimizers
from keras.preprocessing.image import ImageDataGenerator
import matplotlib.pyplot as plt
Keras패키지를 이용하여 개와 고양이의 이미지를 분류를 학습시키고 예측하는 것을 하기위해서는 우선 개와 고양이 사진이 저장되어있는 디렉토리를 지정해준다. 여기서 디렉토리를 지정해주는 이유는 트레이닝,테스트,검증셋의 디렉토리를 새로만들고 분류 해주기 위함이다.
os.getcwd()
os.chdir('/Users/Sik/Desktop/d_c_pic/Petimages')
original_dataset_dir_cats = '/Users/Sik/Desktop/d_c_pic/Petimages/Cat'
original_dataset_dir_dogs = '/Users/Sik/Desktop/d_c_pic/Petimages/Dog'
base_dir = '/Users/sik/Desktop'
os.makedirs(base_dir, exist_ok = True)
os.getcwd() <– 현재 디렉토리를 확인할수있다.
os.chdir() <– 작업디렉토리를 변경해주는 함수이다.
os.makedirs() <– 폴더를 만들어주는 함수이다.
# 훈련, 검증, 테스트 분할을 위한 디렉터리
train_dir = os.path.join(base_dir, 'train')
os.makedirs(train_dir,exist_ok = True)
validation_dir = os.path.join(base_dir, 'validation')
os.makedirs(validation_dir, exist_ok = True)
test_dir = os.path.join(base_dir, 'test')
os.makedirs(test_dir, exist_ok = True)
# 훈련용 고양이 사진 디렉터리
train_cats_dir = os.path.join(train_dir, 'cats')
os.makedirs(train_cats_dir, exist_ok = True)
# 훈련용 강아지 사진 디렉터리
train_dogs_dir = os.path.join(train_dir, 'dogs')
os.makedirs(train_dogs_dir, exist_ok= True)
# 검증용 고양이 사진 디렉터리
validation_cats_dir = os.path.join(validation_dir, 'cats')
os.makedirs(validation_cats_dir, exist_ok = True)
# 검증용 강아지 사진 디렉터리
validation_dogs_dir = os.path.join(validation_dir, 'dogs')
os.makedirs(validation_dogs_dir, exist_ok= True)
# 테스트용 고양이 사진 디렉터리
test_cats_dir = os.path.join(test_dir, 'cats')
os.makedirs(test_cats_dir,exist_ok = True)
# 테스트용 강아지 사진 디렉터리
test_dogs_dir = os.path.join(test_dir, 'dogs')
os.makedirs(test_dogs_dir, exist_ok = True)
(mac) 이과정에서 꽤나 많은 시간을 들인것같다. 에러가 발생하였는데 경로도 지정이 확실히되었는데도 오류가 났다.
오버스택플로우에도 나와같은 문제를 겪은 사람이 있어서 문제를 해결할수있었다. exits_ok = True옵션을 사용하니 에러가 발생하지않았다.
파일을 옮겨 저장할 디렉토리를 생성하였으면 이제 사진을 옮겨보도록 하자.
# 2000 ~ 3000번째의 고양이 이미지를 train_cats_dir 폴더에 복사하기.
fnames = ['{}.jpg'.format(i) for i in range(2000,3000)]
for fname in fnames:
src = os.path.join(original_dataset_dir_cats, fname)
dst = os.path.join(train_cats_dir, fname)
shutil.copyfile(src, dst)
# 3000 ~ 3500번째 고양이 이미지를 validation_cats_dir 폴더에 복사하기.
fnames = ['{}.jpg'.format(i) for i in range(3000, 3500)]
for fname in fnames:
src = os.path.join(original_dataset_dir_cats, fname)
dst = os.path.join(validation_cats_dir, fname)
shutil.copyfile(src, dst)
# 3500~ 4000번개 고양이 이미지를 test_cats_dir 폴더에 복사하기.
fnames = ['{}.jpg'.format(i) for i in range(3500, 4000)]
for fname in fnames:
src = os.path.join(original_dataset_dir_cats, fname)
dst = os.path.join(test_cats_dir, fname)
shutil.copyfile(src, dst)
# 4000~ 5000번째 강아지 이미지를 train_dogs_dir 폴더에 복사하기.
fnames = ['{}.jpg'.format(i) for i in range(4000,5000)]
for fname in fnames:
src = os.path.join(original_dataset_dir_dogs, fname)
dst = os.path.join(train_dogs_dir, fname)
shutil.copyfile(src, dst)
# 5000~ 5500번째 강아지 이미지를 validation_dogs_dir 폴더에 복사하기.
fnames = ['{}.jpg'.format(i) for i in range(5000, 5500)]
for fname in fnames:
src = os.path.join(original_dataset_dir_dogs, fname)
dst = os.path.join(validation_dogs_dir, fname)
shutil.copyfile(src, dst)
# 5500 ~ 6000번째 강아지 이미지를 test_dogs_dir 폴더에 복사하기.
fnames = ['{}.jpg'.format(i) for i in range(5500, 6000)]
for fname in fnames:
src = os.path.join(original_dataset_dir_dogs, fname)
dst = os.path.join(test_dogs_dir, fname)
shutil.copyfile(src, dst)
간단한 for 문과 shutil.copyfile()함수를 이용하여 사진을 옮겨줄수있다.
사진파일이 잘옮겨졌는지 확인을 위해 폴더안에 파일이 몇개 들어있는지 확인을 해보자
print('훈련용 고양이 이미지 전체 개수:', len(os.listdir(train_cats_dir)))
print('훈련용 강아지 이미지 전체 개수:', len(os.listdir(train_dogs_dir)))
print('검증용 고양이 이미지 전체 개수:', len(os.listdir(validation_cats_dir)))
print('검증용 강아지 이미지 전체 개수:', len(os.listdir(validation_dogs_dir)))
print('테스트용 고양이 이미지 전체 개수:', len(os.listdir(test_cats_dir)))
print('테스트용 강아지 이미지 전체 개수:', len(os.listdir(test_dogs_dir)))
os.listdir()을 이용하면 디렉토리안의 리스트를 볼수있다.
-결과-
훈련,검증,테스트용 강아지, 고양이 사진들이 모두 잘 옮겨진것을 확인할 수 있다.