[Tensorflow]텐서플로우와 이미지 증식

신동혁·2022년 9월 29일
0

TensorFlow

목록 보기
3/4
  • 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(전단변환): 평행사변형 형태로 변환
      • shear_range: 실수 - 각도 지정
    • 명암 (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(rescale=1/255.0) # 리스케일링
# datagen = ImageDataGenerator(height_shift_range=[-100,100], fill_mode="constant") # 원래 상하 이동인데 오류인지 좌우 이동됨
# datagen = ImageDataGenerator(width_shift_range=0.3, fill_mode="constant") # 원래 좌우 이동인데 오류인지 상하 이동됨
# datagen = ImageDataGenerator(rotation_range=30, fill_mode="constant") # 회전
# datagen = ImageDataGenerator(horizontal_flip=True) # 랜덤으로 좌우반전
# datagen = ImageDataGenerator(vertical_flip=True) # 랜덤으로 상하반전
# datagen = ImageDataGenerator(shear_range=20, fill_mode="constant") # 전단변환 (평행사변형 형태로 변형)
# datagen = ImageDataGenerator(brightness_range=[0.7,1.3]) # 밝기변환(0에 가까울수록 어둡고 1보다 크면 밝아진다)
# datagen = ImageDataGenerator(zoom_range=0.5, fill_mode="constant") # 확대/축소변환 (1에 가까울수록 원본, 0에 가까울수록 축소, 1보다 크면 확대)

# 여러가지 변환들 합친 예제
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) # batch_size는 한번에 넘겨줄 데이터 개수

for i in range(9):
    plt.subplot(3,3,i+1)
    batch = next(gen) # batch_size만큼 묶어서 제공
    img = batch[0].astype("uint8") # 보기쉽게 batch_size의 첫번째만 볼거임
    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") # 모델 저장한 디렉토리

# callback
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))
profile
개발취준생

0개의 댓글