티스토리 뷰

728x90
반응형

PyTorch는 연구자와 산업계에서 널리 사용되는 딥러닝 프레임워크로, 특히 컴퓨터 비전 분야에서 큰 주목을 받습니다. 이때 전처리(preprocessing)는 모델 성능, 학습 안정성, 일반화 능력에 중대한 영향을 주는 핵심 요소입니다. 이 글에서는 transforms.Compose의 이론적 배경, 주요 transform의 역할과 추천 값, PIL의 의미, 최적화 전략, 그리고 최종 요약 표까지 심층적으로 다룹니다.


📦 transforms.Compose의 이론적 배경

transforms.Compose는 함수형 프로그래밍의 합성(composition) 개념에서 영감을 받은 PyTorch의 모듈로, 여러 전처리 단계를 하나의 파이프라인으로 연결할 수 있게 합니다. 이렇게 하면 코드의 재사용성과 실험의 일관성이 높아지고, 실험 재현성까지 보장할 수 있습니다. Compose는 transform들이 순차적으로 호출될 수 있도록 래핑하며, 각 transform은 보통 이미지 한 장 단위로 적용됩니다.

transform = transforms.Compose([
    transforms.ToTensor(),
    transforms.Normalize((0.5,0.5,0.5), (0.5,0.5,0.5))
])

이 transform 객체는 데이터셋 로딩 시 적용되며, 각 이미지에 자동으로 변환이 가해집니다.


📷 PIL이란?

PIL(Python Imaging Library)은 파이썬에서 이미지 처리 작업을 수행하기 위한 라이브러리로, 현재는 Pillow로 계승·유지되고 있습니다. PyTorch의 torchvision은 이미지 데이터를 로딩할 때 보통 PIL 객체로 읽어오며, 대부분의 transform들은 PIL 객체를 입력으로 받습니다. 특히 ToTensor()는 PIL 이미지를 Tensor로 변환하는 필수 단계입니다.


⚙️ 주요 transform 및 역할과 추천 값

✅ 1. 형식 변환 (Format Conversion)

  • ToTensor()
    • PIL → Tensor, [0,255] → [0,1]
    • 중요성: Tensor 형식은 PyTorch 모델에 필수이며, 누락 시 오류 발생

✅ 2. 정규화 (Normalization)

  • Normalize(mean, std)
    • 평균·표준편차 정규화 → 분포 안정화, gradient 폭주 방지
    • 추천 값:
      • CIFAR10: mean=(0.5,0.5,0.5), std=(0.5,0.5,0.5)
      • ImageNet: mean=(0.485,0.456,0.406), std=(0.229,0.224,0.225)

✅ 3. 크기 조정 및 자르기 (Resizing & Cropping)

  • Resize(), CenterCrop(), RandomCrop(), RandomResizedCrop()
    • 입력 크기 통일, overfitting 억제, 다양한 관점 학습
    • 추천 값: ImageNet → Resize(256), CenterCrop(224)

✅ 4. 기하 변환 (Geometric Transform)

  • RandomHorizontalFlip(), RandomVerticalFlip(), RandomRotation()
    • 방향·회전 변화에 강인한 표현 학습
    • 추천 값: RandomHorizontalFlip(p=0.5), RandomRotation(15)

✅ 5. 색상·밝기 변형 (Color & Intensity)

  • ColorJitter(), RandomGrayscale()
    • 밝기, 대비, 채도, 색조 변화 적용 → 조명·환경 변화 적응력 증가
    • 추천 값: ColorJitter(0.4,0.4,0.4,0.1)

✅ 6. 노이즈 및 마스킹 (Noise & Masking)

  • RandomErasing(), GaussianBlur()
    • occlusion, 블러에 강인한 학습
    • 추천 값: RandomErasing(p=0.5, scale=(0.02,0.33))

💥 전처리 순서의 중요성

  • ToTensor() → Normalize() 순서 유지
  • augmentation은 ToTensor() 이전에 적용 (PIL 객체 단계)
  • 테스트셋에는 augmentation 금지 → 평가 일관성 확보

순서 오류나 과도한 augmentation은 최대 10~20% 정확도 저하를 초래할 수 있습니다.


🚀 Compose 예제 (주석 및 활용 설명 포함)

🔹 훈련용 Compose

transforms.Compose([
    transforms.RandomResizedCrop(224),
    transforms.RandomHorizontalFlip(),
    transforms.ColorJitter(0.4,0.4,0.4,0.1),
    transforms.ToTensor(),
    transforms.Normalize(mean, std)
])

👉 학습 데이터를 다양화해 overfitting 방지, 일반화 성능 향상

🔹 테스트용 Compose

transforms.Compose([
    transforms.Resize(256),
    transforms.CenterCrop(224),
    transforms.ToTensor(),
    transforms.Normalize(mean, std)
])

👉 일관된 전처리로 신뢰성 높은 평가 확보


🧪 전처리의 실제 영향 사례

  1. Normalize 생략 → CIFAR-10 정확도 85% → 75%
  2. RandomCrop, Flip 적용 → ImageNet fine-tuning Top-1 accuracy +7%
  3. RandomErasing 추가 → 얼굴 인식 occlusion robust accuracy +10%
  4. ColorJitter 과용 → 의료 영상 false positive 증가, 모델 혼란 초래

📊 transforms 요약 표

분류 함수 주요 변수/설정 예 중요성 요약

형식 변환 ToTensor - PIL → Tensor, [0,1]로 스케일링
정규화 Normalize mean, std 예: (0.5,0.5,0.5) 분포 안정화, gradient 폭주 방지
크기 조정 Resize, CenterCrop, RandomCrop size, scale 입력 일관성, 다양한 관점 학습
기하 변환 RandomHorizontalFlip, RandomRotation p=0.5, degrees=15 방향·회전 강건성 증가
색상·밝기 ColorJitter, RandomGrayscale brightness=0.4, contrast=0.4 조명, 환경 변화 적응
노이즈·마스킹 RandomErasing, GaussianBlur p=0.5, scale=(0.02,0.33) occlusion 강건성 강화

transforms.Compose의 올바른 활용은 모델의 성능, 안정성, 일반화 능력을 크게 좌우합니다. 추가로 custom transform 구현, 데이터셋별 mean/std 계산법이 필요하면 언제든 문의해 주세요!

728x90
반응형