본문 바로가기

Back/Deep Learning

[Keras]ImageGenerator 사용하기.

Keras에선 자체적으로 이미지를 다룰수 있는 기능을 제공하고 있습니다. 

keras.io/ko/preprocessing/image/

 

Image Preprocessing - Keras Documentation

이미지 전처리 [source] ImageDataGenerator 클래스 keras.preprocessing.image.ImageDataGenerator(featurewise_center=False, samplewise_center=False, featurewise_std_normalization=False, samplewise_std_normalization=False, zca_whitening=False, zca_epsi

keras.io

keras.preprocessing.image의 ImageGenerator,img_to_array, load_img를 이용해 쉽게 Test, Valid 이미지를 나눌 수 있습니다.

 


keras.preprocessing.image.ImageDataGenerator(featurewise_center=False, 
											 samplewise_center=False,  
                                             featurewise_std_normalization=False,  
                                             samplewise_std_normalization=False,  
                                             zca_whitening=False, zca_epsilon=1e-06,  
                                             rotation_range=0,  
                                             width_shift_range=0.0,  
                                             height_shift_range=0.0,  
                                             brightness_range=None,  
                                             shear_range=0.0,  
                                             zoom_range=0.0,  
                                             channel_shift_range=0.0,  
                                             fill_mode='nearest',  
                                             cval=0.0,  
                                             horizontal_flip=False,  
                                             vertical_flip=False,  
                                             rescale=None,  
                                             preprocessing_function=None,  
                                             data_format=None,  
                                             validation_split=0.0,  
                                             dtype=None

한번 입력하면 각각의 이미지를 불러올때마다 각 인수들을 적용합니다. 

  • featurewise_center=False, 불린, 데이터셋에 대해 특성별로 인풋의 평균이 0이 되도록합니다.
  • samplewise_center=False, 각 샘플의 평균이 0이 되도록 합니다.
  • featurewise_std_normalization=False, 불린, 인풋을 각 특성 내에서 데이터셋의 표준 편차로 나눕니다.
  • samplewise_std_normalization=False, 불린, 각 인풋을 표준편차로 나눕니다.
  • zca_whitening=False, 불린, 영위상 성분분석 백색화를 적용할지 여부입니다.
  • zca_epsilon=1e-06, 영위상 성분분석 백색화의 엡실론 값. 디폴트 값은 1e-6입니다.
  • rotation_range=0, 정수범위 만큼 무작위로 회전합니다.

  • width_shift_range=0.0, 사진을 좌우로 이동시킵니다. 0이하 일땐 전체의 비율, 0이상일땐 픽셀단위입니다.

0.2

 

200

  • height_shift_range=0.0, 상하로 이동합니다. 0이하일땐 전체 비율, 1이상일땐 픽셀단위로 움직입니다.

0.2
200

  • brightness_range=None, 밝기를 변경합니다. (0.0, 5.0) 이런식의 두 부동소수점이 포함된 튜플로 구성됩니다.

  • shear_range=0.0, 이미지를 찌그러 트립니다. 회전이 아님에 주의 합니다.

  • zoom_range=0.0, 이미지를 확대 혹은 축소합니다. 부동소수점, 혹은 상한 하한선을 정해서 사용합니다.

  • channel_shift_range=0.0, 무작위 채널 이동 범위입니다.
  • fill_mode='nearest', 회전 축소 등으로 이미지에 여백이생겼을때 채우는 방법입니다.

nearest, 가장 가까운 픽셀을 찾아 늘립니다. 기본값
constant, 다음에 있는 cval값으로 채웁니다.
reflect, 원본 이미지를 대칭해서 채웁니다.
wrap, 원본이미지를 이어 붙여서 채웁니다.

 

  • cval=0.0, fill_mode의 constant시 배경색을 정해줍니다.
  • horizontal_flip=False,  좌우로 뒤집습니다, 무작위로 시행됩니다.

  • vertical_flip=False, 상하로 뒤집습니다.

  • rescale=None, 이미지 처리 마지막에 주어진 값을 곱해 크기를 조정합니다.
  • preprocessing_function=None, 이미지 처리전에 주어진 값을곱해 크기를 조정합니다.
  • data_format=None, 이미지 데이터 형식을 바꿔줍니다.
    • channels_last = (샘플, 높이, 넓이, 채널)(일반적으로 기본값)
    • channels_first = (샘플, 채널, 높이, 넓이)
  • validation_split=0.0, 부동소수점 값으로 train과 valid 로 이미지를 자동으로 나누어 줍니다. subset을 통해 불러옵니다.
  • dtype=None, 생성된 배열에 사용할 자료형을 지정합니다.

이미지 복사해서 생성하기

from keras.preprocessing.image import ImageDataGenerator, img_to_array, load_img

너무 길기때문에 keras를 import한뒤 따로 import 해서 사용합니다.

 

def datagen(path):

    datagen = ImageDataGenerator(rotation_range=50,
                                 width_shift_range=0.3,
                                 height_shift_range=0.3,
                                 brightness_range=(0.0, 0.9),
                                 shear_range=0.5,
                                 zoom_range=0.5,
                                 horizontal_flip=True,
                                 vertical_flip=True)
                                 

    load_sample = load_img(path)
    sample = img_to_array(load_sample)
    sample = sample.reshape((1,) + sample.shape)
    i=0
    for batch in datagen.flow(sample, batch_size=1, save_to_dir='./example', save_prefix='example', save_format='jpg'):
        i += 1
        if i > 10: # 여기서 지정해준 만큼 이미지를 생성합니다.
            break

함수형태로 구성해놓으면 사용하기 편리합니다.

위와같이 코드를 실행할 경우 10번에 걸쳐 복사한 이미지를 생성합니다. save_prefix로 이미지 이름에 고정적으로 들어갈 문자를 넣을 수 있고, 이미지의 형식을 지정할 수 있습니다.

 

012345678910
랜덤으로 적용된 모습