from tensorflow.keras.preprocessing.image import ImageDataGenerator
1. 이미지 전처리
가지고 있는 이미지 파일을 인공지능에서 학습시키려면 numpy array 형태로 바꿔줘야 한다.
텐서플로우의 ImageDataGenerator 클래스의 flow_from_directory 메소드를 이용하면 쉽게 변환 할 수 있다.
# train 데이터용 인스턴스 호출
train_datagen = ImageDataGenerator(rescale= 1/255.0)
# test 데이터용 인스턴스 호출
test_datagen = ImageDataGenerator(rescale= 1/255.0)
train_generator = train_datagen.flow_from_directory(directory= train_dir,
target_size= (150, 150),
class_mode= 'binary',
batch_size= 20)
test_generator = test_datagen.flow_from_directory(test_dir,
target_size= (150, 150),
class_mode= 'binary',
batch_size= 20)
- ImageDataGenerator(rescale= 1/255.0) : 0 ~ 255 사이의 값인 이미지를 정규화하기 위해 255로 나눔
- directory : 데이터가 들어있는 디렉토리 경로
- target_size : (width, height). 이미지의 크기를 재조정할 치수. default 값 = (256, 256)
- class_mode : class의 인덱스는 알파벳 순(폴더명) 으로 매긴다.
- 'binary' : class가 두 개일 때
- 'sparse' : class를 레이블 인코딩
- 'categorical' : class를 원핫 인코딩
- batch_size : batch의 크기, defualt 값 = 32
!!! target_size와 모델의 input_shape은 같아야 한다.
!!! train_generator와 test_generator는 X, y 정보를 모두 갖고 있으므로
model에 fit, evaluate 등을 할 때 하나만 넣어주면 된다.
예시)
epoch_history = model.fit(train_generator,
epochs= 15,
validation_data= test_generator)
2. 이미지 증강(Augmentation)
CNN은 영상의 2차원 변환인 회전(Rotation), 크기(Scale), 밀림(Shearing), 반사(Reflection), 이동(Translation)과 같은
2차원 변환인 Affine Transform에 취약하다. 즉, Affine Transform으로 변환된 영상은 다른 영상으로 인식한다.
따라서 다양한 학습 데이터가 필요한데, ImageDataGenerator의 이미지 증강을 이용하여 다양한 관점에서의 학습을 시킬 수 있다.
train_datagen = ImageDataGenerator(rescale= 1/255.0,
rotation_range= 30,
width_shift_range= 0.4,
height_shift_range= 0.2,
shear_range= 0.3,
zoom_range= 0.5,
horizontal_flip= True)
- rotation_range : 정수. 무작위 회전의 각도 범위입니다.
- width_shift_range : 0~1 사이의 부동소수점, 가로비율로 좌우로 이동
- height_shift_range : 0~1 사이의 부동소수점, 세로비율로 상하로 이동
- shear_range : 0~1 사이의 부동소수점, 반시계방향으로 층밀리기의 강도
- zoom_range : 0~1 사이의 부동소수점, 확대의 비율
- brightness_range : 0~1 사이의 부동소수점, 이미지의 밝기 정도의 비율
- horizontal_filp : True / False 좌우반전
- vertical_flip : True / False 상하반전
- fill_mode : 경계의 바깥 공간을 채워주는 옵션, 디폴트 값은 nearest
더 많은 파라미터와 자세한 설명은 공식문서를 참고하세요.
https://keras.io/ko/preprocessing/image/
3. ImageDataGenerator Method - flow
데이터를 전달 받아 증강된 데이터의 배치를 생성하는 flow
3가지 종류가 있다.
- flow : numpy array와 label을 받아 증강된 데이터의 배치를 생성
- flow_from_dataframe : pandas dataframe과 디렉토리의 위치를 받아 증강된 데이터의 배치를 생성(numpy array)
- flow_from_directory : 디렉토리 경로를 전달 받아 증강된 데이터의 배치를 생성
한 클래스 당 하나의 하위 디렉토리가 있어야 하고,
PNG, JPG, BMP, PPM, TIF 이미지 등을 numpy array로 반환한다
'Machine Learning > Deep Learning' 카테고리의 다른 글
Transfer Learning(전이 학습) 과 Fine Tuning(미세 조정) (0) | 2023.01.03 |
---|---|
파일을 Train/Test 디렉토리로 나눠서 저장하는 방법 (0) | 2023.01.02 |
Tensorflow - CNN 모델 예제 (0) | 2022.12.31 |
Convolution Neural Network(CNN, 합성곱 신경망) 개념 (0) | 2022.12.31 |
Tensorflow - 레이블인코딩 된 y값을 원핫인코딩으로 바꾸기 (0) | 2022.12.31 |