Pytorch 사용시 torchvision.transform 을 이용해서 여러 비전 관련 작업들을 수행한다. 여러 사람들이 다양한 데이터를 사용하고 이를 이용해 모델을 학습 시킨다.
T.Normalize(mean=(0.485, 0.456, 0.406), std=(0.229, 0.224, 0.225))
이때 전처리 정규화 과정의 평균과 표준편차는 대부분 이미지넷의 통계치를 사용한다. 그럼 이 정규화 코드는 무엇을 의미할까?
이미지의 구간 범위를 0-1로 하면 평균은 0.5로 하는것이 일반적이라고 생각되지만 그렇지 않다.
위 수치는 ImageNet 데이터세트의 평균과 표준편차 통계치이다.

실제 각 채널(rgb) 별 정규화되는 값의 범위는 아래와 같이 계산된다.

만약 학습데이터셋이 gray scale 도메인이라면,
(rgb 채널 값이 같음)
두가지 선택지가 있다.
import os
import torch
from torchvision import datasets, transforms
from torch.utils.data.dataset import Dataset
from tqdm.notebook import tqdm
from time import time
N_CHANNELS = 1
dataset = datasets.MNIST("data", download=True,
train=True, transform=transforms.ToTensor())
full_loader = torch.utils.data.DataLoader(dataset, shuffle=False, num_workers=os.cpu_count())
before = time()
mean = torch.zeros(1)
std = torch.zeros(1)
print('==> Computing mean and std..')
for inputs, _labels in tqdm(full_loader):
for i in range(N_CHANNELS):
mean[i] += inputs[:,i,:,:].mean()
std[i] += inputs[:,i,:,:].std()
mean.div_(len(dataset))
std.div_(len(dataset))
print(mean, std)
print("time elapsed: ", time()-before)Mean: 0.44531356896770125
Std: 0.2692461874154524
IR 데이터셋으로 직접 학습이 불가능하여,
rgb 도메인으로부터 학습된 사전학습 모델을 사용해야만 하는 경우에는
아래의 솔루션을 적용할 수 있다.
따라서, 아래와 같은 방식으로 역산할 수 있다.
