- Augmentation 실습 Notebook
- 목적
Image 관련 모델을 학습할 때, 강견한 모델 학습을 위해서 Augmentation은 필수이다
어떤 Augmentation이 존재하고 정의와 동작원리 그리고 실제 모습을 확인해보자
1. 8가지 Augmentation
- Pytorch의 torchvision에 구현되어 있는 augmentation 함수를 기준으로 공부
- 이 중에서 실제로 자주 사용하는 augmentation에 대해서만 정리
모나리자 이미지를 이용하여 augmentation의 동작을 실제로 확인해보자

1-1. RandomHorizontalFlip
- 정의: 이미지를 좌우로 뒤집는 증강 기법
- 결과: 좌우 대칭 객체나 방향에 민감한 특성에도 강건하게 학습 가능
- 동작 원리: 확률 p를 기준으로 이미지를 좌우 반전

1-2. RandomResizedCrop / CenterCrop
- 정의: 이미지 일부 영역을 랜덤으로 잘라내고 지정 크기로 조정
- 결과: 이미지 내 다양한 영역을 학습, 위치 변화에 강건함
- 동작 원리
- 랜덤 위치와 크기 선택
- 선택한 영역 crop
- 지정한 크기로 resize

1-3. ColorJitter
- 정의: 밝기, 대비, 채도, 색조를 랜덤하게 변경
- 결과: 조명, 색상 변화에 강건하게 학습 가능
- 동작 원리: 지정 범위 내에서 각 색상 요소를 무작위로 조정

1-4. RandomRotation
- 정의: 이미지를 지정 각도 범위 내에서 회전
- 결과: 이미지 방향 변화에도 견고하게 학습 가능
- 동작 원리
- 각도 범위 내에서 랜덤 각도 선택
- 이미지 회전, 필요시 padding 적용
- 각도가 너무 크면 그만큼 더 많은 학습을 해야 하므로 비용의 증가

1-5. RandomAffine
- 정의: 회전, 이동, 스케일, 전단(shear) 등 복합 변형 적용
- 결과: 위치, 크기, 형태, 변형에도 강건한 모델 학습 가능
- 동작 원리
- 지정 범위 내에서 변형 적용
- 원본 형태를 약간 변형

1-6. RandomGrayscale
- 정의: 일정 확률로 이미지를 흑백으로 변환
- 결과: 색상 의존도 감소(구조적 특징 학습 강화)
- 동작 원리
- 확률 p로 흑백 변환 결정
- RGB > Grayscale > 다시 3채널로 변환

1-7. GaussianBlur
- 정의: 가우시안 필터로 이미지 흐림 처리
- 결과: 디테일 변화, 노이즈에 강건하게 학습 가능
- 동작 원리
- 커널 크기와 표준편차로 가우시안 커널 생성
- 이미지 convolution > 중심 픽셀 강조, 주변 평균화

1-8. RandomErasing / Cutout
- 정의: 이미지 일부 영역을 지우거나 검은색 박스로 가림
- 결과: occlusion(가려진 영역)에도 강건하게 학습, 일부 정보 손실 대비 가능
- 동작 원리
- 랜덤 위치와 영역 크기 선택
- 해당 영역 픽셀을 0 또는 지정값으로 채움

2. Mixup & Cutmix
- 이미지와 라벨을 동시에 혼합하는 방법
- 주로 학습 단계에서 적용
- 큰 데이터셋이나 SOTA 모델 학습에서 효과적
2-1. Mixup
- 정의: 두 이미지를 가중 평균하여 합성하고, 라벨도 동일 비율로 섞는 기법
- 결과
- 이미지 혼합으로 모델이 경계에 덜 민감하게 학습
- 일반화 성능 향상, 오버피팅 ㅏㄱㅁ소
- 동작 원리
- 두 이미지
x1, x2와 라벨 y1, y2 선택
- λ를 베타 분포에서 샘플링
- xnew=λx1+(1−λ)x2
- ynew=λy1+(1−λ)y2
import numpy as np
from random import betavariate
def mixup(img1, img2, alpha=0.4):
lam = betavariate(alpha, alpha)
img_mix = lam * img1 + (1-lam) * img2
img_mix = np.clip(img_mix, 0 , 255).astype(np.uint8)
return img_mix, lam

2-2. Cutmix
- 정의: Mixup과 유사하지만, 한 이미지 일부 영역을 다른 이미지로 교체 + 라벨 혼합
- 결과
- occlusion대비 학습 강화
- Mixup보다 더 현실적인 이미지 혼합(일반화 성능 향상)
- 동작 원리
- 두 이미지
x1, x2와 라벨 y1, y2 선택
x2의 랜덤 패치를 x1에 덮어쓰기
- λ= 패치 비율
- ynew=λy1+(1−λ)y2
import numpy as np
from random import betavariate, randint
def cutmix(img1, img2, alpha=0.4):
lam = betavariate(alpha, alpha)
H, W, _ = img1.shape
cut_rat = np.sqrt(1 - lam)
cut_w = int(W * cut_rat)
cut_h = int(H * cut_rat)
cx = randint(0, W)
cy = randint(0, H)
x1 = np.clip(cx - cut_w // 2, 0, W)
y1 = np.clip(cy - cut_h // 2, 0, H)
x2 = np.clip(cx + cut_w // 2, 0, W)
y2 = np.clip(cy + cut_h // 2, 0, H)
img_cut = img1.copy()
img_cut[y1:y2, x1:x2, :] = img2[y1:y2, x1:x2, :]
return img_cut, lam
