Dataset
from glob import glob
from torch.utils.data import Dataset, DataLoader
from PIL import Image
import torchvision.transforms as T
class my_dataset(Dataset):
def __init__(self, image_path, classes, transform=None):
self.image_path = image_path
self.labels = self.get_labels(image_path, classes)
self.transform = transform
self.classes = classes
def get_labels(self, image_path, classes):
label_list = []
for path in image_path:
temp = path.split('/')[-1]
temp = temp.split('\\')[-2]
num = classes.index(temp)
label_list.append(num)
return label_list
def __len__(self):
return len(self.image_path)
def __getitem__(self, idx):
img = Image.open(self.image_path[idx])
if self.transform is None:
return img, self.labels[idx]
else:
return self.transform(img), self.labels[idx]
train_data_path = glob('./data/CIFAR-10-images-master/train/*/*.jpg')
test_data_path = glob('./data/CIFAR-10-images-master/test/*/*.jpg')
my_mean = [0.485, 0.456, 0.406]
my_std = [0.229, 0.224, 0.225]
my_transforms = T.Compose([
T.Resize((100, 100)),
T.Normalize(mean=my_mean, std=my_std)
])
train_loader = DataLoader(custom_dataset(train_data_path, classes, my_transforms),
batch_size=10,
shuffle=True,
drop_last=True)
test_loader = DataLoader(custom_dataset(test_data_path, classes, my_transforms),
batch_size=10,
shuffle=True,
drop_last=True)
Transforms
normalize_transform = T.Normalize(
mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])
if is_train:
transform = T.Compose([
T.Resize(config.image_size),
T.RandomHorizontalFlip(p=config.prob),
T.Pad(config.padding),
T.RandomCrop(config.image_size),
T.ToTensor(),
normalize_transform,
RandomErasing(probability=config.re_prob,
mean=[0.485, 0.456, 0.406])
])
transforms에 속한 클래스
1. transforms.CentrCrop(size)
- 주어진 PIL 이미지의 중앙을 기준으로 size X size 크기로 자른다.
2. transforms.Grayscale(num_out_channels=1)
- 주어진 이미지를 그레이스케일로 변형한다.
- parameter에 1or3을 지정할 수 있는데 1이면 싱글채널이 반환이 되고, 3이면 r==g==b인 3채널이 반환이 된다.
3. transforms.Pad(padding, fill=0, padding_mode='constant')
- 이미지에 대해 컨볼루션을 거칠 때 이미지의 크기와 컨볼루션 커널의 크기가 맞지 않아 이미지의 사이드를 어떠한 수 로 채울 때 사용한다.
- padding : int, tuple 형식으로 지정할 수 있다. 만약에 int형으로 한 개의 수를 입력한다면 이미지의 모든 사이드를 그 수로 채운다는 것이다. 그리고 튜플형식으로 (a,b)를 입력한다면 왼쪽과 오른쪽은 a로 위와 아래는 b로 채운 다는 것이다. 마지막으로 (a,b,c,d)를 입력한다면 왼쪽, 위, 오른쪽, 아래를 각각 a,b,c,d로 채우게 된다.
- fill=0 : padding을 하기 위한 값을 입력한다. default는 0이며, R, G, B 색 공간일 때는 튜플형식으로 입력을 한다.
- padding_mode='constant' : padding_mode를 설정하게 되는데 default는 constant이다.
4. transforms.Resize(size, interpolation=2)
- 주어진 PIL 이미지를 입력한 size로 크기조정을 한다.
- size : 만약에 sequence 형식으로 (h,w)로 입력을 한다면 h,w로 크기가 조정이되며, int형식으로 한 개의 수가 입력이 된다면 h, w중 작은 것이 입력된 수로 조정이 된다. 예를 들어, h>w라면 (size*h/w, size) 이렇게 크기가 재조정이 된다.
5. transforms.Normalize(mean, std, inplace=False)
- 주어진 이미지를 mean, std의 값을 통해 정규화를 한다.
- mean : (sequence)형식으로 평균을 입력하며, 괄호 안에 들어가 있는 수의 개수가 채널의 수이다.
- std : (sequence)형식으로 표준을 입력하며, 마찬가지로 괄호 안에 들어가 있는 수의 개수가 채널의 수이다.
- inplace(bool, optional) : x
6. transforms.ToTensor()
- PIL 이미지 또는 numpy.ndarray 형식의 이미지를 tensor 형식으로 변환한다.
- 0~255의 범위를 갖는 (H x W x C)의 형식을 0.0~1.0의 범위를 갖는 (C x H x W)의 형식으로 변환한다.
'Deep Learning > Pytorch' 카테고리의 다른 글
25_Pytorch_GoogLeNet 1x1 Convolution (0) | 2022.03.15 |
---|---|
30_AlexNet (0) | 2022.03.01 |
23_Pytorch_EfficientNet (0) | 2021.11.24 |
26_Pytorch_Inception-v2, v3 (미완) (0) | 2021.10.25 |
24_Pytorch_MobileNet - 연산량 number of operations (0) | 2021.10.12 |