이미지 전처리

Jaeseo Lee·2025년 11월 20일

ML/DL

목록 보기
2/2

이미지 전처리

Import

이미지를 다루다보니 torchvision을 사용 (datasets, transforms)

Transforms

transforms.Compose

여러 전처리를 순차적으로 체이닝하는 컨테이너

transform.Compose([전처리1, 전처리2, 전처리3])
# 이미지 -> 전처리1 -> 전처리2 -> 전처리3 -> 최종결과 return

각 전처리 설명

  • RandomResizedCrop
    • 기능: 랜덤 영역 크롭 후 리사이즈
    • 속성:
      • size: 최종 출력 크기 (224 -> 224 * 224)
      • scale: 원본 대비 크롭 면적 비율 (0.7 ~ 1.0 = 70% ~ 100%)
      • ratio: 가로세로 비율 범위 (기본값: 3:4 ~ 4:3)
    • 효과: 데이터 증강 + 크기 통일
  • CenterCrop
    • 기능: 중앙에서 해당 사이즈로 크롭
    • 속성:
      • size: 최종 출력 크기 (224 -> 224 * 224)
    • 주로 사용: 테스트/검증 시 (학습엔 RandomCrop 선호)
  • Resize
    • 단일 int: 짧은 쪽을 해당 크기로 (비율 유지)
      • 예: (500, 300) -> Resize(256) -> (427, 256)
    • 튜플 (H, W): 정확한 크기로 강제 리사이즈 (왜곡 가능)
      • 예: (500, 300) -> Resize((224, 224)) -> (224, 224)
  • RandomHorizontalFlip
    • 기능: 좌우 반전
    • 속성:
      • p: 좌우 반전 확률, 기본 p=0.5 (50%)
    • 효과: 좌우 방향 무관한 특징 학습
    • 주의: 텍스트나 방향성 중요한 데이터엔 부적합
  • ColorJitter
    • 기능: 색상 관련 '랜덤' 변화 (+ - 해당 범위)
    • 속성:
      • brightness: 밝기 랜덤 범위
      • contrast: 대비 랜덤 범위
      • saturation: 채도 랜덤 범위
      • hue: 색조 회전 랜덤 범위
    • 효과: 조명/색상 변화에 강건한 모델 학습
  • RandomRotation
    • 기능: 랜덤 회전
    • 속성:
      • 단일 int: +-범위로 랜덤 회전
      • 튜플 (L, R): 지정 범위내 랜덤 회전
    • 효과: 회전 불변성 학습
  • ToTensor
    • 기능: PIL Image/numpy -> Pytorch Tensor 변환
    • 이유: PyTorch는 (C, H, W) 형식이 필요
    • 효과: 자동으로 [0, 255] 값을 [0.0, 1.0]으로 스케일링 정규화
  • Normalize⭐⭐⭐
    • 수식:
      output[channel]=input[channel]mean[channel]std[channel]output[channel] = \frac{input[channel]\,-\,mean[channel]}{std[channel]}
    • 속성:
      • mean: 전체 데이터셋 RGB의 평균값 (중심 위치)
      • std: 전체 데이터셋 RGB의 표준편차 (퍼진 정도)
        σ=1Ni=1N(xiμ)2\sigma=\sqrt{\frac{1}{N}\displaystyle\sum_{i=1}^{N}(x_i-\mu)^2}
    • 왜 필수인가?
      • Zero-centered
        • 원래: 범위
        • 정규화 후: 평균 0 근처에 분포
        • 효과: 그래디언트 소실/폭팔 방지, 학습 안정화
      • 사전 학습된 모델의 일관성
        • 사전학습 때와 같은 정규화로 동일한 결과값 산출
        • 처음부터 학습시 자신의 데이터셋 mean/std 계산 권장
    • mean/std 계산 코드
    for images, _ in some_loader:
      samples = images.size(0)
      images = images.view(samples, images.size(1), -1)
      mean += images.mean(2).sum(0)
      std += images.std(2).sum(0)
      total_images += samples
      
    mean /= total_images
    std /= total_images

주의 사항

해당 컨테이너는 전처리 "순서"를 다루므로 순서가 중요.

# ❌ 잘못된 순서
transforms.Compose([
  transforms.ToTensor(), # 먼저 텐서로
  transforms.RandomHorizontalFlip() # PIL 연산 불가 → 에러!
])

# ✅ 올바른 순서
transforms.Compose([
  transforms.RandomHorizontalFlip(), # PIL 연산
  transforms.ToTensor(), # 그 다음 텐서 변환
])

0개의 댓글