이미지 전처리
Import
이미지를 다루다보니 torchvision을 사용 (datasets, transforms)
여러 전처리를 순차적으로 체이닝하는 컨테이너
transform.Compose([전처리1, 전처리2, 전처리3])
각 전처리 설명
- 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]=std[channel]input[channel]−mean[channel]
- 속성:
- mean: 전체 데이터셋 RGB의 평균값 (중심 위치)
- std: 전체 데이터셋 RGB의 표준편차 (퍼진 정도)
σ=N1i=1∑N(xi−μ)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()
])
transforms.Compose([
transforms.RandomHorizontalFlip(),
transforms.ToTensor(),
])