티스토리 뷰
멀티캠퍼스 AI과정/06 Deep Learning
Deep Learning 07 - AWS에서 이미지 CNN 처리, cat dogs 예제
jhk828 2020. 10. 30. 13:43Optimizer 필기한거
201030
1. cats_dogs 이미지 분할
파일 구조
# 폴더구조 생성 및 고양이, 멍멍이 이미지 각 폴더로 복사
import os, shutil
original_dataset_dir = './data/cat_dog/train'
base_dir = 'data/cat_dog_full'
os.mkdir(base_dir)
train_dir = os.path.join(base_dir,'train')
os.mkdir(train_dir)
validation_dir = os.path.join(base_dir,'validation')
os.mkdir(validation_dir)
test_dir = os.path.join(base_dir,'test')
os.mkdir(test_dir)
train_cats_dir = os.path.join(train_dir,'cats')
os.mkdir(train_cats_dir)
train_dogs_dir = os.path.join(train_dir,'dogs')
os.mkdir(train_dogs_dir)
validation_cats_dir = os.path.join(validation_dir,'cats')
os.mkdir(validation_cats_dir)
validation_dogs_dir = os.path.join(validation_dir,'dogs')
os.mkdir(validation_dogs_dir)
test_cats_dir = os.path.join(test_dir,'cats')
os.mkdir(test_cats_dir)
test_dogs_dir = os.path.join(test_dir,'dogs')
os.mkdir(test_dogs_dir)
## file 복사 ##
## 고양이와 멍멍이가 각각 12,500개
## train : 7,000
## validation : 3,000
## test : 2,500
fnames = ['cat.{}.jpg'.format(i) for i in range(7000)]
for fname in fnames:
src = os.path.join(original_dataset_dir,fname)
dst = os.path.join(train_cats_dir, fname)
shutil.copyfile(src,dst)
fnames = ['cat.{}.jpg'.format(i) for i in range(7000,10000)]
for fname in fnames:
src = os.path.join(original_dataset_dir,fname)
dst = os.path.join(validation_cats_dir, fname)
shutil.copyfile(src,dst)
fnames = ['cat.{}.jpg'.format(i) for i in range(10000,12500)]
for fname in fnames:
src = os.path.join(original_dataset_dir,fname)
dst = os.path.join(test_cats_dir, fname)
shutil.copyfile(src,dst)
fnames = ['dog.{}.jpg'.format(i) for i in range(7000)]
for fname in fnames:
src = os.path.join(original_dataset_dir,fname)
dst = os.path.join(train_dogs_dir, fname)
shutil.copyfile(src,dst)
fnames = ['dog.{}.jpg'.format(i) for i in range(7000,10000)]
for fname in fnames:
src = os.path.join(original_dataset_dir,fname)
dst = os.path.join(validation_dogs_dir, fname)
shutil.copyfile(src,dst)
fnames = ['dog.{}.jpg'.format(i) for i in range(10000,12500)]
for fname in fnames:
src = os.path.join(original_dataset_dir,fname)
dst = os.path.join(test_dogs_dir, fname)
shutil.copyfile(src,dst)
2.이미지 파일을 읽는다.
- 지금까지는 CSV file이 제공되어서 사용했지만 이번에는 실제 이미지 파일들이다.
- Keras가 제공하는 utility module 사용 => ImageDataGenerator
- python generator
- 1) pillow로 이미지 파일을 읽는다.
- 2) JPG file을 RGB pixel 값으로 decoding -> ndarry 생성
- 3) Normalization 과정을 거친다. -> MinMaxScaling
- generator?
- 사용하는 이미지 파일을 numpy 파일로 바꾸어서 사용해야 하는데, Memory 용량 상 25000개의 파일을 한꺼번에 로드하여 사용할 수는 없다.
- 그래서 generator를 사용한다.
- ImageDataGenerator는 폴더로부터 data를 읽어서 numpy array로 만들어 준다.
%reset
import numpy as np
import pandas as pd
import tensorflow as tf
import matplotlib.pyplot as plt
from tensorflow.keras.preprocessing.image import ImageDataGenerator
train_dir = './data/cat_dog_full/train/'
validation_dir = './data/cat_dog_full/validation/'
# ImageDataGenerator 생성
# 이미지 데이터 값을 1/255로 scaling
train_datagen = ImageDataGenerator(rescale=1/255)
validation_data = ImageDataGenerator(rescale=1/255)
# datagen의 동작 방식을 명시 (flow_from_directory)
# train data를 가져오면 => x_data(독립변수, 픽셀값), t_data (종속변수, label)
train_generator = train_datagen.flow_from_directory(
train_dir, # target directory : 데이터를 어디서 가져올 것인지
classes=['cats', 'dogs'], # label 적용을 어떻게 할 것인지
# cats : 0, dogs : 1
# classes 명시 하지 않을 경우 폴더명 순서대로 label 잡힘
target_size=(150, 150), # 이미지 size scaling (크기를 150x150으로 변경해서)
batch_size=20, # 한번에 20개의 이미지를 가져온다.
# label에 상관 없이 가져온다.
class_mode='binary' # 이진분류 => binary
# MINST같은 다중분류 => categorical (기본값)
)
# generator로 부터 출력된 데이터의 shape 확인
for x_data, t_data in train_generator:
print('x_data의 shape : {}'.format(x_data.shape)) # (20, 150, 150, 3)
# 이미지 20장, pixel 150 * 150, 컬러 이미지는 channel 3
# CNN에 입력되는 형태
print('t_data의 shape: {}'.format(t_data.shape)) # (20, )
# generator는 break 설정하지 않으면 다시 처음으로 돌아가서 읽는다.
break;
## 이미지 확인
fig = plt.figure(figsize=(10,10))
axs = [] # subplot을 저장하는 리스트
for i in range(20):
axs.append(fig.add_subplot(4,5,i+1))
for x_data, t_data in train_generator:
# x_data shape : (20,150,150,3)
for idx, img_data in enumerate(x_data): # idx => 0~19 img_data -> 150,150,3
axs[idx].imshow(img_data)
print(t_data)
break;
fig.tight_layout()
plt.show()
Output:
Once deleted, variables cannot be recovered. Proceed (y/[n])? y
Found 14000 images belonging to 2 classes.
x_data의 shape : (20, 150, 150, 3)
t_data의 shape: (20,)
[1. 1. 0. 1. 0. 0. 1. 1. 0. 1. 0. 1. 1. 0. 1. 0. 0. 1. 0. 0.]
'멀티캠퍼스 AI과정 > 06 Deep Learning' 카테고리의 다른 글
Deep Learning 08 - ImageDataGeneration / Image Augmentation (증식) / Transfer Learning (전이학습) (0) | 2020.11.05 |
---|---|
Deep Learning 07 - AWS에서 이미지 CNN 처리, cat/ dog 예제 2 (0) | 2020.11.02 |
Deep Learning 07 - AWS, CNN으로 MNIST 처리 (Tensorflow 2.x version) (0) | 2020.10.30 |
Deep Learning 06 - Colab에서 CNN으로 MNIST 처리 (Tensorflow 1.x version) (0) | 2020.10.26 |
Deep Learning 06 - CNN, pooling (0) | 2020.10.26 |
댓글