ABOUT ME

notou10@yonsei.ac.kr

Today
Yesterday
Total
  • pytorch dataloader
    카테고리 없음 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'))
Designed by Tistory.