Tensorflow - ImageDataGenerator (전처리와 이미지 데이터 증강)

반응형

ImageDataGenerator

인공지능은 배열의 형태로 학습 가능하다.

하지만 파일이 이미지로 구성되어있을 경우, 이미지 파일을 배열의 형태로 변환해주어야 한다.

이를 변환해주는 라이브러리가 ImageDataGenerator이다.


라이브러리 호출

from tensorflow.keras.preprocessing.image import ImageDataGenerator

이미지 전처리 (Image Preprocessing)

  • ImageDataGenerator(rescale=1/255.0) : 이미지를 0~255의 값으로 정규화된 배열로 변환
    • rescale : 크기 재조절 인수, 디폴트값은 None, None/0의 경우 크기 재조절 적용X, 데이터를 주어진 값으로 곱함 
    • 인공지능 학습용과 검증용으로 두 개의 변수 정의
train_datagen = ImageDataGenerator(rescale= 1/255.0)
validation_datagen = ImageDataGenerator(rescale= 1/255.0)

이미지 증강 (Augmentation)

  • 학습 과정에서 학습 데이터가 부족한 경우, 이미지 증강을 이용하여 다양한 관점에서의 학습
  • ImageDataGenerator 이용
  • 이미지 전처리 과정에서 추가로 파라미터를 입력
    • rotation_shift_range : 정수(각도), 이미지를 회전
    • width_shift_range : 0~1의 부동소수점, 가로비율로 좌우로 이동
    • height_shift_range : 0~1의 부동소수점, 세로비율로 상하로 이동
      • width_shift_range(height) 예시) 이미지의 크기가 10x10일 경우 0.1은 1픽셀을 의미
    • shear_range : 0~1의 부동소수점, 반시계방향으로 층밀리기의 강도
    • zoom_range : 0~1의 부동소수점, 확대의 비율
    • brightness_range : 0~1의 부동소수점, 이미지의 밝기 정도의 비율
    • horizontal_filp : True/False 좌우반전
    • vertical_flip : True/False 상하반전
    • fill_mode : 경계의 바깥 공간을 채워주는 옵션, 디폴트 값은 nearest
      • 'constant' : kkk |abcd| kkk (cval=k)
      • 'nearest' : aaa |abcd| ddd
      • 'reflect' (혹은 'wrap') : abcd |abcd| abcd
# 이런 형식으로 정의
test = ImageDataGenerator(rescale= 1/255.0, rotate_range=45, width_shift_range=0.2)

 

 

참고 자료 : Keras Documentation : https://keras.io/ko/preprocessing/image/


ImageDataGenerator Method - flow

  • 데이터와 레이블 배열을 받아 증강된 데이터의 배치를 생성
    • flow : 넘파이 배열로 된 데이터를 받을 경우
    • flow_from_dataframe : 판다스 데이터프레임으로 된 데이터를 받을 경우
    • flow_from_directory : 경로 내의 파일 데이터를 받을 경우

 

  • 정의된 이미지 전처리 변수에 값을 입력
    • path (이미지가 들어있는 디렉토리의 정보) : 이미지가 있는 경로 기재
    • target_size (이미지 사이즈의 정보) : 입력계층(input layer)의 input_shape와 크기가 같아야 함
    • class_mode (분류 정보) : binary (0과 1, 즉 2개의 분류 문제)
train_generator = train_datagen.flow_from_directory\
('/tmp/horse-or-human', target_size=(300,300), class_mode='binary')
>>> Found 1027 images belonging to 2 classes.

validation_generator = validation_datagen.flow_from_directory\
('/tmp/validation-horse-or-human', target_size=(300,300), class_mode='binary')
>>> Found 256 images belonging to 2 classes.
  • >>> Found N images belonging to 2 classes.
  • 두개의 분류 문제로 나뉘는 수많은 이미지들을 넘파이 배열로 변환
  • generator는 이미지의 정답지도까지 포함, 자체적으로 X_train과 y_train의 데이터를 지님

이미지 전처리를 이용하여 딥러닝 모델링

# 이미지 데이터셋 다운로드
!wget --no-check-certificate \
    https://storage.googleapis.com/laurencemoroney-blog.appspot.com/horse-or-human.zip \
    -O /tmp/horse-or-human.zip
    
!wget --no-check-certificate \
    https://storage.googleapis.com/laurencemoroney-blog.appspot.com/validation-horse-or-human.zip \
    -O /tmp/validation-horse-or-human.zip
    

# 파일 압축 풀기
zip_ref = zipfile.ZipFile('/tmp/horse-or-human.zip')
zip_ref.extractall('/tmp/horse-or-human')

zip_ref = zipfile.ZipFile('/tmp/validation-horse-or-human.zip')
zip_ref.extractall('/tmp/validation-horse-or-human')

zip_ref.close()


# 모델링
import tensorflow as tf
from tensorflow.keras.layers import Dense, Flatten, Conv2D, MaxPooling2D
from tensorflow.keras.models import Sequential

def build_model() :
  model = Sequential()
  model.add( Conv2D(16, (3,3), activation='relu', input_shape=(300, 300, 3) ) )
  model.add( MaxPooling2D( (2,2), 2 ) )
  model.add( Conv2D(32, (3,3), activation='relu' ) )
  model.add( MaxPooling2D( 2,2 ) )
  model.add( Conv2D(64, (3,3), activation='relu' ) )
  model.add( MaxPooling2D( 2,2 ) )
  
  model.add( Flatten() )
  model.add( Dense(units=512, activation='relu') )
  model.add( Dense(units=1, activation='sigmoid'  ) )
  return model
  
model = build_model()


# 컴파일
from tensorflow.keras.optimizers import RMSprop
model.compile(loss='binary_crossentropy',
              optimizer=RMSprop(learning_rate=0.001),
              metrics=['accuracy'])
              

# 이미지 전처리
from tensorflow.keras.preprocessing.image import ImageDataGenerator
train_datagen = ImageDataGenerator(rescale= 1/255.0)
validation_datagen = ImageDataGenerator(rescale= 1/255.0)

train_generator = train_datagen.flow_from_directory('/tmp/horse-or-human', target_size=(300,300), class_mode='binary')
validation_generator = validation_datagen.flow_from_directory('/tmp/validation-horse-or-human', target_size=(300,300), class_mode='binary')


# 딥러닝 모델 학습, generator들은 y값(정답)까지 지님
epoch_history = model.fit(train_generator, epochs=20, validation_data=(validation_generator) )


# 모델 평가
model.evaluate(validation_generator)


# 정확도 그래프
plt.plot(epoch_history.history['accuracy'])
plt.plot(epoch_history.history['val_accuracy'])
plt.legend(['train accuracy', 'val accuracy'])
plt.show()

학습된 분류 모델을 이용하여 파일 업로드해서 분류 테스트해보기

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=(300,300))
  x = image.img_to_array(img) / 255.0

  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 human")
  else :
    print(fn + " is a horse")

 

반응형