AI/Deep Learning

Data Augmentation (데이터 증식)

sonzwon 2022. 11. 7. 22:55

데이터증식이란?

기존 데이터에 적절한 변형을 추가하여 새로운 데이터를 만들어 내는 방법입니다.

  • 다양한 데이터를 입력시켜서 모델을 더욱 견고하게 만들어주어 테스트시에 높은 성능을 기대할 수 있습니다.
  • 수집된 데이터가 적은 경우에 사용합니다
    • 데이터가 적으면 overfitting 발생 확률이 증가합니다
    • 데이터를 더 수집할 수 있으면 좋겠지만, 사실상 비용의 문제로 수집이 어려운 경우가 많습니다

 

[ Color jittering ]

RGB를 이용한 색 변환 방법

  • RGB에 랜덤하게 노이즈를 더해 주기는 방식을 사용할 수 있고, 각 이미지에 PCA를 통해 찾은 중요 성분들만큼을 픽셀들의 R,G,B채널 마다 더해 주는 방식을 사용할 수 있습니다.
  • 색 변형을 통해 학습 알고리즘이 색의 변화에 더 잘 반응할 수 있게 합니다.

 

[ Sample Pairing ] 

훈련 데이터에서 무작위로 선택된 다른이미지를 오버레이하여 한 이미지에서 새로운 샘플을 합성하는 방법

  • 훈련세트에서 무작우리 선택된 두개의 이미지를 사용하여 N개의 훈련 샘플에서 N^2개의 새로운 샘플을 생성할 수 있습니다.
  • 분류 정확도를 크게 향상시킵니다.
  • 훈련 세트의 샘플 수가 매우 적을 때 정확도를 크게 향상시킵니다.

 

[ Random Erasing ]

영상에서 직사각형 영역을 무작위로 선택하고 랜덤 값으로 해당 픽셀을 지우는 방법

  •  이 과정에서 다양한 수준의 폐색이 있는 훈련 이미지가 생성되어 과적합 위험을 줄이고 모델이 폐색에 강건하게 만든다.
    • 폐색 : 하나의 물체가 다른 물체에 의해 부분적으로 가려져 보이지 않는것
  • 일반적으로 사용되는 random cropping, flipping과 같은 데이터 확대 기술을 보완하며 이미지 분류, 객체 감지 및 사람 재식별에서 강력한 기준선에 비해 일관되게 개선된다.

 

[ Mixup ]

두 데이터와 라벨을 일정 비율로 섞어 새로운 데이터를 생성하는 방법

  • Mixup은 위의 공식으로 구현됩니다.
    • (λ∈[0,1]) :  λ는 beta 분포로부터 추출한 0 부터 1사이의 값으로 두 data의 혼합 비율로, 일반적으로 0.2정도의 값을 활용하는게 가장 좋은 성능을 보인다고 알려져 있다고 합니다
    •  Mixup을 활용하면 데이터의 라벨이 잘못 부여된 경우에도 기존 학습 방법보다 강건하게 대처가 가능합니다.
  • ERM(Empirical risk Minimization)방식을 사용하여 학습 시킬 경우, 결정 경계에서 두 클래스의 경계가 매우 뚜렷해 경계에 위치해 있는 값을 한쪽 클래스로 분류하는 경향이 있는데, Mixup을 적용한 데이터셋으로 학습시킬 경우, 두 클래스 간의 결정 경계가 흐려져 중간에 위치한 값에 대해 좀 더 유연하게 추론하게 되어 과적합이 덜 발생합니다.

 

 [ tensorflow_ImageDataGenerator 사용 ]

from tensorflow.keras.preprocessing.image import ImageDataGenerator
train_datagen = ImageDataGenerator(width_shift_range=0.2,        # width=100일 때, -20~+20범위에서 이동
   				    height_shift_range=0.2,      # height=100일 때, -20~+20범위에서 이동
                                    brightness_range=[0.5,1.5],  # 원본 대비 50%비율로 어둡거나 밝게 조절
                                    shear_range=0.5,             # 최대 50% 비율로 시계 반대 방향으로 기울어짐
                                    zoom_range=0.5,              # 0.5~1.5배 범위에서 이미지 크기 조절
                                    rotation_range=30,           # 0~30 범위에서 이미지 회전
                                    rescale=1/255,               # 각 픽셀에 해당값 곱해짐
                                    fill_mode='constant',
                                    cval=0.0,                    # constant 적용 시의 배경색
                                    horizontal_flip=True,        # 수평으로 뒤집음
                                    vertical_filp=True)          # 수직으로 뒤집음
  • width_shift_range : 임의의 크기 만큼 너비 방향으로 이동
  • height_shift_range : 임의의 크기 만큼 높이 방향으로 이동
  • brightness_range : 이미지 밝기 정도 조절
  • shear_range : 시계 반대 방향으로 밀링 강도 조절
  • zoom_range : 임의의 비율만큼 이미지 확대/축소
  • rotation_range : 이미지를 범위내에서 임의로 회전
  • rescale : 이미지 픽셀 값 크기 조절
    • 원본 이미지의 픽셀 값은 0-255로 구성되는데, 이 같은 입력값은 모델을 효과적으로 학습시키기에 너무 높기 때문에1/255로 스케일링하여 0-1 범위로 변환시켜줍니다.
  • fill_mode : 이미지 변환시에 새로 생기는 픽셀을 채울 방법
  • nearest : 가장 가까운 픽셀값을 찾아 늘립니다(default)
  • constant : 다음에 있는 cval값으로 채웁니다.
  • reflect : 원본 이미지를 대칭해서 채웁니다.
  • wrap : 원본이미지를 이어 붙여서 채웁니다.
  • horizontal_flip : 이미지를 수평방향으로 뒤집음 (Boolean)
  • vertical_filp : 이미지를 수직방향으로 뒤집음 (Boolean)
  • preprocessing_function : 사용자 정의 전처리 함수 또는 전처리 함수 사용
  • featurewise_center : 데이터셋에 대해 feature별로 input의 평균이 0이 되도록합니다.(Boolean)
  • samplewise_center : 각 샘플의 평균이 0이 되도록 합니다.(Boolean)
  • featurewise_std_normalization : 인풋을 각 특성 내에서 데이터셋의 표준 편차로 나눕니다.(Boolean)
  • samplewise_std_normalization : 각 인풋을 표준편차로 나눕니다.(Boolean)
  • zca_whitening : 영위상 성분분석 백색화를 적용할지 여부(Boolean)
  • zca_epsilon : 영위상 성분분석 백색화의 엡실론 값 (default = 1e-6)

 

https://keras.io/ko/preprocessing/image/

 

Image Preprocessing - Keras Documentation

이미지 전처리 [source] ImageDataGenerator 클래스 keras.preprocessing.image.ImageDataGenerator(featurewise_center=False, samplewise_center=False, featurewise_std_normalization=False, samplewise_std_normalization=False, zca_whitening=False, zca_epsi

keras.io