본문 바로가기
AI

PyTorch Transforms v2로 구현하는 컴퓨터 비전 이미지 증강

by markbyun 2025. 5. 1.

딥러닝에서 이미지 증강이 중요한 이유

컴퓨터 비전에서는 이미지 증강(Image Augmentation)이 딥러닝 모델의 일반화 성능을 향상시키는 데 매우 중요합니다. 라벨을 보존하면서 입력 이미지에 다양한 변형을 가함으로써, 학습 데이터의 다양성을 인위적으로 확장하고 과적합(overfitting)을 줄이며, 모델의 견고함(robustness)을 높일 수 있습니다.

특히 계층적 특성을 학습하는 CNN(합성곱 신경망)이나 공간 정보를 이용하는 Vision Transformer(ViT) 모델에서는 입력의 다양성이 모델이 더 일반적인 특성을 학습하도록 유도합니다. 이는 정보 이론 관점에서 출력 예측에 유의미한 특성과의 상호정보(Mutual Information)를 증대시키고, 노이즈를 제거하는 효과와도 같습니다.

주요 이미지 증강 기법과 파라미터 설명

1. RandomHorizontalFlip

목적: 일정 확률로 이미지를 좌우로 뒤집어 좌우 대칭에 대한 학습 효과를 부여합니다.


from torchvision.transforms import v2 as transforms

transform = transforms.Compose([
    transforms.RandomHorizontalFlip(p=0.5)
])
  
  • p: 이미지를 좌우로 뒤집을 확률입니다. 0.5는 50% 확률을 의미합니다.

2. RandomResizedCrop

목적: 이미지의 일부 영역을 무작위로 잘라내고 지정된 크기로 리사이징하여 다양한 스케일 학습을 유도합니다.


transform = transforms.Compose([
    transforms.RandomResizedCrop(size=(224, 224), scale=(0.8, 1.0), ratio=(0.75, 1.33))
])
  
  • size: 출력 이미지의 목표 크기 (높이, 너비)입니다.
  • scale: 원본 이미지 면적 대비 자를 영역의 비율 범위입니다. (0.8, 1.0)은 전체 면적의 80%~100% 범위에서 잘라냅니다.
  • ratio: 잘라낼 영역의 가로세로 비율 범위입니다.

3. ColorJitter

목적: 밝기, 대비, 채도, 색조 등을 랜덤하게 변화시켜 다양한 조명 조건을 시뮬레이션합니다.


transform = transforms.Compose([
    transforms.ColorJitter(brightness=0.2, contrast=0.2, saturation=0.2, hue=0.1)
])
  
  • brightness: 밝기를 [1-0.2, 1+0.2] 범위 내에서 무작위로 조정합니다.
  • contrast: 대비 조정 비율입니다.
  • saturation: 채도 조정 비율입니다.
  • hue: 색조 조정 범위입니다. 값은 -0.5 ~ 0.5 사이여야 하며, 작은 값은 색 온도 변화를 시뮬레이션합니다.

4. GaussianBlur

목적: 가우시안 블러를 통해 이미지 흐림 효과를 적용하여 초점 흐림, 센서 노이즈 등을 모델이 견딜 수 있게 합니다.


transform = transforms.Compose([
    transforms.GaussianBlur(kernel_size=3, sigma=(0.1, 2.0))
])
  
  • kernel_size: 필터 크기를 지정합니다.
  • sigma: 가우시안 분포의 표준편차입니다. 범위를 지정하면 무작위로 선택됩니다.

5. RandomAffine

목적: 회전, 이동, 스케일, 기울임 등을 한 번에 적용하는 기하학적 변환입니다.


transform = transforms.Compose([
    transforms.RandomAffine(degrees=30, translate=(0.1, 0.1), scale=(0.9, 1.1), shear=10)
])
  
  • degrees: 회전 가능한 각도 범위입니다.
  • translate: 이미지 크기 대비 최대 이동 비율입니다 $\text{(x축, y축)}$.
  • scale: 크기 조정 범위입니다. $\text{(예: 0.9~1.1 배)}$.
  • shear: 이미지의 기울임 각도입니다.

6. Normalize

목적: 평균과 표준편차를 기준으로 픽셀 값을 정규화합니다. 특히 사전 학습 모델을 사용할 때 필수입니다.


transform = transforms.Compose([
    transforms.ToImage(),
    transforms.ConvertImageDtype(torch.float32),
    transforms.Normalize(mean=[0.485, 0.456, 0.406],
                         std=[0.229, 0.224, 0.225])
])
  
  • mean: 채널별 평균값입니다 (보통 ImageNet 기준).
  • std: 채널별 표준편차입니다.

7. 전체 증강 파이프라인 예시


from torchvision.transforms import v2 as transforms
import torch

train_transforms = transforms.Compose([
    transforms.RandomResizedCrop((224, 224)),
    transforms.RandomHorizontalFlip(),
    transforms.ColorJitter(0.2, 0.2, 0.2, 0.1),
    transforms.RandomAffine(15),
    transforms.GaussianBlur(3),
    transforms.ToImage(),
    transforms.ConvertImageDtype(torch.float32),
    transforms.Normalize([0.485, 0.456, 0.406],
                         [0.229, 0.224, 0.225]),
])
  

맺음말

이미지 증강은 컴퓨터 비전 기반 딥러닝 모델 학습에서 빠질 수 없는 핵심 전략입니다. PyTorch의 torchvision.transforms.v2 API를 활용하면 다양한 이미지 변환을 손쉽게 구현할 수 있으며, 이는 모델의 일반화와 정확도 향상에 크게 기여합니다.

참고 문헌

  • PyTorch 공식 문서: torchvision.transforms.v2
  • Shorten, C. & Khoshgoftaar, T.M. (2019). "A survey on image data augmentation for deep learning". Journal of Big Data, 6(60).
  • Dosovitskiy, A., et al. (2021). "An Image is Worth 16x16 Words: Transformers for Image Recognition at Scale". ICLR.