이미지를 처리하는데 만약 데이터들의 크기가 일정하지 않을 경우, 전처리를 일일이 해주어야 하는가??
그렇지 않다. ImageGenerator을 사용하면 이미지의 크기를 모두 설정된 크기로 바꾸어줄 뿐만 아니라 , 이미지의 양을 늘려 보다 많은 훈련 데이터를 만들어내 모델의 성능을 최대한으로 이끌어내는 데 도움이 된다.
그렇다면 이 ImageGenerator은 어떻게 사용해야 하는가??
from tensorflow.keras.preprocessing.image import ImageDataGenerator
을 통해서 import 한 후에
igen=ImageDataGenerator(rescale=1/255, validation_split=0.2,horizontal_flip=True,
vertical_flip= True,fill_mode='nearest')
이런 식으로 만들어 준 뒤,
train0=igen.flow_from_directory("train_dir",target_size=isize,
class_mode='sparse',batch_size=bs, subset= 'training')
train1=igen.flow_from_dataframe(dataframe,directory=train_dir,target_size=isize,
class_mode='sparse',batch_size=bs, subset= 'training')
둘 중 하나를 선택해서 사용하고 model.train(train0, epochs = 32,...) 이렇게 사용하면 된다.
ImageDataGenerator
ImageDataGenerator에 관해서 살펴보자면,
파라미터로 여러 가지를 넣을 수 있는데, 가장 많이 쓰이는 것만 살펴보자면
rescale, wide_shift_range, height_shift_range, rotation_range, brightness_range, zoom_range, validation_split, horizontal_flip, 그리고 vertical_flip, fill_mode 정도가 있다.
rescale : 픽셀의 값을 줄이거나 늘릴 수 있다. 보통 0~1 사이의 값을 주기 위해 1/255를 많이 사용한다.
wide_shift_range : 주어진 값이 1보다 작을 경우 전체 너비에 대한 비율로 적용되며 이 범위에 대한 이동 범위만큼 좌우로 이미지를 움직인다. 예를 들어 너비가 100픽셀인 경우 0.1이 주어지면 10픽셀만큼의 범위 내에서 임의로 좌우로 움직인 이미지가 제공된다.
height_shift_range : 주어진 값이 1보다 작을 경우 전체 높이에 대한 비율로 적용되며 이 범위에 대한 이동범위만큼 임의로 상하로 이미지를 움직인다. 예를들어 높이가 100픽셀인경우 0.1이 주어지면 10픽셀만큼의 범위내에서 임의로 상하로 움직인 이미지가 제공된다.
rotation_range : 주어진 각도만큼의 범위 내에서 임의로 회전시킨 이미지가 주어진다.
예를 들어, 90이 주어지면 0~90 도만큼의 임의의 회전을 한 이미지가 제공된다.
zoom_range : 주어진 숫자만큼의 범위 내 배율을 적용한 이미지를 제공한다.
예를 들어, 0.2인 경우 0.8~1.2 비율의 이미지가 임의로 제공된다.
validation_split : validation_set으로 쓸 데이터의 비율을 정한다. 만약 값이 정해져 있다면 후에 사용할 flow_from_directory나 flow_from_dataframe에서 파라미터 subset = 'training' 혹은 subset = 'validation'으로 훈련 데이터 셋과 검증 데이터 셋을 줄 수 있다.
horizontal_flip : True 인경우, 수평방향 뒤집기를 한 이미지를 제공한다. (좌우 뒤집기)
vertical_flip : True 인 경우, 수직방향 뒤집기를 한 이미지를 제공한다. (상하 뒤집기)
fill_mode : 이미지를 변경했을 때, 비어있는 픽셀이 생길 경우, 어떻게 채울 지에 관한 설정이다.
neareast, constant, reflect, wrap 등이 있다.
ImageDataGenerator의 flow_from_dataframe과 flow_from_directory에 관해 살펴보자
flow_from_dataframe
igen = ImageDataGenerator(rescale = 1./255)
train = igen.flow_from_dataframe(dataframe,directory = train_dir,
x_col = dataframe.columns[0],y_col = dataframe.columns[1])
dataframe 은 라벨과 파일의 이름이 담긴 데이터 프레임이다.
자주 사용하는 파라미터들에 대해 살펴보면,
target_size, batch_size, class_mode, directory, x_col, y_col, 그리고 subset 등 이 있다
target_size : 바꿀 이미지 크기이다.
batch_size : batch의 크기를 결정해 준다.
class_mode : 다중 분류, 이진 분류 인지 선택하는 곳이다.
one-hot 인코딩 된 다중 분류의 경우 "categorical"
이진 분류의 경우는 "binary"
0,1,2... 등으로 분류되는 다중 분류의 경우는 "sparse"로 지정해 주면 된다.
directory : 미지정시 데이터 프레임의 이름에 절대 경로가 들어간다.
x_col : 데이터 프레임에서 처리할 이미지의 경로 혹은 이름이 들어간 열의 이름을 입력해야 한다.
y_col : 데이터 프레임에서 처리할 이미지의 라벨이 들어간 열의 이름을 입력해야 한다.
subet : ImageDataGenerator에서 validation의 값이 주어진 경우, 'training' 혹은 'validation'으로 지정해
훈련 셋과 검증 셋으로 지정해 줄 수 있다.
아래 이미지를 보면 좀 더 이해하기 쉬울 것이다. 예시로 살펴보자면 아래와 같다.
다음과 같은 데이터 프레임이 존재하고, 파일 구성이 이런 경우, 이런 식으로 사용이 가능하다.
igen = ImageDataGenerator(rescale = 1./255)
train = igen.flow_from_dataframe(trainDataFrame,directory = "./",
x_col = trainDataFrame.columns[0],y_col = trainDataFrame.columns[1])
flow_from_directory
만약에 파일들이 주황색 네모 안과 같이 종류별로 폴더 안에 구성되어 있을 때, 사용하기 편리하다.
위 상황에 대해서는 이런식으로 사용이 가능할 것이다.
igen = ImageDataGenerator(rescale = 1./255, validation = 0.2)
train = igen.flow_from_directory("./", target_size = (256,256), class_mode = 'sparse',
batch_size = 32, shuffle = True, subset = 'training')
자주 사용하는 파라미터에 대해 알아보자면,
target_size, batch_size, class_mode, subset 등 이 있다.
target_size : 바꿀 이미지 크기이다.
batch_size : batch의 크기를 결정해 준다.
class_mode : 다중 분류, 이진 분류 인지 선택하는 곳이다.
one-hot 인코딩 된 다중 분류의 경우 "categorical"
이진 분류의 경우는 "binary"
0,1,2... 등으로 분류되는 다중 분류의 경우는 "sparse"로 지정해 주면 된다.
subet : ImageDataGenerator에서 validation의 값이 주어진 경우, 'training' 혹은 'validation'으로 지정해
훈련 셋과 검증 셋으로 지정해 줄 수 있다.
++응용++
위 그림의 test 폴더의 경우 flow_from_directory가 안되기 때문에 위와 같은 test2 데이터 프레임을 만들고
flow_from_dataframe을 사용해서 테스트하여야 한다.(shuffle = False로 해야 데이터 프레임 내의 순서가 유지된다)
참조
https://keras.io/ko/preprocessing/image/
'수업내용정리 > 인공지능' 카테고리의 다른 글
[Tensorflow][Keras]Conv2D사용법 _CNN이란? (0) | 2023.01.17 |
---|---|
[Tensorflow][Keras]CNN이란? CNN에 대해 개략적으로 살펴보기 (0) | 2023.01.15 |
[Tensorflow][Keras]인공지능? 머신러닝? 딥러닝? (0) | 2022.12.09 |
[Tensorflow][Keras]Word2Vec 코드로 구현하기 (0) | 2022.11.27 |
[Tensorflow][Keras][NLP]Word2Vec 이란? (0) | 2022.11.26 |