pytorch torchvision.ImageFolder的使用

參考:https://pytorch-cn.readthedocs.io/zh/latest/torchvision/torchvision-datasets/python

torchvision.datasets

Datasets 擁有如下API:多線程

  • __getitem__ 
  • __len__

Datasets都是 torch.utils.data.Dataset的子類,因此,他們也能夠經過torch.utils.data.DataLoader使用多線程(python的多進程)。函數

舉例說明: spa

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

在構造函數中,不一樣的數據集直接的構造函數會有些許不一樣,可是他們共同擁有 keyword 參數。線程

  • transform: 一個函數,原始圖片做爲輸入,返回一個轉換後的圖片。
  • target_transform - 一個函數,輸入爲target,輸出對其的轉換。例子,輸入的是圖片標註的string,輸出爲word的索引。

 

ImageFolder

一個通用的數據加載器,數據集中的數據以如下方式組織code

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

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

既其默認你的數據集已經自覺按照要分配的類型分紅了不一樣的文件夾,一種類型的文件夾下面只存放一種類型的圖片orm

運行命令爲:對象

import torchvision.datasets as dset
dset.ImageFolder(root="root folder path", [transform, target_transform])
  • root : 指定圖片存儲的路徑,在下面的例子中是'./data/dogcat_2'
  • transform: 一個函數,原始圖片做爲輸入,返回一個轉換後的圖片。
  • target_transform - 一個函數,輸入爲target,輸出對其的轉換。例子,輸入的是圖片標註的string,輸出爲word的索引。

有如下成員變量:blog

  • self.classes - 用一個list保存 類名
  • self.class_to_idx - 類名對應的 索引
  • self.imgs - 保存(img-path, class) tuple的list
即後面能夠經過查看返回的數據集對象來查看相應的值,下面舉例說明:
 
圖片爲:

可見分紅了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', 0), ('./data/dogcat_2/cat/cat.12486.jpg', 0), ('./data/dogcat_2/cat/cat.12487.jpg', 0), ('./data/dogcat_2/dog/dog.12496.jpg', 1), ('./data/dogcat_2/dog/dog.12497.jpg', 1), ('./data/dogcat_2/dog/dog.12498.jpg', 1), ('./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.3255,  0.3725,  0.4039],
         ...,
         [ 0.3961,  0.3961,  0.4039,  ...,  0.2627,  0.2627,  0.2549],
         [ 0.4196,  0.4039,  0.4118,  ...,  0.2549,  0.2392,  0.2314],
         [ 0.4275,  0.4275,  0.4431,  ...,  0.2314,  0.2314,  0.2235]],

        [[-0.7412, -0.7490, -0.7725,  ...,  0.3882,  0.3725,  0.3569],
         [-0.7333, -0.7412, -0.7882,  ...,  0.3961,  0.3961,  0.3882],
         [-0.7098, -0.7569, -0.8039,  ...,  0.3882,  0.4039,  0.3882],
         ...,
         [ 0.0431,  0.0510,  0.0667,  ..., -0.0824, -0.0824, -0.0902],
         [ 0.0510,  0.0431,  0.0588,  ..., -0.0824, -0.1059, -0.1137],
         [ 0.0353,  0.0353,  0.0510,  ..., -0.0902, -0.1059, -0.1216]],

        [[-0.8353, -0.8431, -0.8667,  ...,  0.3255,  0.3255,  0.3255],
         [-0.8196, -0.8275, -0.8824,  ...,  0.3333,  0.3490,  0.3569],
         [-0.7804, -0.8353, -0.8667,  ...,  0.3333,  0.3569,  0.3569],
         ...,
         [-0.2863, -0.2784, -0.2627,  ..., -0.3569, -0.3569, -0.3647],
         [-0.2549, -0.2706, -0.2549,  ..., -0.3569, -0.3804, -0.3882],
         [-0.2235, -0.2471, -0.2392,  ..., -0.3569, -0.3804, -0.4039]]])
torch.Size([3, 224, 224])
0
 
相關文章
相關標籤/搜索