Pytorch關於Dataset 的數據處理

Pytorch系列是瞭解與使用Pytorch編程來實現卷積神經網絡。

學習如何對卷積神經網絡編程;首先,需要瞭解Pytorch對數據的使用(也是在我們模型流程中對數據的預處理部分),其中有兩個包Dataset,DataLoaderDatasetPytorch對於單個數據的處理類似於給一堆數據進行編號,(在有標簽的圖像處理中)對其有序地提取圖像與標簽,
DataLoader則是一坨一坨的數據進行批次的處理。

此實驗運用的數據是北郵鄧偉洪老師的人臉表情包的數據集,

當然大傢也可以自己手動做個二分類數據集之類的就將一幅幅的圖片放圖標簽命名的文件夾中即可。

將鄧偉洪老師的RAF-DB簡單來刨析,假設其隻有Image,沒有真正的Annotation等,
則其根路徑(整個data的大體位置)設為 root_dir = "D:\data\basic"
(由於以下考慮瞭Annotation,”Image“放入label)標簽路徑(data下的label位置)設為label_dir="Image\aligned(original)"

可參考下圖理解:

在這裡插入圖片描述

假設alignedoriginal是標簽,但是它是真正的圖片的路徑

在這裡插入圖片描述

在這裡插入圖片描述

 現在開始編程:

因為使用Dataset,即讓新的類(MyData)來繼承Dataset需要改寫 def __getitem__(self,item):def __len__(self):
其中, def __getitem__ (self,item):輸入一系列圖像的path與圖像的index(組合為一張圖像的詳細地址),輸出圖像與標簽,代碼中默認item為序列號,但是為瞭方便將item改寫為idx;
def __len__(self):輸入一系列圖像的路徑,輸出這些圖像的個數。
其他的函數就可以創新加載自己定義的類裡。

from torch.utils.data import Dataset #Dataset的包
import os #路徑需要這個
import cv2 # 需要讀取圖片,最好用opencv-python,當然也可以用PIL隻是我不順手


class MyData(Dataset): #我定義的這個類
    def __init__(self, root_dir, label_dir):
     #下面需要使用的變量,在__init__定義好,
        self.root_dir = root_dir # 根路徑 data在電腦或者服務器大致的位置
        self.label_dir = label_dir # label的位置(這裡假設Image的名字就是label的位置)
        self.path = os.path.join(self.root_dir, self.label_dir)# 將這個兩個合在一起就能找到整體圖片的大致路徑
        self.img_path = os.listdir(self.path) #得到整體圖片的路徑(可取其中的一張一張的圖像的名字)

    def __getitem__(self, idx): 
    # 改寫__getitem__(self,item)函數,最後得到圖像,標簽
      #獲取具體的一幅圖像的名字
        img_name = self.img_path[idx]
        #獲取一幅圖像的詳細地址
        img_item_path = os.path.join(self.root_dir, self.label_dir, img_name)
        #用opencv來讀取圖像
        img = cv2.imread(img_item_path)
        #獲取標簽(這裡簡單寫瞭aligned與original)
        label = self.label_dir
        return img, label

    def __len__(self):
    #改寫整體圖像的大小
        return len(self.img_path)


root_dir = "D://data//basic"
img_dir = "Image"
aligned_label_dir = "aligned"
# aligned_label_dir = "Image//aligned"
aligned_label_dir = os.path.join(img_dir, aligned_label_dir)

original_label_dir = "original"
#original_label_dir = "Image//original"
original_label_dir = os.path.join(img_dir, original_label_dir)

#aligned_data = "D://data//basic//Image//aligned"
aligned_data = MyData(root_dir, aligned_label_dir)
#original_data = "D://data//basic//Image//original"
original_data = MyData(root_dir, original_label_dir)
data = aligned_data + original_data
# 15339
print(len(aligned_data))
# 15339
print(len(original_data))
# 30678
print(len(data))
img_1, label_1 = data[15338]
img_2, label_2 = data[15339]
print(label_1) # Image\aligned
print(label_2) # Image\original

推薦閱讀: