image generator

Soyoung Park·2022년 10월 4일
0

TIL deep learning

목록 보기
22/22

02_Basic_image_generator

데이터 증식하기.

from tensorflow.keras.preprocessing.image import load_img, img_to_array, ImageDataGenerator
import matplotlib.pyplot as plt
import numpy as np

horse = img_to_array(load_img('/content/blackbeauty.jfif')).astype(np.uint8)
plt.figure()
plt.imshow(horse)
plt.show()

print()

^ 이미지 불러오기



^ 이미지에 대한 정보 확인하기

from tensorflow.keras.preprocessing.image import load_img, img_to_array, ImageDataGenerator
import matplotlib.pyplot as plt
import numpy as np

# 기본 이지미 -> (164, 307, 3) -> 차트로 그리기
horse = img_to_array(load_img('/content/blackbeauty.jfif')).astype(np.uint8)
plt.figure()
plt.imshow(horse)
plt.show()

# 데이터 증식
train_datagen = ImageDataGenerator(horizontal_flip = True,
                                   vertical_flip = True,
                                   shear_range = 0.5,
                                   brightness_range = [0.5, 1.5],
                                   zoom_range = 0.2,
                                   width_shift_range = 0.1,
                                   height_shift_range = 0.1,
                                   rotation_range = 30,
                                   fill_mode = 'nearest'
                                  )
horse = horse.reshape((1,)+horse.shape) # (1, 164, 307, 3)
print(horse.shape)

^ 데이터 증식

from tensorflow.keras.preprocessing.image import load_img, img_to_array, ImageDataGenerator
import matplotlib.pyplot as plt
import numpy as np

# 기본 이지미 -> (164, 307, 3) -> 차트로 그리기
horse = img_to_array(load_img('/content/blackbeauty.jfif')).astype(np.uint8)
plt.figure()
plt.imshow(horse)
plt.show()

# 데이터 증식
train_datagen = ImageDataGenerator(horizontal_flip = True,
                                   vertical_flip = True,
                                   shear_range = 0.5,
                                   brightness_range = [0.5, 1.5],
                                   zoom_range = 0.2,
                                   width_shift_range = 0.1,
                                   height_shift_range = 0.1,
                                   rotation_range = 30,
                                   fill_mode = 'nearest'
                                  )
horse = horse.reshape((1,)+horse.shape) # (1, 164, 307, 3)
# print(horse.shape)
train_generator = train_datagen.flow(horse, batch_size=1)

plt.figure(figsize = (5, 5))
for i in range(9):
    data = next(train_generator)
    image = data[0]
    plt.subplot(3, 3, i+1)
    plt.xticks([])
    plt.yticks([])
    plt.imshow(np.array(image, dtype = np.uint8), cmap = 'gray')
plt.show()

^ 이미지 증식 최종 코드

03_CNN 신경망 모델을 사용하여 개와 고양이 이미지 분류하기.ipynb

런타임 GPU 로 설정하기.

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

^ Google api 통해 데이터 불러오기

# 압축풀기
import os
import zipfile

local_zip = '/tmp/cats_and_dogs_filtered.zip'
zip_ref = zipfile.ZipFile(local_zip, 'r')
zip_ref.extractall('/tmp')
zip_ref.close()

^ 폴더 나누기

^ 옆에 폴더 생성이 되었을 것임.


^ tmp 속 폴더 어떻게 나눠져있는지 볼 수 있다.

# 데이터 경로 설정
rootPath = '/tmp/cats_and_dogs_filtered'
train_dir = os.path.join(rootPath, 'train')

^ 데이터 경로 설정

# 데이터 경로 설정
rootPath = '/tmp/cats_and_dogs_filtered'

# 훈련셋, 검증셋 경로
train_dir = os.path.join(rootPath, 'train') # /tmp/cats_and_dogs_filtered/train
validation_dir = os.path.join(rootPath, 'validation')  # /tmp/cats_and_dogs_filtered/validation

# 훈련셋 중에 고양이 사진 경로
train_cats_dir = os.path.join(train_dir, 'cats')  # /tmp/cats_and_dogs_filtered/train/cats
# 훈련셋 중에 강아지 사진 경로
train_dogs_dir = os.path.join(train_dir, 'dogs')  # /tmp/cats_and_dogs_filtered/train/dogs

# 검증셋 중에 고양이 사진 경로
validation_cats_dir = os.path.join(validation_dir, 'cats')  # /tmp/cats_and_dogs_filtered/validation/cats
# 검증셋 중에 강아지 사진 경로
validation_dogs_dir = os.path.join(validation_dir, 'dogs') # /tmp/cats_and_dogs_filtered/validation/dogs

^ 데이터 경로 설정

train_cat_fnames = os.listdir(train_cats_dir)
train_cat_fnames.sort()
print(train_cat_fnames[:10])

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)))

^ 데이터 확인하기

데이터 증식 (Data Argumentation)

import os
from tensorflow.keras.preprocessing.image import ImageDataGenerator

# 데이터 경로 설정
rootPath = '/tmp/cats_and_dogs_filtered'

# 스케일링 + 데이터 증식 속성 설정
trainImageGenerator = ImageDataGenerator(rescale=1./255,
                                         horizontal_flip = True,
                                         vertical_flip = True,
                                         shear_range = 0.5,
                                         brightness_range = [0.5, 1.5],
                                         zoom_range = 0.2,
                                         width_shift_range = 0.1,
                                         height_shift_range = 0.1,
                                         rotation_range = 30,
                                         fill_mode = 'nearest')

