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.一般数据集,完全由自己处理,具体操作见一二