이미지 증강


💡 Image Augmentation

이미지 보강은 훈련데이터에 없는 이미지를 만들어내서 훈련데이터를

보강하는 기법을 말한다. Tensorflow에는 이미지 보강 작업을 쉽게 해주는

ImageDataGenerator가 있다.

✍🏼 keras-docs

import tensorflow as tf
from tensorflow.keras.preprocessing.image import ImageDataGenerator
from tensorflow.keras.datasets.fashion_mnist import load_data

# fashion_mnist 데이터 로드
(x_train,y_train),(x_test,y_test) = load_data()

# input에 넣을 수 있게 shape 변환
x_train = x_train.reshape(len(x_train),28,28,1)
y_train = y_train.reshape(len(x_train),28,28,1)

# 0~1 사이의 값으로 정규화 / 255: 픽셀 값
x_train = x_train/255.0
y_train = y_train/255.0

# 이미지 증강 로직
image_generator = ImageDataGenerator(
    rotation_range = 15,
    zoom_range = 0.1,
    width_shift_range = 0.15,
    height_shift_range = 0.1,
    horizontal_flip = True,
    vertical_flip = False
)

# 증강할 이미지 개수
augment_size = 30000

# 0~59999 사이의 숫자에서 30000개 랜덤 추출
random_mask = np.random.randint(x_train.shape[0],size=augment_size)

# 30000개의 숫자를 리스트로 묶어줌. (copy로 원본 유지)
x_augmented = x_train[random_mask].copy()
y_augmented = y_train[random_mask].copy()

# flow 메소드를 사용하여 이미지 증강하기.
x_augmented = image_generator.flow(
    x = x_augmented,                # x : 입력 데이터
    y = np.zeros(augment_size),     # y : 라벨
    batch_size = augment_size,
    shuffle = False
).next()[0]                         

# 기존 이미지 + 증강된 이미지
x_train = np.concatenate((x_train,x_augmented))

# 기존 이미지의 라벨 + 증강된 이미지의 라벨
y_train = np.concatenate((y_train,y_augmented))


이미지 증강이 끝났으면 모델을 구축하고 학습을 시켜주면 된다.

이때 학습을 시킬 땐 “기존 이미지 + 증강된 이미지”로 학습을 시킨다.


추가적으로 flow 메소드를 사용하여 이미지를 증강할 때, next 메소드가 있다.

next 메소드는 리스트 안에 있는 요소들을 순차적으로 실행 시켜주는 로직을 갖고 있다.

그리고 뒤에 [0]을 붙혔는데 아마도 입력 데이터의 shape을 가져오려고 그런거 같다.


▪ 증강된 이미지 예시