- tensorflow.keras.preprocessing.image.ImageDataGenerator
- Image 제공 데이터파이프라인을 어떻게 만들지 설정한다.
- 매개변수: 이미지 증식(augmentation) 관련 설정을 정의
- fill_mode: 이동이나 회전시 생기는 공간을 어떻게 채울 것인지 설정
- nearest: 빈공간에 가장 가까운 pixel로 채우기 (1,2,3 [3],[3],[3])
- reflect: 빈공간 근처 공간의 값을 거울로 반사되는 값들으로 채움. (1,2,3 [3],[2],[1])
- constant: 지정한 값으로 채움. 기본은 0이고 특정값으로 채울때는 cval=100 으로 설정
- Nomalization 설정
- rescale: 지정한 값을 각 픽셀에 곱한다. (rescale=1/255.)
- featurewise_center=True: channel의 평균을 pixel에서 빼서 평균 0으로 표준화한다. (channl 별로 처리)
- featurewise_std_nomalization=True: channel 별로 표준화한다. (평균 0, 표준편차 1)
- 반전
- horizontal_flip=True: 좌우반전, vertical_flip=True: 상하 반전
- 회전(rotation)
- rotation_range=정수: -정수 ~ +정수 범위로 랜덤 회전 (rotation_rate=30 : -30 ~ +30도 사이에서 랜덤하게 회전)
- 이동
- width_shift_range=실수: 좌우이동, height_shift_range=실수: 상하 이동
- 실수값: 이동범위지정. 0 ~ 1 이면 이미지 너비, 높이 기준 비율. 1이상이면 pixel.
- Zoom
- zoom_range: 실수 또는 [lower, upper]
- 실수: [1-실수값, 1+실수값]
- 리스트: 원하는 비율류 lower, upper 지정할때. 설정한 값이 1미만이면 확대(zoom in), 1초과면 축소(zoom out)
- shear(전단변환): 평행사변형 형태로 변환
- 명암 (brightness)
- brightness_range : 실수값 2개를 가지는 튜플이나 리스트. 명암 범위
- 1이 원본. 0에 가까우면 어둡고 1보타 크면 밝아진다.
- flow 메소드들 : ImageDataGenerator에 Image Data를 연결하여 batch 단위로 공급하는 Iterator 생성해준다. Raw Image data의 위치에 따라 다양한 메소드를 제공한다.
- flow_from_directory ()
- 학습시 파일 경로에 저장된 디렉토리로 부터 이미지를 읽어와 변형 처리 후 모델(네트워크)에 제공하는 Iterator 생성.
- 주요 매개변수
- directory: 이미지 저장 경로 (이미지는 지정한 디렉토리내에 클래스 별로 디렉토리가 나눠져 저장되 있어야 한다. 오름차순으로 Label이 생성.),
- target_size: 이미지 크기. 지정한 크기로 resize한다. 기본값: (256,256)
- color_mode: "grayscale", "rgb", "rgba" 중에 하나를 지정. 기본값: "rgb"
- class_mode: 분류 종류 지정
- 'binary' : binary class 분류
- 'category' : multi class 분류. label(output)이 one hot encoding 된 경우 지정
- 'sparse' : multi class 분류. label(output)이 label encoding 형식인 경우 지정
- None: 기본값. 하위디렉토리로 추론
- batch_size: 미니배치 사이즈 지정 (기본 : 32)
- 반환값
- DirectoryIterator: batch size만큼 image와 label을 제공하는 Generator
- 지정한 directory의 구조
- 디렉토리 별로 class를 지정한다.
- class 조회: `DirectoryIterator객체.class_indices.keys()`
- flow_from_dataframe()
- 읽어올 파일의 경로와 label을 DataFrame으로 생성한 뒤 그것을 이용해 파일을 Loading한다.
- dataframe
- DataFrame: image 데이터의 절대경로와 label을 저장한 DataFrame객체
- x_col: image경로 컬럼명
- y_col: label 컬럼명
- target_size: 이미지 크기. 지정한 크기로 resize한다. 기본값: (256,256)
- color_mode: "grayscale", "rgb", "rgba" 중에 하나를 지정. 기본값: "rgb"
- class_mode: 분류 종류 지정
- 'binary' : binary class 분류
- 'category' : multi class 분류. label(output)이 one hot encoding 된 경우 지정
- 'sparse' : multi class 분류. label(output)이 label encoding 형식인 경우 지정
- None: 기본값. 하위디렉토리로 추론
- batch_size: 미니배치 사이즈 지정 (기본 : 32)
- flow()
- ndarray 타입의 이미지를 받아서 처리.
- 주요 매개변수
- x: input data. 4차원 배열(크기, height, width, channel)
- y: labels.
- batch_size: 미니 배치 크기(기본값:32)
- 모델(네트워크)에서 fit() 호출하기 전까지는 preprocessing과 Data Loading이 실행되지 않는다.
datagen = ImageDataGenerator(height_shift_range=0.3,
width_shift_range=0.3,
rotation_range=30,
horizontal_flip=True,
vertical_flip=True,
shear_range=20,
brightness_range=[0.7,1.3],
zoom_range=0.5, fill_mode="constant")
fig = plt.figure(figsize=(10,10))
gen = datagen.flow(sample, batch_size=1)
for i in range(9):
plt.subplot(3,3,i+1)
batch = next(gen)
img = batch[0].astype("uint8")
plt.imshow(img)
plt.tight_layout()
plt.show()
from tensorflow.keras.preprocessing.image import ImageDataGenerator
def get_generator_no_augmentation(path):
"""
"""
img_gen = ImageDataGenerator(rescale=1/255.0)
iterator = img_gen.flow_from_directory(path,
target_size=(IMAGE_SIZE, IMAGE_SIZE),
class_mode="binary",
batch_size=N_BATCHS
)
return iterator
data_path = "/content/data/cats_and_dogs_small"
train_dataset = get_generator_no_augmentation(os.path.join(data_path, "train"))
val_dataset = get_generator_no_augmentation(os.path.join(data_path, "validation"))
test_dataset = get_generator_no_augmentation(os.path.join(data_path, "test"))
model = create_model()
base_path= "/content/drive/MyDrive/딥러닝_소스/saved_models"
save_path=os.path.join(base_path, "cat_dog_no_aug")
mc_cb = keras.callbacks.ModelCheckpoint(filepath=save_path, save_best_only=True, monitor="val_loss",verbose=2)
es_cb = keras.callbacks.EarlyStopping(monitor="val_loss", patience=10, verbose=2)
hist = model.fit(train_dataset, epochs=N_EPOCHS, validation_data=val_dataset, callbacks=[mc_cb, es_cb], steps_per_epoch=len(train_dataset), validation_steps=len(val_dataset))