# 스케일링 설정                                    
testImageGenerator = ImageDataGenerator(rescale=1./255)

trainGen = trainImageGenerator.flow_from_directory(
    os.path.join(rootPath, 'train'),
    target_size=(64,64),
    class_mode = 'binary'
)

testGen = testImageGenerator.flow_from_directory(
    os.path.join(rootPath, 'validation'),
    target_size=(64,64),
    class_mode = 'binary'
)

^ 데이터 증식

^ 잘 정리되었는지 확인

from tensorflow.keras.preprocessing.image import array_to_img
import matplotlib.pyplot as plt
import numpy as np

plt.figure(figsize=(5,5))

for i in range(9):
  data = next(trainGen)
  arr = data[0][0]
  plt.subplot(3,3,i+1)
  plt.xticks([]) # 눈금 지우기
  plt.yticks([]) # 눈금 지우기
  img = array_to_img(arr).resize((128, 128))
  plt.imshow(img)

plt.show()

^ 이미지 불러오기

^ 위의 코드에서 testGen 만 변경함.


from re import X
label_index = trainGen.class_indices

# {'cats':0, 'dogs':1}
x,y = trainGen.next()

# print(len(x))

for i in range(0,3):
  image = x[i]
  label = y[i].astype('int')
  plt.xticks([]) # 눈금 지우기
  plt.yticks([]) # 눈금 지우기
  print('사진: {}'.format([k for k, v in label_index.items() if v == label]))
  plt.imshow(image)
  plt.show()

^ 고양이 사진이나 강아지 사진들을 볼 수 있다.

from re import X
label_index = trainGen.class_indices

# {'cats':0, 'dogs':1}
x,y = trainGen.next()

# print(len(x))

for i in range(0,3):
  image = x[i]
  label = y[i].astype('int')
  plt.xticks([]) # 눈금 지우기
  plt.yticks([]) # 눈금 지우기
  print('사진: {}'.format([k for k, v in label_index.items() if v == label]))
  print('사진: {}'.format(label))
  plt.imshow(image)
  plt.show()

^ 강아지 1인 값을 dogs 로 보여줌.

from tensorflow.keras.models import Sequential
from tensorflow.keras import layers

# 3개의 컨블루션 신경망 사용
model = Sequential()
model.add(layers.InputLayer(input_shape=(64, 64, 3)))
model.add(layers.Conv2D(16, (3,3), (1,1), 'same', activation='relu')) #16
model.add(layers.MaxPooling2D((2,2)))
model.add(layers.Dropout(rate=0.3))

model.add(layers.Conv2D(32, (3,3), (1,1), 'same', activation='relu')) #32
model.add(layers.MaxPooling2D((2,2)))
model.add(layers.Dropout(rate=0.3))

model.add(layers.Conv2D(64, (3,3), (1,1), 'same', activation='relu')) #64
model.add(layers.MaxPooling2D((2,2)))
model.add(layers.Dropout(rate=0.3))

model.add(layers.Flatten())
model.add(layers.Dense(512, activation='relu'))
model.add(layers.Dense(256, activation='relu'))
model.add(layers.Dense(1, activation='sigmoid'))

^ 간단한 CNN 모델 구성

from tensorflow.keras.utils import plot_model

plot_model(model, 'model.png', show_shapes=True)

model.summary()

^ 모델 확인하기

model.compile(optimizer='adam',loss='binary_crossentropy', metrics=['acc'])

^ 모델 설정하기

history = model.fit_generator(trainGen, epochs= 32, validation_data=testGen)

^ 모델 학습하기

import matplotlib.pyplot as plt

his_dict = history.history
loss = his_dict['loss']
val_loss = his_dict['val_loss'] # 검증 데이터가 있는 경우 ‘val_’ 수식어가 붙습니다.

epochs = range(1, len(loss) + 1)
fig = plt.figure(figsize = (10, 5))

# 훈련 및 검증 손실 그리기
ax1 = fig.add_subplot(1, 2, 1)
ax1.plot(epochs, loss, color = 'blue', label = 'train_loss')
ax1.plot(epochs, val_loss, color = 'orange', label = 'val_loss')
ax1.set_title('train and val loss')
ax1.set_xlabel('epochs')
ax1.set_ylabel('loss')
ax1.legend()

acc = his_dict['acc']
val_acc = his_dict['val_acc']

# 훈련 및 검증 정확도 그리기
ax2 = fig.add_subplot(1, 2, 2)
ax2.plot(epochs, acc, color = 'blue', label = 'train_acc')
ax2.plot(epochs, val_acc, color = 'orange', label = 'val_acc')
ax2.set_title('train and val acc')
ax2.set_xlabel('epochs')
ax2.set_ylabel('loss')
ax2.legend()

plt.show()

^ 학습결과 그리기

^ 모델 평가하기

from tensorflow.keras.preprocessing.image import array_to_img
import numpy as np

label_index = ['고양이', '강아지'] # 고양이 0번, 강아지 1번

x,y = testGen.next()
for i in range(0,3):
  image = x[i]
  label = y[i].astype('int')

  y_prob = model.predict(image.reshape(1,64,64,3))
  y_prob_class = (model.predict(image.reshape(1,64,64,3)) > 0.5).astype('int')[0][0]
  print('정답: {}'.format(label_index[label]), 'label :', label)
  print('예측: {}'.format(label_index[y_prob_class]), 'predicted value:', y_prob)
  plt.imshow(image)
  plt.show()

^ 모델 예측하기

0개의 댓글