꾸준하고 즐겁게

Keras의 ImageDataGenerator 클래스 본문

Machine Learning

Keras의 ImageDataGenerator 클래스

wj9183 2021. 5. 3. 14:35
728x90
ImageDataGenerator

 

ImageDataGenerator는 이미지 데이터를 학습하기 위한 전처리 과정에서 사용되는 클래스다.

이미지의 디렉토리를 설정하거나, 피쳐스케일링을 하거나, 사이즈를 변경하는 등의 전처리를 파라미터를 통해 간단하게 할 수 있게 해준다.

 

우리는 이 ImageDataGenerator를 통해 이미지 증강 기법을 실시간으로 간단하게 사용할 수 있다.

이미지 증강이란, 말 그대로 이미지 데이터를 다양하게 부풀리는 것이다.

 

데이터를 학습하는 일엔 다양하고 수많은 데이터가 필요하다.

예를 들어, 이미지를 입력하면 고양이인지 강아지인지를 분류하는 모델을 만든다고 가정한다.

강아지 고양이들의 정면 사진만을 가지고 모델을 학습시킨다면 어떨까.

분류할 이미지도 강아지 고양이의 정면 사진이라면, 잘 분류할 수 있을 것이다.

하지만 정면이 아닌 이미지를 분류하게 할 경우엔 그렇지 않다.

아래 사진과 같이 위아래로 뒤집히거나, 옆으로 뒤집히고 대각선으로 늘어나고 이미지의 정중앙이 아닌 가장자리에 위치한 애매한 이미지인 경우, 분류의 정확도가 매우 낮아질 수 밖에 없다.

 

pixabay에서 예시를 찾다보니 누워있는 고양이 모음집이 되어서 하나만 올리기로 했다.

이미지 증강 기법(=Data Augmentation)은, 우리가 학습용으로 가져온 데이터를 이리 저리 늘리고 뒤집고 기울이면서 그 모든 경우의 이미지를 직접 만들어내고 그것들도 같이 학습하게 하여 완성된 모델이 조금 더 정확하게 기능할 수 있도록 돕는다.

 

 

 

 

예시 코드

train_datagen = ImageDataGenerator(rescale=1/255.0,

                                   rotation_range = 40,

                                   width_shift_range = 0.2,

                                   height_shift_range = 0.4,

                                   shear_range = 0.2,

                                   zoom_range = 0.2,

                                   horizontal_flip = True,

                                   vertical_flip = True,

                                   fill_mode = 'nearest')  

 

rescale = 1/255.0

>>> 0부터 256까지의 숫자들로 구성되어있는 이미지를 학습을 위해 0과 1 사이로 피처스케일링한다.

 

rotation_range = 40

>>> 지정된 각도(여기서는 40도) 내에서 무작위로 원본 이미지를 회전시킨다.

 

width_shift = 0.2

>>> 전체 넓이에 0.2를 곱한 범위 내에서 원본 이미지를 무작위로 수평 이동 시킨다.

 

height_shift_range = 0.4

>>> 전체 넓이의 0.4를 곱한 범위 내에서 원본 이미지를 무작위로 수직 이동 시킨다.

 

shear_range = 0.2

>>> 수치만큼 시계 반대 방향으로 밀어 변형시킨다. 단위는 라디안이다.

 

zoom_range = 0.2

>>> 0.8 에서 1.2배 사이로 확대, 혹은 축소시킨다. 1을 기준으로 플러스마이너스 되었다.

 

horizontal_flip = True

>>> 수평으로 이미지를 뒤집는다.

 

vertical_flip = True

>>> 수직으로 이미지를 뒤집는다.

 

fill_mode = 'nearest'

>>> 이미지를 움직이고 변형하며 피치 못하게 비워지는 공간을 그 주변과 같은 색으로 채운다.

nearest 말고도 몇 가지가 있지만, 여기서는 디폴트 값인 nearest만 설명한다.

 

 

keras.io/api/preprocessing/image/

 

Keras documentation: Image data preprocessing

Image data preprocessing image_dataset_from_directory function tf.keras.preprocessing.image_dataset_from_directory( directory, labels="inferred", label_mode="int", class_names=None, color_mode="rgb", batch_size=32, image_size=(256, 256), shuffle=True, seed

keras.io

 

728x90