[딥러닝] Keras ImageDataGenerator를 이용한 이미지 데이터 증강 (Data Augmentation

김영민·2022년 7월 21일
0

DeepLearning

목록 보기
15/27

이미지 데이터를 사용할 때, 데이터가 부족할 때가 많습니다.
기존 이미지에서 변형된 이미지를 사용하여 학습을 하여 모델의 정확도를 올릴 수 있습니다.

오늘은 keras의 ImageDataGenerator를 사용하여 이미지 데이터를 변형하는 것을 정리해보겠습니다.

ImageDataGenerator

keras의 ImageDataGenerator에는 여러가지 변환 유형이 있습니다.

공간 레벨 변형

  • Flip : 상하, 좌우 반전
  • Rotation : 회전
  • Shift : 이동
  • Zoom : 확대, 축소
  • Shear : 눕히기(?)

픽셀 레벨 변형

  • Bright : 밝기 조정
  • Channel Shift : RGB 값 변경
  • ZCA Whitening : Whitening 효과

사용해보기

1.데이터 불러오기 및 출력

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)

결과

2. 좌우, 상하 반전

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 를 해주면 됩니다!

3. Rotation 적용

위와 동일한 방식으로 사용하되,

  • ImageDataGenerator(rotation_range=45.0) 와 같은 방식으로 사용
  • 이 뜻은 -45도 ~ +45도 사이의 임의의 각도로 이미지가 틀어지게 되는 것입니다.

4. Shift 적용

-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 면 흰색으로 채우는 것입니다.

5. shear 적용

  • data_generator = ImageDataGenerator(shear_range=45) 로 사용

6. Bright 적용

  • data_generator = ImageDataGenerator(brightness_range=(0.1, 0.9))
  • 0에 가까울수록 어두워지고, 1보다 커질수록 원본 이미지보다 밝아집니다.

7. zoom 적용

  • data_generator = ImageDataGenerator(zoom_range=[0.5, 0.9])
  • 1보다 작으면 확대, 1보다 크면 축소입니다.

7. normalization

  • augmentation 용도로 사용하기보단, CNN 입력 값으로 Pixel 값 변환을 위해 0~1사이의 값으로 변환하거나 채널별 Z score로 변환하기 위해서 적용
  • featurewise_center = True -> R,G,B 각 채널의 평균을 0으로 만듦
  • featurewise_std_normalization = True -> 개별 채널의 표준 편차 값으로 나눔
  • 위의 2개를 동시에 사용해야함.
  • rescale = 255.0 -> 0~1 사이 값으로 만들기 위해 255.0으로 나눔

사용법

  • data_generator = ImageDataGenerator(featurewise_center=True, featurewise_std_normalization=True)
  • data_generator = ImageDataGenerator(rescale=1/255.0)

0개의 댓글