AI/컴퓨터 비전

이미지 데이터 증강 (Data augmentation)

HHB 2023. 10. 10. 23:27

어떤 모델이 됐던 데이터가 많아야 오버피팅을 피할 수 있음.

 

Data augmentation은 원래 이미지를 변형해서 이미지 수를 늘리는 것임.

 

우리가 학습할 때 사용한 데이터들은 실제 상황에서 없을 수도, 없는 데이터가 있을 확률이 높음.

따라서 여러 다양성을 가진 데이터들이 있어야 일반화하기 좋다.

 

Augmentation 유형

공간 / 픽셀 변형이 있음.

 

공간 : vertical, horizontal, center, random, rotate, translate ... 등 뒤집거나 돌리거나

픽셀 : bright, grayscale, blur, noise, gamma .. 등 밝게, 색상, 노이즈, 흐리거나

 

keras ImageDataGenerator

주피터 노트북으로 실습했습니다.

import os
import numpy as np
import pandas as pd
import cv2
import matplotlib.pyplot as plt
%matplotlib inline
 
!wget -O fish.jpg https://upload.wikimedia.org/wikipedia/commons/7/7a/Goldfish_1.jpg
 
image = cv2.cvtColor(cv2.imread('fish.jpg'), cv2.COLOR_BGR2RGB)

def show_image(image):
    plt.figure(figsize=(8,8))
    plt.imshow(image)
    plt.axis('on')
    
show_image(image)
 

일단 image를 다운로드 받아서 보여준다.

 
from tensorflow.keras.preprocessing.image import ImageDataGenerator as IDG

data_gen = IDG(horizontal_flip=True)

batch = np.expand_dims(image, axis=0) #4차원으로 차원 증가 why? imagedatagenerator는 1장 이상의 이미지를 다운 받음.

data_gen.fit(batch) #fit하고 
data_gen_flow = data_gen.flow(batch) #flow 적용 

gen_image = next(data_gen_flow) #작동시키기
gen_image = np.squeeze(gen_image) #다시 3차원으로 다운

gen_image = gen_image.astype('int') #float로 반환되는거를 int로 바꾸고
show_image(gen_image) #출력 
 

tensorflow.keras.preprocessing.image에 ImageDataGenerator를 불러온다.

 

ImageDataGenerator( 인자1, 인자2, 인자3 ... )

여러가지 인자를 넣을 수 있는데.

맨 처음 나온 Generator 유형이 여기에 해당된다.

 

위 코드에선 이미지를 좌우로 뒤집은 인자이다.

horizontal_flip=True

 

근데 여기서 중요한거는 좌우로 뒤집는 것 즉 Generator가 무조건 적용되는 것은 아니다.

 

이 이미지를 보면 2번 적용한 것인데

적용이 될수도, 안 될수도 있다.

 

왜 항상 적용이 되지 않냐면

원본 이미지를 잃을 수 있기 때문이다.

 

vertical_flip은 이미지를 상하로 뒤집는 인자이다.

위 처럼 적용이 될수도 안 될수도 있다.

 

rotation_range='각도', fill_mode='인자값', cval=명도

-60 ~ 60 도로 회전하고 돌린 후 남은 공간을 채운다. cval=0이기 떄문에 검정색으로 채움.

fill_mode의 값은 아래에 설명하겠다.

 

width_shift_range 는 좌우로 일정 비율만큼 이동하는 것이다.

지금 0.4로 되어있는데 이미지의 40% 이하만큼 랜덤으로 좌우로 움직인다.

 

그리고 fill_mode는 4가지가 있다.

nearest는 남는 공간을 가까운 픽셀값으로 바꾼다.

reflect는 남는 공간을 근처 공간처럼 바꾼다.

wrap은 이동하게 되면 잘리는 이미지가 생기는데 그 이미지를 빈공간에 채운다.

constant는 남는 공간을 특정 명도로 채우게 되는데 0~255값으로 cval=255 는 흰색으로 채움

 

 

다음은 확대, 축소이다.

 

zoom_range=[하한, 상산] 무작위 줌의 범위

1보다 크면 확대, 작으면 축소

 

 

아래 주소에 imagedatagenerator 클래스에 대한 인자들이 잘 설명되어 있으니 참고하세요.

 

https://keras.io/ko/preprocessing/image/

728x90
반응형
LIST