1. 程式人生 > 程式設計 >pytorch torchvision.ImageFolder的用法介紹

pytorch torchvision.ImageFolder的用法介紹

torchvision.datasets

Datasets 擁有以下API:

__getitem__

__len__

Datasets都是 torch.utils.data.Dataset的子類,所以,他們也可以通過torch.utils.data.DataLoader使用多執行緒(python的多程序)。

舉例說明:

torch.utils.data.DataLoader(coco_cap,batch_size=args.batchSize,shuffle=True,num_workers=args.nThreads)

在建構函式中,不同的資料集直接的建構函式會有些許不同,但是他們共同擁有 keyword 引數。

transform: 一個函式,原始圖片作為輸入,返回一個轉換後的圖片。

target_transform - 一個函式,輸入為target,輸出對其的轉換。例子,輸入的是圖片標註的string,輸出為word的索引。

ImageFolder

一個通用的資料載入器,資料集中的資料以以下方式組織

root/dog/xxx.png
root/dog/xxy.png
root/dog/xxz.png

root/cat/123.png
root/cat/nsdf3.png
root/cat/asd932_.png

既其預設你的資料集已經自覺按照要分配的型別分成了不同的資料夾,一種型別的資料夾下面只存放一種型別的圖片

執行命令為:

import torchvision.datasets as dset

dset.ImageFolder(root="root folder path",[transform,target_transform])

root : 指定圖片儲存的路徑,在下面的例子中是'./data/dogcat_2'

transform: 一個函式,原始圖片作為輸入,返回一個轉換後的圖片。

target_transform - 一個函式,輸入為target,輸出對其的轉換。例子,輸入的是圖片標註的string,輸出為word的索引。

有以下成員變數:

self.classes - 用一個list儲存 類名

self.class_to_idx - 類名對應的 索引

self.imgs - 儲存(img-path,class) tuple的list

即後面可以通過檢視返回的資料集物件來檢視相應的值,下面舉例說明:

圖片為:

pytorch torchvision.ImageFolder的用法介紹

可見分成了cat和dog兩類

import torchvision.datasets as dset
dataset = dset.ImageFolder('./data/dogcat_2') #沒有transform,先看看取得的原始影象資料
print(dataset.classes) #根據分的資料夾的名字來確定的類別
print(dataset.class_to_idx) #按順序為這些類別定義索引為0,1...
print(dataset.imgs) #返回從所有資料夾中得到的圖片的路徑以及其類別

返回:

['cat','dog']
{'cat': 0,'dog': 1}
[('./data/dogcat_2/cat/cat.12484.jpg',0),('./data/dogcat_2/cat/cat.12485.jpg',('./data/dogcat_2/cat/cat.12486.jpg',('./data/dogcat_2/cat/cat.12487.jpg',('./data/dogcat_2/dog/dog.12496.jpg',1),('./data/dogcat_2/dog/dog.12497.jpg',('./data/dogcat_2/dog/dog.12498.jpg',('./data/dogcat_2/dog/dog.12499.jpg',1)]

如果在資料下面又添加了一個型別'others',那麼訪問型別的時候返回的就是:

['cat','dog','others']
{'cat': 0,'dog': 1,'others': 2}

檢視得到的圖片資料:

#從返回結果可見得到的資料仍是PIL Image物件
print(dataset[0])
print(dataset[0][0])
print(dataset[0][1]) #得到的是類別0,即cat

返回:

(<PIL.Image.Image image mode=RGB size=497x500 at 0x11D99A9B0>,0)
<PIL.Image.Image image mode=RGB size=497x500 at 0x11DD24278>
0

然後定義一個對資料進行處理的transform:

#可以看出來此時得到的圖片資料已經是處理過後的tensor資料了
print(dataset[0][0])
print(dataset[0][0].size()) #大小也是經過設定後的大小224
print(dataset[0][1]) #得到的是類別0,即cat

返回:

tensor([[[-0.7412,-0.7490,-0.7725,...,0.3176,0.3412,0.3725],[-0.7333,-0.7412,-0.7882,0.3255,0.3647,0.4039],[-0.7098,-0.7569,-0.8039,0.3725,[ 0.3961,0.3961,0.4039,0.2627,0.2549],[ 0.4196,0.4118,0.2549,0.2392,0.2314],[ 0.4275,0.4275,0.4431,0.2314,0.2235]],[[-0.7412,0.3882,0.3569],0.3882],[ 0.0431,0.0510,0.0667,-0.0824,-0.0902],[ 0.0510,0.0431,0.0588,-0.1059,-0.1137],[ 0.0353,0.0353,-0.0902,-0.1216]],[[-0.8353,-0.8431,-0.8667,0.3255],[-0.8196,-0.8275,-0.8824,0.3333,0.3490,[-0.7804,-0.8353,0.3569,[-0.2863,-0.2784,-0.2627,-0.3569,-0.3647],[-0.2549,-0.2706,-0.2549,-0.3804,-0.3882],[-0.2235,-0.2471,-0.2392,-0.4039]]])
torch.Size([3,224,224])

以上這篇pytorch torchvision.ImageFolder的用法介紹就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支援我們。