
딥러닝 모델의 성능을 결정짓는 핵심 요소는 모델 아키텍처뿐만 아니라, 입력되는 데이터의 질과 다양성입니다. PyTorch 생태계의 핵심 라이브러리인 torchvision.transforms는 이미지를 텐서로 변환하고, 데이터 증강(Data Augmentation)을 통해 모델의 일반화 성능을 극대화하는 중추적인 역할을 합니다. 특히 최근 도입된 v2 API는 객체 탐지(Detection)와 세그멘테이션(Segmentation)까지 아우르는 강력한 기능을 제공합니다. 본 가이드에서는 실무에서 바로 사용 가능한 7가지 변형 방법과 라이브러리 활용 팁을 상세히 다룹니다.
1. torchvision.transforms의 역할과 진화
기존의 torchvision.transforms(v1)는 주로 이미지 분류(Classification) 작업에 최적화되어 있었습니다. 이미지 한 장을 변형하면 끝이었기 때문입니다. 하지만 최신 v2는 이미지뿐만 아니라 바운딩 박스(Bounding Boxes), 마스크(Masks)를 동시에 변형할 수 있는 구조로 설계되었습니다. 데이터 증강은 학습 데이터셋의 양을 인위적으로 늘리는 기법으로, 모델이 조명 변화, 각도 변화, 노이즈에 강인해지도록(Robustness) 훈련시키는 데 필수적입니다.
2. transforms v1과 v2의 주요 특징 및 차이점 비교
최신 프로젝트를 진행 중이라면 v2를 사용하는 것이 권장됩니다. 두 버전의 기술적 차이를 명확히 이해해야 올바른 파이프라인 구축이 가능합니다.
| 비교 항목 | Legacy (v1) | Latest (v2) |
|---|---|---|
| 지원 데이터 타입 | PIL Image, Tensor | Image, Bounding Box, Mask, Video |
| 다중 타겟 변형 | 불가 (이미지만 가능) | 가능 (이미지와 레이블 동시 변형) |
| 성능 및 속도 | 표준 수준 | 최적화된 커널 사용으로 더 빠름 |
| 함수 인터페이스 | Compose 기반 | Compose 기반 + Functional API 강화 |
| 추천 워크플로우 | 단순 분류 모델 학습 | 컴퓨터 비전 전반 (Detection 등) |
3. 실무 필수 이미지 변형 Example 7가지
실제 프로덕션 환경에서 가장 많이 쓰이는 변형 기법들을 v2 스타일과 결합하여 소개합니다.
Example 1: 기본 전처리 파이프라인 구축 (Resize & ToTensor)
모델 입력 규격에 맞게 크기를 조정하고 텐서로 변환하는 가장 기초적인 단계입니다.
from torchvision.transforms import v2
import torch
transform = v2.Compose([
v2.Resize((224, 224)),
v2.ToImage(),
v2.ToDtype(torch.float32, scale=True),
v2.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])
])
Example 2: 기하학적 변강 (Random Resized Crop)
이미지의 특정 부분을 무작위로 자르고 크기를 키워 모델이 객체의 일부만 보고도 클래스를 예측하게 만듭니다.
# 크롭 후 원본 크기로 복원
aug_transform = v2.RandomResizedCrop(size=(224, 224), antialias=True)
Example 3: 색상 변조 (Color Jitter)
밝기, 대비, 채도, 색조를 조절하여 조명 변화에 강인한 모델을 만듭니다.
# 밝기 20%, 대비 20% 내외 무작위 변화
color_aug = v2.ColorJitter(brightness=0.2, contrast=0.2, saturation=0.2, hue=0.1)
Example 4: 자동 증강 정책 활용 (AutoAugment)
데이터셋(ImageNet, CIFAR10 등)에 최적화된 검증된 증강 조합을 바로 적용합니다.
# ImageNet 학습에 검증된 정책 적용
auto_aug = v2.AutoAugment(v2.AutoAugmentPolicy.IMAGENET)
Example 5: 무작위 지우기 (RandomErasing)
이미지의 일부를 사각형으로 지워 모델이 특정 특징에만 과도하게 의존하는 현상을 방지합니다.
erase_aug = v2.RandomErasing(p=0.5, scale=(0.02, 0.33))
Example 6: Mixup 및 CutMix (v2 전용 고급 기법)
두 이미지를 섞거나 하나를 잘라 붙이는 최신 정규화 기법입니다.
# v2에서는 배치 단위로 Mixup 적용이 매우 간편함
mixup = v2.MixUp(alpha=1.0)
cutmix = v2.CutMix(alpha=1.0)
# 배치 처리 예시 (images, labels가 텐서일 때)
# mixed_images, mixed_labels = mixup(images, labels)
Example 7: 객체 탐지를 위한 동시 변형 (Detection)
이미지를 돌릴 때 바운딩 박스 좌표도 함께 회전시키는 실무 해결 방법입니다.
from torchvision import tv_tensors
# 이미지와 바운딩 박스 동시 처리
transform_det = v2.Compose([
v2.RandomHorizontalFlip(p=0.5),
v2.RandomAffine(degrees=15)
])
# input 구조: (Image, BoundingBoxes)
# output 역시 변형된 이미지와 바운딩 박스가 튜플로 반환됨
4. 성능 최적화: GPU 가속 Transforms 활용 방법
데이터 로딩 속도가 학습을 방해한다면, CPU가 아닌 GPU에서 변형을 처리해야 합니다. torchvision.transforms.v2는 텐서 기반이므로 GPU로 전송한 데이터에 직접 적용할 수 있습니다.
- CPU 전처리: 복잡한 연산이 필요한 경우 유용하지만, 코어 수에 따라 병목 발생.
- GPU 전처리: 배치 단위 연산이 가능하여 매우 빠름.
.to('cuda')이후 transform 호출.
5. 결론: 올바른 라이브러리 선택 전략
단순한 연구용 프로젝트라면 v1도 충분하지만, 실무 프로덕션 환경이나 최신 연구 기법(CutMix 등)을 도입하려면 v2 API가 정답입니다. 특히 객체 탐지나 세그멘테이션을 다루는 개발자라면, 좌표 계산의 번거로움을 덜어주는 torchvision의 최신 기능을 반드시 익혀두어야 합니다.
'Artificial Intelligence > 21. PyTorch' 카테고리의 다른 글
| [PYTORCH] num_workers 설정이 성능에 미치는 3가지 영향과 최적화 해결 방법 (0) | 2026.03.25 |
|---|---|
| [PYTORCH] pin_memory=True 사용 방법과 3가지 성능 차이 해결 가이드 (0) | 2026.03.25 |
| [PYTORCH] 텍스트 데이터 처리를 위한 torchtext 활용 방법 및 0.18버전 이후 변화 해결 가이드 (0) | 2026.03.25 |
| [PYTORCH] 비정형 데이터를 텐서로 변환하는 7가지 방법과 데이터 손실 해결 가이드 (0) | 2026.03.25 |
| [PYTORCH] Subset을 이용해 학습/검증 데이터를 나누는 3가지 방법과 데이터 누수 해결 가이드 (0) | 2026.03.25 |