이미지 데이터를 사용할 때, 데이터가 부족할 때가 많습니다.
기존 이미지에서 변형된 이미지를 사용하여 학습을 하여 모델의 정확도를 올릴 수 있습니다.
오늘은 keras의 ImageDataGenerator를 사용하여 이미지 데이터를 변형하는 것을 정리해보겠습니다.
keras의 ImageDataGenerator에는 여러가지 변환 유형이 있습니다.
import numpy as np
import pandas as pd
import os
import cv2
import matplotlib.pyplot as plt
%matplotlib inline
#이미지 다운로드
!wget https://www.sciencenews.org/wp-content/uploads/2020/03/033120_HT_covid-cat_feat-1028x579.jpg
# opencv에서는 BGR 순이므로 BGR에서 RGB로 convertColor 해줌
image = cv2.cvtColor(cv2.imread('033120_HT_covid-cat_feat-1028x579.jpg'),cv2.COLOR_BGR2RGB)
def show_image(image):
plt.figure(figsize=(8,8))
plt.imshow(image)
plt.axis('off')
show_image(image)
결과

from tensorflow.keras.preprocessing import ImageDataGenerator
# 좌우 반전 , 좌우반전을 True로 했지만 keras에서 랜덤으로 할 지 말 지 결정!..즉 좌우 반전 안 될 수도 있음.
data_generator = ImageDataGenerator(horizontal_flip = True)
image_batch = np.expand_dims(image,axis=0) #4차원으로 늘려주기
# ImageDataGenerator 적용하려면 fit과 flow를 해야함.
data_generator.fit(image_batch)
data_gen_iter = data_generator.flow(image_batch)
#실행을 위해선 next 필요
aug_image_batch = next(data_gen_iter)
aug_image = np.squeeze(aug_image_batch)
aug_image = aug_image.astype('int')
show_image(aug_image)
결과 >
물론, 좌우반전 안 되고 그냥 출력될 때도 있습니다! 그건 딥러닝이 스스로 판단하는거에요!

vertical_flip = True 를 해주면 됩니다!위와 동일한 방식으로 사용하되,
ImageDataGenerator(rotation_range=45.0) 와 같은 방식으로 사용-data_generator = ImageDataGenerator(width_shift_range=0.4,fill_moode='nearest') 와 같이 사용하면 됩니다.
fill_mode란?
fill_mode는 여러가지 Data Augmentation을 진행했을 시, 이미지에 생기는 빈 공간을 채우는 방식을 결정하는 것입니다.
fill_mode에는
nearest,reflect,wrap,constant등이 있는데
- nearest 는 비는 곳 가까운 곳의 픽셀값으로 채우는 것입니다.
- reflect 는 빈 공간 만큼의 영역을 근처 공간의 반전된 이미지로 채우는 것입니다.
- wrap 은 빈 공간을 이동으로 잘려나간 이미지로 채우는 것입니다.
- constant는 cval과 같이 사용하는데,
cval = 0이면 빈 공간을 검정으로 채우는 것이고,cval = 255면 흰색으로 채우는 것입니다.
data_generator = ImageDataGenerator(shear_range=45) 로 사용data_generator = ImageDataGenerator(brightness_range=(0.1, 0.9))data_generator = ImageDataGenerator(zoom_range=[0.5, 0.9]) featurewise_center = True -> R,G,B 각 채널의 평균을 0으로 만듦featurewise_std_normalization = True -> 개별 채널의 표준 편차 값으로 나눔data_generator = ImageDataGenerator(featurewise_center=True, featurewise_std_normalization=True)data_generator = ImageDataGenerator(rescale=1/255.0)