본문 바로가기
인공지능 개발하기/Machine Learning

[Tensorflow] 28. ImageDataGenerator 이미지 데이터 증강(augument)

by 선의공 2024. 1. 27.

 

 

 

이번 포스팅에서는

ImageDataGenerator를 이용한 

이미지 데이터 증강을 다뤄보겠습니다.

 

이전 포스팅과 마찬가지로

deprecated 된 방식이므로

변경된 방식은 추가로 학습해서 포스팅하겠습니다.

 

 

 


 

 

1. 이미지 데이터 증강

 

CNN 모델은 이미지 데이터가 최대한 다양하고

양이 많으면 학습을 잘 할수 있습니다.

 

그렇지만 데이터가 컬럼에 따라 한쪽으로 쏠려있거나 그 양이 적다면

원본이미지를 다양한 형태로 변형해서

생성하므로서 데이터의 양을 늘리는

데이터 증강을 해줍니다.

 

 

 


 

 

2.  ImageDataGenerator()를 이용해 데이터 증강하기

 

이전 포스팅에 이어서 코드를 작성해보겠습니다.

이전 포스팅에서는 이미지 데이터를 전처리하고 읽어왔습니다.

https://aigaeddo.tistory.com/32

 

27. ImageDataGenerator 1) 이미지 데이터 전처리(Preprocessing)

이번 포스팅에서는 ImageDataGenerator() 를 이용해서 이미지 데이터를 불러와 전처리해보겠습니다. (학습하려고 찾아보니 ImageDataGenerator가 deprecated 되었군요. 찾아보니 2.9 버전 이상부터는 utils.image_d

aigaeddo.tistory.com

 

 

읽어온 데이터가 고양이 이미지가 5개, 강아지 이미지가 11개로

데이터가 쏠려있다고 생각되어

고양이 이미지 6개를 증강해보겠습니다.

 

 

keras의 utils모듈의

load_img(), img_to_array()를 사용해서

증강 대상 이미지를 가져오겠습니다.

from keras.utils import load_img #이미지를 가져옴
from keras.utils import img_to_array #이미지를 수치화
path = "c:/_data/image/test_cat/\Cat/1.jpg"
img = load_img(path, 
            target_size = (300, 300)
)
#시각화
plt.imshow(img)
plt.show()

img_arr = img_to_array(img)

 

 

(요런 귀여운 고양이 이미지입니다,)

 

 

 

np.tile() 을 이용해서 증강 데상 이미지 데이터를 6개로 복사했습니다.

images = np.tile(img_arr.reshape(300*300*3), 6) #이미지 복사
images = images.reshape(-1,300,300,3)

 

 

 

 

ImageDantaGenerator()를 생성해

증강할 이미지를 어떻게 변형을 해줄지 설정해주고

from keras.preprocessing.image import ImageDataGenerator

#증강이미지 변형 설정
augument_data_gen = ImageDataGenerator(
    horizontal_flip=True, #좌우반전
    vertical_flip=True, #상하반전
    brightness_range= [0.1, 0.9], #밝기조절
    fill_mode='reflect', #회전,이동,축소시 생긴 공간을 채우는 방식
    zoom_range=0.3, #확대
    rotation_range=30, #회전
    rescale=1./255
)

 

 

 

 

 ImageDataGeneration()클래스의 

flow() 함수를 사용해서

증강대상 이미지 데이터를 넣어 이미지를 생성 해보겠습니다.

고양이는 y가 0인 값이므로 0을 채워줬습니다.

augument_iter = augument_data_gen.flow(
    images,
    np.zeros(6), #y값
    batch_size=6, #1배치 자를 사이즈
    shuffle=True #섞기
)

 

 

 

 

변형된 데이터 6개가 잘 생성되었는지

시각화해서 확인해보겠습니다

import matplotlib.pyplot as plt
fig, ax = plt.subplots(nrows=2, ncols=3, figsize = (9,6))

for i in range(6):
    (batch) = augument_iter.next()
    ax[i//3, i%3].imshow(batch[i])
    ax[i//3, i%3].axis('off')
plt.show()

 

 

각각 서로 다른 이미지로 이미지 데이터 생성이

되었습니다.

 

 

그럼 생성된 데이터를 아까 말한

비대칭 데이터와 합쳐보겠습니다.

 

#데이터 합치기
x = np.concatenate((x,augumented_x))
y = np.concatenate((y,augumented_y))

 

 

데이터를 확인해보면

11개 11개로 

고양이 이미지를 증강해서 강아지 이미지 개수와 같아진 것을

확인할 수 있습니다.

print(x.shape, y.shape) #(27, 300, 300, 3) (27,)
unique , count = np.unique(y, return_counts=True)
print(unique, count) #[0. 1.] [11 11]