이미지 데이터를 사용할 때, 데이터가 부족할 때가 많습니다.
기존 이미지에서 변형된 이미지를 사용하여 학습을 하여 모델의 정확도를 올릴 수 있습니다.
오늘은 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)