[Study] Augmentation(vision)

승민·2025년 11월 12일

Study

목록 보기
4/6
  1. Augmentation 실습 Notebook
  2. 목적
    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 선택
    • λ\lambda를 베타 분포에서 샘플링
    • xnew=λx1+(1λ)x2x_{new} = \lambda x_1 + (1-\lambda) x_2
    • ynew=λy1+(1λ)y2y_{new} = \lambda y_1 + (1-\lambda) y_2
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에 덮어쓰기
    • λ=\lambda= 패치 비율
    • ynew=λy1+(1λ)y2y_{new} = \lambda y_1 + (1-\lambda) y_2
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

0개의 댓글