[딥러닝] ImageDataGenerator

syEON·2023년 9월 18일
0
post-thumbnail
post-custom-banner

Image Data Augmentation

부족한 이미지 데이터를 늘리는 방법은? Image Data Augmentation를 이용한다.

공식문서 참고
https://www.tensorflow.org/api_docs/python/tf/keras/preprocessing/image/ImageDataGenerator

model.fit() 을 수행할 때 validation_split을 사용했는데 Image Data Augmentation을 사용할 때에는 validation data를 별도로 저장해야 한다.

from keras.preprocessing.image import ImageDataGenerator

#train데이터
trainIDG = ImageDataGenerator(rescale=1./255,         # 사실 이 부분은 전처리 과정에서 했다.
                              zca_whitening=True,     # apply ZCA whitening
                              rotation_range=30,      # randomly rotate images in the range (degrees, 0 to 180)
                              zoom_range = 0.2,       # randomly zoom image
                              width_shift_range=0.1,  # randomly shift images horizontally (fraction of total width)
                              height_shift_range=0.1, # randomly shift images vertically (fraction of total height)
                              horizontal_flip=True,   # randomly flip images
                              vertical_flip=True)     # randomly flip images

# validation 데이터 
valIDG = ImageDataGenerator()  #아무 옵션도 안주면 기존 이미지 그대로 사용!

생성한 ImageDataGenerator를 여러가지 방법으로 적용할 수 있는데 그 중 이미지 데이터가 어디에 위치해 있냐에 따라서 사용하는 함수가 달라진다.

공식문서 참고 (한글)
https://keras.io/ko/preprocessing/image/

1) flow()

이미 불러온 이미지를 활용할 때

#train 데이터 적용
# 학습이 될 때 실시간으로 이미지를 생성하고 버린다. 사용된 이미지를 저장하려면 주석을 해제하고 실행한다. 
flow_trainIDG = trainIDG.flow(train_x, train_y,
                              batch_size=128,
                            #   save_to_dir='output',
                            #   save_prefix='train',
                            #   save_format='png'
                              )
trainIDG.fit(train_x) # 옵션에 따라 필요할 수도 있고 그렇지 않을 수 있다.

#validation 데이터 적용
flow_valIDG = valIDG.flow(val_x, val_y)

2) flow_from_directory()

이미지가 특정 경로(위치)에서 class/카테고리별로 정리된 상태일 때

flow_dir_trainIDG = train_idg.flow_from_directory('분류된 이미지가 저장된 폴더 경로',
                                                  save_to_dir='새로 만들어진 이미지가 저장될 경로',
                                                  save_prefix='train',
                                                  save_format='jpg',
                                                  target_size=(28,28),
                                                  color_mode='grayscale',
                                                  class_mode='categorical'
                                                  )

flow_dir_valIDG = val_idg.flow_from_directory('분류된 이미지가 저장된 폴더 경로',
                                              save_to_dir='새로 만들어진 이미지가 저장될 경로',
                                              save_prefix='val',
                                              save_format='jpg',
                                              target_size=(28,28),
                                              color_mode='grayscale',
                                              class_mode='categorical'
                                              )

모델 학습

(모델 생성 부분 생략)

🏉 validation_split 사용 불가
ValueError: validation_split is only supported for Tensors or NumPy arrays, found following types in the input: [<class 'keras.preprocessing.image.DirectoryIterator'>]

=> 위에서 validation 데이터도 Image Data Generator를 적용한 이유이다! validation_data를 사용하자.

# 모델 학습하기 
es = EarlyStopping(monitor='val_loss',       # 얼리스토핑 적용 대상
                   min_delta=0,              # 임계값.
                   patience=3,               # 몇 번 더 지켜볼래.
                   verbose=1,
                   restore_best_weights=True # 최적의 가중치로 돌려줌.
                   )
     
#flow로 만든 이미지 
model.fit(flow_trainIDG,               # 위에서 설정한 IDG를 사용
		 validation_data=flow_valIDG, # validation data 역시 IDG를 사용
          epochs=10000, verbose=1,
          callbacks=[es]
          )

#flow_from_directory로 만든 이미지
#model.fit(flow_dir_trainIDG, validation_data=flow_dir_valIDG,
#          epochs=100, verbose=1, callbacks=[es])

그러나 원본에서 벗어난 새로운 특징은 만들어 낼수 없다는 한계가 있다.
다음에는 이를 보강하기 위해 이미 학습된 모델을 사용하는 Transfrer Learning 을 공부해보자!

post-custom-banner

0개의 댓글