카테고리 없음
pytorch dataloader
notou10
2022. 7. 15. 18:17
1. dataset 정의하고
2. loader 쓰는게 일반적인 사용법임.
1) Image folder 쓰는 경우
특징 :
이미지 한장씩 차곡차곡 불러오는 경우
각 폴더가 label이름임
예시
####tuils.py 내 내용
def imagenet_transform():
return transforms.Compose([
transforms.Resize((256,256)),
transforms.RandomCrop((240,240), padding=4),
transforms.RandomHorizontalFlip(p=0.5),
transforms.ToTensor(),
transforms.Normalize((0.485, 0.456, 0.406), (0.229, 0.224, 0.225))])
###main.py 내 내용
#같은 폴더 내 utils.py 내용 모두 가져오기
from utils import *
from tqdm import tqdm
dataset = torchvision.datasets.ImageFolder(root=f"{self.root_path}/val", transform=imagenet_ransform())
dataloader = torch.utils.data.DataLoader(
dataset, batch_size=self.train_batch, shuffle=True, num_workers=4)
for index, (data, label) in tqdm(enumerate(loader), total=len(loader)):
#cuda 올리기
data = data.cuda(device)
#cuda 올리기 다른 방식
data, target = data.to(device), target.to(device)
output = model(data)
custom dataloader example1 -> 한 폴더 내 5개 이미지 불러오기
#utils.py
class CustomDataset(data.Dataset):
def __init__(self, args, transforms):
self.path = args.data_path
self.task = os.listdir(args.data_path)
self.task_list = [file for file in self.task if not file.endswith('jpg')]
self.transforms = transforms
# 총 데이터의 개수를 리턴
def __len__(self):
return len(self.task_list)
def get_image(self, path):
# open image
image = Image.open(path)
image = np.array(image)
return image
def __getitem__(self, idx):
path = os.path.join(self.path, self.task_list[idx])
ref_list = os.listdir(path)
ref1 = self.get_image(os.path.join(path, ref_list[0]))
ref2 = self.get_image(os.path.join(path, ref_list[1]))
ref3 = self.get_image(os.path.join(path, ref_list[2]))
ref4 = self.get_image(os.path.join(path, ref_list[3]))
ref5 = self.get_image(os.path.join(path, ref_list[4]))
return self.transforms(ref1),self.transforms(ref2),self.transforms(ref3),self.transforms(ref4),self.transforms(ref5)
#main.py
dataset = CustomDataset(args, transforms = imagenet_transform())
loader = torch.utils.data.DataLoader(dataset, batch_size = 8, shuffle=False, num_workers=0)
custom dataloader example 2 : 데이터셋 이미지 이름순으로 소팅(natsorted) 하고 불러오기
#utils.py
class style_dataset(data.Dataset):
def __init__(self, args, transforms):
self.path = args.data_path
self.data = []
for index, i in enumerate(natsorted(os.listdir(self.path))):
self.data.append(i)
self.transforms = transforms
def __getitem__(self, idx):
img_ = os.path.join(self.path, self.data[idx])
img = self.get_image(img_)
return img
def __len__(self):
return len(self.data)
def get_image(self, path):
# open image
image = Image.open(path)
image = np.array(image)
image_tensor = self.transforms(image)
return image_tensor
#main.py
dataset = style_dataset(args, transforms = imagenet_transform())
loader = torch.utils.data.DataLoader(dataset, batch_size = args.batch_size, shuffle=False, num_workers=0)
loader 여러개 : 딕셔너리 만들고 하나하나 불러서 변수명으로 npy 저장
import torch
import torchvision
import logging
import torchvision.datasets as datasets
import timm
import numpy as np
from torchvision import transforms
import torch.nn as nn
from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score
from _sin_reference import *
from torchvision import models
resnet50_pretrained = models.resnet50(pretrained=True)
def imagenet_valid_transform():
return transforms.Compose([
transforms.Resize((224,224)),
transforms.ToTensor(),
transforms.Normalize((0.485, 0.456, 0.406), (0.229, 0.224, 0.225))])
model_A = "resnet50_trained_on_SIN"
model_B = "resnet50_trained_on_SIN_and_IN"
model_C = "resnet50_trained_on_SIN_and_IN_then_finetuned_on_IN"
#model = load_model(model_name = model_A)
model = resnet50_pretrained
#data_path = "../../dataset/dongkyun/dk_dataset/afhq_dataset/experiment_afhq/for_test/stylized_dog_adained"
data_path = "../../dataset/dongkyun/dk_dataset/afhq_dataset/experiment_afhq/for_test/afhq_dog"
data_path_fsmr = "../../dataset/dongkyun/dk_dataset/afhq_dataset/experiment_afhq/for_test/fsmr_dog"
data_path_stylegan = "../../dataset/dongkyun/dk_dataset/afhq_dataset/experiment_afhq/for_test/stylegan_dog"
data_path_cat = "../../dataset/dongkyun/dk_dataset/afhq_dataset/experiment_afhq/for_test/afhq_cat"
data_path_dog = "../../dataset/dongkyun/dk_dataset/afhq_dataset/experiment_afhq/for_test/afhq_dog"
data_path_cutmix = "../../dataset/dongkyun/dk_dataset/afhq_dataset/experiment_afhq/for_test/cutmixed"
val_dataset = datasets.ImageFolder(root=f"{data_path}", transform = imagenet_valid_transform())
val_loader_default = torch.utils.data.DataLoader(val_dataset, batch_size=50, shuffle=False, num_workers=4)
val_dataset_fsmr = datasets.ImageFolder(root=f"{data_path_fsmr}", transform = imagenet_valid_transform())
val_loader_fsmr = torch.utils.data.DataLoader(val_dataset_fsmr, batch_size=50, shuffle=False, num_workers=4)
val_dataset_stylegan = datasets.ImageFolder(root=f"{data_path_stylegan}", transform = imagenet_valid_transform())
val_loader_stylegan = torch.utils.data.DataLoader(val_dataset_stylegan, batch_size=50, shuffle=False, num_workers=4)
val_dataset_cat = datasets.ImageFolder(root=f"{data_path_cat}", transform = imagenet_valid_transform())
val_loader_cat = torch.utils.data.DataLoader(val_dataset_cat, batch_size=50, shuffle=False, num_workers=4)
val_dataset_dog = datasets.ImageFolder(root=f"{data_path_dog}", transform = imagenet_valid_transform())
val_loader_dog = torch.utils.data.DataLoader(val_dataset_dog, batch_size=50, shuffle=False, num_workers=4)
val_dataset_cutmix = datasets.ImageFolder(root=f"{data_path_cutmix}", transform = imagenet_valid_transform())
val_loader_cutmix = torch.utils.data.DataLoader(val_dataset_cutmix, batch_size=50, shuffle=False, num_workers=4)
#loader_box = {"default" : val_loader_default, "fsmr": val_loader_fsmr, "stylegan" : val_loader_stylegan, "cat": val_loader_cat, "dog" : val_loader_dog, "cutmix" : val_loader_cutmix}
loader_box = {"cutmix" : val_loader_cutmix}
# loss_fn = nn.CrossEntropyLoss().cuda()
model=model.to('cuda')
model.eval()
for loader_name, loader in loader_box.items():
for batch_idx, (img, target) in enumerate(loader):
img, target = img.to('cuda'), target.to('cuda')
with torch.no_grad():
#IN
output = model.conv1(img)
output = model.bn1(output)
output = model.relu(output)
output = model.maxpool(output)
output = model.layer1(output)
output = model.layer2(output)
output = model.layer3(output)
output = model.layer4(output)
output = model.avgpool(output)
out_list = output.squeeze().cpu().detach().numpy() if batch_idx ==0 else np.concatenate((out_list, output.squeeze().cpu().detach().numpy()), axis=0)
#IN
out_path = f'./result_npy/IN/'
if not os.path.isdir(out_path):
os.mkdir(out_path)
np.save(os.path.join(out_path,f'{loader_name}.npy'), out_list)
loader 두개 한번에 : zip 활용
for iter, ((cat,cat_label), (dog,dog_label)) in tqdm(enumerate(zip(val_loader_cat, val_loader_dog)), total = len(val_loader_cat)):
#if cat.shape[0] != 50 : break
lam = np.random.beta(1.0, 1.0) # 베타 분포에서 lam 값을 가져옵나다.
cat, dog = cat.to('cuda'), dog.to('cuda')
#import pdb; pdb.set_trace()
bbx1, bby1, bbx2, bby2 = rand_bbox((3, 256, 256), lam)
dog[:, :,bbx1:bbx2, bby1:bby2] = cat[:, :,bbx1:bbx2, bby1:bby2]
for i in range(50):
save_image(dog[i], os.path.join(out_dir, f'img{50*iter+i}.png'))