본문 바로가기
Study/머신러닝

[tensorflow] ImageDataGenerator로 생성한 이미지 데이터로 학습

by 투말치 2021. 1. 25.

목차

    반응형

    이미지 데이터 분석

    *mnist 데이터 사용

     

    이미지 분석을 하기 전에 데이터 분석을 해야 한다. 내가 가진 mnist 이미지 데이터는 각 레이블 값이 폴더명이고 폴더에는 폴더명에 해당하는 이미지들이 저장된 상태다. 레이블은 0부터 9까지 총 10개다.

     

    각 레이블마다 몇개의 데이터가 있는지 확인하는 과정

    nums_dataset=[]
    
    for lbl_n in label_nums:
        data_per_class=os.listdir('../dataset/mnist_png/training/'+lbl_n)
        len(data_per_class)
        nums_dataset.append(len(data_per_class))

    해당 코드를 실행하고 nums_dataset을 확인하면 각 레이블 마다 몇 개의 데이터가 있는지 확인할 수 있다.

     

     

    이미지 열기 - 1. Pillow로 이미지 열기

    image_pil=Image.open(path)  //path는 open할 이미지의 경로가 저장된 변수
    image=np.array(image_pil)
    image.shape    

    pillow를 사용해 open한 이미지는 plt를 사용해 시각화한다.

    plt.imshow(image,'gray')
    plt.show()

     

     

    이미지 열기 - 2. tensorflow로 이미지 열기

    - 텐서플로우를 사용해 이미지를 열기 위해서는 채널이 필요하다. 이미지의 shape을 확인하면 [28,28,1]로 끝에 채널이 추가되어 있다. pillow를 사용해 open한 이미지의 shape은 (28, 28) 이었다. 

    gfile=tf.io.read_file(path)
    image=tf.io.decode_image(gfile)
    image.shape

    열어준 이미지는 plt를 사용해 시각화한다. 이때 pillow를 사용했을 때와는 다른 방식으로 이미지를 시각화한다.

    plt.imshow(image[:,:,0],'gray')
    plt.show()

     

    이미지 데이터를 확인한 이후에는 데이터의 label을 얻어와야 한다.

    이미지 사이즈를 통일시켜야 하기 때문에 데이터의 이미지 사이즈를 확인하는 과정이 필요하다.

     

    이미지 사이즈 확인하는 방법

    1. 이미지 데이터의 height, width 값을 배열에 저장한다.

    2. 각 배열에서 unique한 값이 뭐가 있는지 확인한다. => np.unique 사용

     

     

    Batch size란?

    데이터의 총 개수가 1000개일때, batchsize만큼 모델에 데이터를 나눠서 넣어준다.

     

     

     

    ImageDataGenerator를 사용해서 이미지 데이터 변형하기

    1. 이미지 불러오기

    텐서플로우를 사용해서 이미지를 불러온다.

     

    gfile = tf.io.read_file(path)
    image = tf.io.decode_image(gfile)

     

    2. ImageDataGenerator를 사용해서 데이터에 변화를 준다.

    - 이미지의 위치를 바꾸거나 회전을 시키면서 이미지를 변형한다.

    - 이미지를 변형함으로써 다양한 데이터를 만들 수 있다.

    - 아래의 이미지와 같이 이미지가 변형된 모습을 볼 수 있다.

    train_datagen = ImageDataGenerator(
            rescale=1./255,
            width_shift_range=0.3,
            zoom_range=0.2,
            horizontal_flip=True)
    
    test_datagen = ImageDataGenerator(rescale=1./255)  #테스트 데이터는 rescale만 

    3. flow_from_directory를 사용해 이미지를 batch size만큼 불러와 줄 generator를 만든다.

    - flow_from_directory : 해당하는 디렉토리에서 라벨 정보와 이미지를 불러올 수 있다.

    train_generator = train_datagen.flow_from_directory(
            train_dir,
            target_size=input_shape[:2],
            batch_size=batch_size,
            color_mode='grayscale', #기본값이 rgb라서 grayscale로 넣어야 함
            class_mode='categorical'
    )
    
    validation_generator = test_datagen.flow_from_directory(
            test_dir,
            target_size=input_shape[:2],
            batch_size=batch_size,
            color_mode='grayscale',
            class_mode='categorical'
    )

     

     

    4. 모델 학습

    - fit_generator를 사용해서 모델을 학습시킨다.

    model.fit_generator(
            train_generator,
            steps_per_epoch=len(train_generator),
            epochs=num_epochs,
            validation_data=validation_generator,
            validation_steps=len(validation_generator))

     

     

     

     

     

    반응형