图片数据一般有两种情况:
1. 所有图片放在一个文件夹内,另外有一个txt文件显示标签。
2. 不同类别的图片放在不同的文件夹内,文件夹就是图片的类别。
今天写猫狗大战代码时就遇到了这样的错误,我一直把这两个概念搞混淆。总是把所有不同类别的图片放在同一个没有txt文件显示标签的文件夹中。编译器一直给我报错找不到文件,但是我按着目录找又总是能找到文件!!!!纠结
针对这两种不同的情况,数据集的准备不相同,第一种情况可以自定义一个Dataset,第二种情况直接调用torchvision.datasets.ImageFolder来处理。
所有图片放在一个文件夹内,另外有一个txt文件显示标签。
torch.utils.data.Dataset 是代表这一数据的抽象类,你可以自己定义你的数据类型继承和重写这个抽象类,非常简单,只需要定义_ len _ 和_ getitem _这两个函数即可:
class myDataset(Dataset):
def __init__(self,csv_file,txt_file,root_dir,other_file):
self.csv_data = pd.read_csv(csv_file)
with open(txt_file,'r') as f:
data_list = f.readlines()
self.txt_data = data_list
self.root_dir = root_dir
def __len__(self):
return len(self.csv_data)
def __getitem__(self,idx):
data = (self.csv_data[idx],self.txt_data[idx])
return data
通过以上方式,可以定义我们需要的数据类。
不同类别的图片放在不同的文件夹内,文件夹就是图片的类别。
在torchvision这个包中还有一个更高级的关于计算机视觉的数据读取类:ImageFolder,主要功能是处理图片,但是要求不同类别的图片放在不同的文件夹内,文件夹就是图片的类别。如官方给出的格式(不一定是.png,只要是图片类型都可以):
root/dog/xxx.png
root/dog/xxy.png
root/dog/xxz.png
root/cat/123.png
root/cat/nsdf3.png
root/cat/asd932_.png
之后按如下方式调用这个类:
dset.ImageFolder(root="root folder path", [transform, target_transform])
最后,通过torch.utils.data.DataLoaderl来定义一个新的迭代器,来实现取batch,shuffle或者是多线程读数据。
class torch.utils.data.DataLoader(dataset, batch_size=1, shuffle=False, sampler=None, num_workers=0, collate_fn=<function default_collate>, pin_memory=False, drop_last=False)