圖片數據一般有兩種情況:
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)