二、pytorch学习笔记之数据加载和处理

一 数据加载:

1.读取csv文件.csv文件一般为注释所在的文件,使用pandas包可以简单的解析出csv文件

import pandas as pd

landmarks_frame=pd.read_csv("faces/face_landmarks.csv'') #参数为csv文件所在的文件夹

2.对于读取到的注释信息可以做一定处理,一般第一列为图像名字,后面的列为图像中注释的具体信息

img_name=landmarks_frame.iloc[:,0]  # 读取第一列信息,若只需读取某一个图片,具体索引即可

landmarks=landmarks_frame.iloc[,1:].as_matrix()#以矩阵形式输出注释信息

landmarks=landmarks.astype('float').reshape(-1,2)#对注释信息的数据类型,shape修改为想要的

3.Dataset类,torch.utils.data.Dataset提供了抽象类Dataset,若想写一个新的数据集类。应该继承Dataset,且包含__len__()和__getitem__()以索引

示例:class FaceLandmarksDataset(Dataset):

                   def__init__(self,csv_file,root_dir,transform=None):#csv_file是csv文件所在路径,root_dir所有图片所在文件夹

                                self.landmarks_frame=pd.read_csv(csv_file)

                                self.root_dir=root_dir

                                self.transform=transform

                   def __len__(self):

                                return len(self.landmarks_frames)

                    def__getitem__(self,idx):

                                img_name=os.path.join(self.root_dir,self.landmarks_frame.iloc[idx,0])

                                image=io.read(img_name)

                                 landmarks=self.landmarks_frame.iloc[idx,1:].as_matrix()

                                 landmarks=landmarks.astype("float").reshape(-1,2)

                                 sample={'image':image,'landmarks':landmarks}

                                  if self.transform:

                                                sample=self.transform(sample)

                                    return sample

二数据处理:直接获得的处理一般不能瞒住后续需要,需要进行一定的转换,下面介绍几种转换功能

Rescale(output_size):若output_size为长度2的tuple,则直接将原图转换为output_size的尺寸,若ouput_size为单整数,则将原图转换为以output_size为最短边的等比例图

RandomCrop(output_size):随机剪取,随便在图中剪取一块以output_size为尺寸的生产图

ToTenor():将numpy类型(h,w,c)的图片转换为torch类型(c,h,w)的

可以将以上操作组合到一个函数中,调用时依次对传来的图片进操作

transform=transforms.Composed ([Rescale(256),RandomCrop(224),ToTensor()])

传入之前所定义的类中可以得到转换后的图片

上诉操作比较简单,但未涉及batch,shuffle等操作,利用torchvision中的DataLoader可以进一步处理数据

dataloader=DataLoader(transformed_dataset,batch_size=4,shffule=True,num_works=4)#具体参数自定义

三 torchvision:torchvision中提供了一些常用的数据集和转换函数,使用偷人才和vision时甚至不用自己写转换函数

示例:import torchvision import transforms,datasets

data_transform=transform.Compose([

                              transforms.RandomSizedCrop(224),

                              transforms.RandomHorizontalFlip(),

                              transforms.ToTensor()

                                transforms.Normalize(mead=[0.485,0.546,0.406],std=[0.229,0.224,0.225])]

hymenoptera_dataset=dataset.ImageFolder(root='hymenpptera_data/train',transform=data_transform)

dataset_loader=DataLoader(hymenoptera_dataset,batch_size=4,shuffle=True,num_works=4)

以上为从imagefolder中提取数据并进行转换,batch,shuffle等预处理的经典步骤

四、总结

数据集处理一般为以下三种情况:

1.对于torchvision提供的数据集,如Imagenet,CIFAR10,MINIST,连数据源都不需要自己下载,具体用法见以下示例

示例:transform=transform.Compose([transforms.ToTensor(),transforms.Normalize((0,0,0),(1,1,1))])

            trainset=torchvision.datasets.CIFAR10(ROOT='./data',train=True,download=True,transform-transform)

               #若为测试集,则train=False

             trainloader=torch.utils.data.Dataloader(trainset,batch_size=4,shuffle=True,num_workers=2)

2.对于特定结构的数据集可有ImageFolder加载,具体操作见三

3.一般数据集,完全由自己处理,具体操作见一二





猜你喜欢

转载自blog.csdn.net/qq_40103460/article/details/80332905