-
efficientNet 개발 (3)딥러닝/tensorflow 2020. 2. 12. 10:44
class Preprocess(): def __init__(self, batch_size, img_width, img_height): self.img_width = img_width self.img_height = img_height self.batch_size = batch_size def makeGenerator(self, train_x, train_y, fit_val): train_datagen = ImageDataGenerator(rotation_range = fit_val['rotation_range'],\ horizontal_flip = fit_val['horizontal_flip'],\ vertical_flip = fit_val['vertical_flip'],\ preprocessing_function = self.GeneratePreprocess, \ rescale = 1 / 255.,\ fill_mode = "constant", \ cval = 0,\ width_shift_range = fit_val['width_shift_range'], \ height_shift_range = fit_val['height_shift_range'], \ zoom_range = fit_val['zoom_range'],\ brightness_range = fit_val['brightness_range']\ ) train_generator = train_datagen.flow(train_x, train_y, batch_size=self.batch_size) return train_generator def makePredictGenerator(self, predict_x): predict_datagen = ImageDataGenerator(rescale = 1/ 255.) predict_generator = predict_datagen.flow(predict_x, batch_size=self.batch_size, shuffle=False) return predict_generator def GeneratePreprocess(self, img): img = cv2.resize(img, (self.img_width, self.img_height)) return img
바로 이어서 ㄱㄱ
아래 쪽에 여러 코드들이 있지만 그 부분은 데이터들을 부르고 라벨링을 하는 부가적인 부분이라 넘어가도록 하겠다
일단 Generator를 생성하는 함수가 2개인데
하나는 train할 때, 다른 하나는 predict할 때 따로 쓰인다
그리고 ImageDataGenerator를 사용했는데 이는 저번 게시물에 언급했던 것과 같이
image augmentation을 위해서 사용하였다
여기서 사용한 방식은 회전, 상하 좌우 반전, 상하 좌우 이동, zoom, 밝기에 대한 값들을 특정 범위 내에서 랜덤하게 적용시킨다
상하 좌우 반전은 랜덤하게 반전 여부를 결정하기 때문에 True, False로 값이 들어간다
이렇게 generator를 생성하면 flow 함수를 통해서 데이터를 가져온다
flow는 메모리에 올라와있는 이미지 데이터를 가져오는 방식이고
이외에 flow_from_directory 등 다른 함수들도 있으니 아래 링크에서 확인하면 된다
https://keras.io/preprocessing/image/
Image Preprocessing - Keras Documentation
Image Preprocessing [source] ImageDataGenerator class keras.preprocessing.image.ImageDataGenerator(featurewise_center=False, samplewise_center=False, featurewise_std_normalization=False, samplewise_std_normalization=False, zca_whitening=False, zca_epsilon=
keras.io
predict generator를 생성할 때는 augmentation을 취하지 않고 1/255만 rescale 취해주고
shuffle=False로 섞지 않고 넣은 순서 그대로 값이 나오도록 하였다
그리고 각각 efficientNet 클래스의 fitGenerator와 predictGenerator에 넣어주면 동작 완료
'딥러닝 > tensorflow' 카테고리의 다른 글
[tensorflow 2] loss, optimizer 유동적으로 가져오기 (0) 2020.04.22 [tensorflow 2] DataLoader 사용법 (0) 2020.04.22 [keras] generator를 이용한 multiple input data (0) 2020.02.17 efficientnet 개발 (2) (0) 2020.02.12 efficientNet (2) 2020.02.08