您好,登錄后才能下訂單哦!
以讀取VOC2012語義分割數據集為例,具體見代碼注釋:
VocDataset.py
from PIL import Image import torch import torch.utils.data as data import numpy as np import os import torchvision import torchvision.transforms as transforms import time #VOC數據集分類對應顏色標簽 VOC_COLORMAP = [[0, 0, 0], [128, 0, 0], [0, 128, 0], [128, 128, 0], [0, 0, 128], [128, 0, 128], [0, 128, 128], [128, 128, 128], [64, 0, 0], [192, 0, 0], [64, 128, 0], [192, 128, 0], [64, 0, 128], [192, 0, 128], [64, 128, 128], [192, 128, 128], [0, 64, 0], [128, 64, 0], [0, 192, 0], [128, 192, 0], [0, 64, 128]] #顏色標簽空間轉到序號標簽空間,就他媽這里浪費巨量的時間,這里還他媽的有問題 def voc_label_indices(colormap, colormap2label): """Assign label indices for Pascal VOC2012 Dataset.""" idx = ((colormap[:, :, 2] * 256 + colormap[ :, :,1]) * 256+ colormap[:, :,0]) #out = np.empty(idx.shape, dtype = np.int64) out = colormap2label[idx] out=out.astype(np.int64)#數據類型轉換 end = time.time() return out class MyDataset(data.Dataset):#創建自定義的數據讀取類 def __init__(self, root, is_train, crop_size=(320,480)): self.rgb_mean =(0.485, 0.456, 0.406) self.rgb_std = (0.229, 0.224, 0.225) self.root=root self.crop_size=crop_size images = []#創建空列表存文件名稱 txt_fname = '%s/ImageSets/Segmentation/%s' % (root, 'train.txt' if is_train else 'val.txt') with open(txt_fname, 'r') as f: self.images = f.read().split() #數據名稱整理 self.files = [] for name in self.images: img_file = os.path.join(self.root, "JPEGImages/%s.jpg" % name) label_file = os.path.join(self.root, "SegmentationClass/%s.png" % name) self.files.append({ "img": img_file, "label": label_file, "name": name }) self.colormap2label = np.zeros(256**3) #整個循環的意思就是將顏色標簽映射為單通道的數組索引 for i, cm in enumerate(VOC_COLORMAP): self.colormap2label[(cm[2] * 256 + cm[1]) * 256 + cm[0]] = i #按照索引讀取每個元素的具體內容 def __getitem__(self, index): datafiles = self.files[index] name = datafiles["name"] image = Image.open(datafiles["img"]) label = Image.open(datafiles["label"]).convert('RGB')#打開的是PNG格式的圖片要轉到rgb的格式下,不然結果會比較要命 #以圖像中心為中心截取固定大小圖像,小于固定大小的圖像則自動填0 imgCenterCrop = transforms.Compose([ transforms.CenterCrop(self.crop_size), transforms.ToTensor(), transforms.Normalize(self.rgb_mean, self.rgb_std),#圖像數據正則化 ]) labelCenterCrop = transforms.CenterCrop(self.crop_size) cropImage=imgCenterCrop(image) croplabel=labelCenterCrop(label) croplabel=torch.from_numpy(np.array(croplabel)).long()#把標簽數據類型轉為torch #將顏色標簽圖轉為序號標簽圖 mylabel=voc_label_indices(croplabel, self.colormap2label) return cropImage,mylabel #返回圖像數據長度 def __len__(self): return len(self.files)
Train.py
import matplotlib.pyplot as plt import torch.utils.data as data import torchvision.transforms as transforms import numpy as np from PIL import Image from VocDataset import MyDataset #VOC數據集分類對應顏色標簽 VOC_COLORMAP = [[0, 0, 0], [128, 0, 0], [0, 128, 0], [128, 128, 0], [0, 0, 128], [128, 0, 128], [0, 128, 128], [128, 128, 128], [64, 0, 0], [192, 0, 0], [64, 128, 0], [192, 128, 0], [64, 0, 128], [192, 0, 128], [64, 128, 128], [192, 128, 128], [0, 64, 0], [128, 64, 0], [0, 192, 0], [128, 192, 0], [0, 64, 128]] root='../data/VOCdevkit/VOC2012' train_data=MyDataset(root,True) trainloader = data.DataLoader(train_data, 4) #從數據集中拿出一個批次的數據 for i, data in enumerate(trainloader): getimgs, labels= data img = transforms.ToPILImage()(getimgs[0]) labels = labels.numpy()#tensor轉numpy labels=labels[0]#獲得批次標簽集中的一張標簽圖像 labels = labels.transpose((1,0))#數組維度切換,將第1維換到第0維,第0維換到第1維 ##將單通道索引標簽圖片映射回顏色標簽圖片 newIm= Image.new('RGB', (480, 320))#創建一張與標簽大小相同的圖片,用以顯示標簽所對應的顏色 for i in range(0, 480): for j in range(0, 320): sele=labels[i][j]#取得坐標點對應像素的值 newIm.putpixel((i, j), (int(VOC_COLORMAP[sele][0]), int(VOC_COLORMAP[sele][1]), int(VOC_COLORMAP[sele][2]))) #顯示圖像和標簽 plt.figure("image") ax1 = plt.subplot(1,2,1) ax2 = plt.subplot(1,2,2) plt.sca(ax1) plt.imshow(img) plt.sca(ax2) plt.imshow(newIm) plt.show()
以上這篇Pytorch 實現數據集自定義讀取就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持億速云。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。