티스토리 뷰

반응형


이미지데이터 학습을 쉽게하도록 하기위해 다양한 패키지를 제공한다. 그 중 하나가 ImageDataGenerator 클래스이다.
ImageDataGenerator 클래스를 통해 객체를 생성할 때 파라미터를 전달해주는 것을 통해 데이터의 전처리를 쉽게할 수 있고, 또 이 객체의 flow_from_directory 메소드를 활용하면 폴더 형태로된 데이터 구조를 바로 가져와서 사용할 수 있다.
이 과정은 매우 직관적이고 코드도 ImageDataGenerator를 사용하지 않는 방법에 비해 상당히 짧아진다.
환경은 keras tensorflow backend를 이용하였다.

3. ImageDataGenerator를 통한 트레이닝, 테스트 데이터 만들기

ImageDataGenerator를 만들 때 아래와 같이 rescale, shear_range, zoom_range, horizontal_flip을 설정해줌으로써 해당 데이터의 전처리를 어떻게 할지를 정해준다. 이 때 파라미터가 무엇을 뜻하는지를 정리하면 아래와 같다. (https://keras.io/preprocessing/image/)

  •  
  • shear_range : 밀린강도 범위내에서 임의로 원본 이미지를 변형 시킵니다. 수치는 시계반대방향으로 밀림강도를 radian으로 나타냅니다.
  • zoom_range : 지정된 확대/축소 범위내에 임의로 원본이미지를 확대/ 축소 합니다. (1 - 수치) ~ (1+ 수치) 사이의 범위로 확대 축소를 합니다. ex> zoom_range = 0.3
  • horizontal_flip : 수평방향 뒤집기(true)
  • vertical_flip : 수직 방향 뒤집기(true)
  • rescale : rescaling factor. Defaults to None. If None or 0, no rescaling is applied, otherwise we multipy the data by the value provided (before applying any other transformation)
  • rotaion_range : 지정된 각도 범위내에서 임의로 원본 이미지를 회전 시킵니다. 단위 도, 정수형 ex>rotaion_range=90
  • width_shift_range : 지정된 수평방향 이동 범위 내에서 임의로 원본 이미지를 이동 시킵니다. 수치는 전체 넓이의 비율(실수)로 나타냅니다. ex> 0.1이면 전체 넓이 100의 10px 좌우로 이동
  • hight_shift_range: 지정된 수직방향 이동 범위 내에서 임의로 원본 이미지를 이동 시킵니다. 수치는 전체 넓이의 비율(실수)로 나타냅니다

또한 flow_from_directory 메소드를 사용하면 폴더구조를 그대로 가져와서 ImageDataGenerator 객체의 실제 데이터를 채워준다.
이 데이터를 불러올 때 앞서 정의한 파라미터로 전처리를 한다.

자료 생성

# Part 2 - Fitting the CNN to the images
from keras.preprocessing.image import ImageDataGenerator

train_datagen = ImageDataGenerator(rescale = 1./255,
                                   shear_range = 0.2,
                                   zoom_range = 0.2,
                                   horizontal_flip = True)

test_datagen = ImageDataGenerator(rescale = 1./255)

training_set = train_datagen.flow_from_directory('dataset/training_set',
                                                 target_size = (64, 64),
                                                 batch_size = 32,
                                                 class_mode = 'binary')

test_set = test_datagen.flow_from_directory('dataset/test_set',
                                            target_size = (64, 64),
                                            batch_size = 32,
                                            class_mode = 'binary')

모델 학습

마지막으로 fit_generator 함수를 실행함으로써 fitting이 이루어진다.
이 예제의 경우 ImageDataGenerator 객체를 사용하였기 때문에 fit_generator 함수를 통해 fitting한다.
steps_per_epoch은 한 번 epoch 돌 때, 데이터를 몇 번 볼 것인가를 정해준다.
[트레이닝데이터수/배치사이즈]를 사용하면 되는듯하다.
validation_steps는 한 번 epoch 돌 고난 후, validation set을 통해 validation accuracy를 측정할 때 validation set을 몇 번 볼 것인지를 정해준다.
이 때도 마찬가지로 [validation data수/배치사이즈]를 사용하면 된다.
즉 ImageDataGenerator를 쓴 경우, fit_generator를 사용하면 된다고 기억하면 된다.
폴더 구조는 아래와 같이 하면 된다.
flow_from_directory에 넣어준 경로(dataset/training_set) 밑에 이런식으로 class(cats, dogs) 별로 폴더를 만들고 폴더 밑에 이미지들을 넣어준다. 그러면 알아서 labeling을 하게 된다.

model.fit_generator(training_set,
                         steps_per_epoch = 300,
                         epochs = 25,
                         validation_data = test_set,
                         validation_steps = 2000)
반응형
댓글