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