티스토리 뷰

반응형
반응형

이 글은 다음 그림처럼 이미지와 마스크 레이블 개수가 적을때 이미지 자료를 증식하면서 이미지 값을 표준화하거나 레이블 값을 원핫인코딩을 하는 방법을 설명한다.


우선 이미지 증식과 스케일링, 원핫인코등 등과 같은 자료 전처리와 관련된 python 패키지 불러오기

import os
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import random
%matplotlib inline

import cv2

from tensorflow.keras.preprocessing.image import ImageDataGenerator

from sklearn.preprocessing import MinMaxScaler
from tensorflow.keras.utils import to_categorical
scaler = MinMaxScaler()


데이터 경로 설정하기

images_aug_path = "data/satellite_data/train_images/"
masks_aug_path = "data/satellite_data/train_masks/"

이미지 증식 유형을 설정하기

aug_gen = ImageDataGenerator(
    horizontal_flip=True,
    vertical_flip=True,
    rotation_range=45,
    zoom_range=0.5,
    shear_range=1.2  
)

데이터 경로를 이용해서 자료를 증식하는데 반드시 class_mode는 None으로 지정하고 seed 값은 이미지와 레이블 자료 모두 seed값을 부여해야 이미지와 레이블 마스크가 매칭된다. 또한 레이블 마스크는 칼러모드가 그레일 스케일로 지정해야 한다.

train_gen = aug_gen.flow_from_directory(images_aug_path, class_mode=None, seed=14)
mask_gen = aug_gen.flow_from_directory(masks_aug_path, class_mode=None, color_mode="grayscale", seed=14)


다음으로 이미지와 레이블 마스크 자료를 zip() 함수로 묶어서

train_generator = zip(train_gen, mask_gen)

데이터 전처리하는 함수를 만들고

def preprocessing(train_gen):
    
    for (img, mask) in train_gen:
        
        print("전처리", type(img))
        
        img = scaler.fit_transform(img.reshape(-1, img.shape[-1])).reshape(img.shape)
        mask  = to_categorical(mask)
        
        yield(img, mask)

데이터 전처리 함수를 실행한다. 이렇게 전처리 함수를 실행하면 리턴되는 값은 img와 mask가 numpy 배열형태의 자료이다. 이 자료를 이용해서 스케일링하고 원핫인코딩을 수행한다.

train_img = preprocessing(train_generator)

데이터를 증식하고 전처리했다면 잘 되었는지 확인하기 위해서 __next__()를 함수를 이용해서 데이터를 1개씩 확인할 수 있다.

x, y = train_img.__next__()
print(x.shape, y.shape)

for i in range(0,3):
    plt.subplot(121)
    plt.imshow(x[i])   
    plt.subplot(122)
    mask = np.argmax(y[i],axis=2)
    plt.imshow(mask, cmap='gray')
    plt.show()

반응형
댓글