pytorch?dataset實(shí)戰(zhàn)案例之讀取數(shù)據(jù)集的代碼
概述
最近在跑一篇圖像修復(fù)論文的代碼,配置好環(huán)境之后開(kāi)始運(yùn)行,發(fā)現(xiàn)數(shù)據(jù)一直加載不進(jìn)去。
害,還是得看人家代碼咋寫(xiě)的,一句一句看邏輯,準(zhǔn)能找出問(wèn)題。通讀dataset后,發(fā)現(xiàn)了問(wèn)題所在,終于成功加載了數(shù)據(jù)集。
項(xiàng)目結(jié)構(gòu)與代碼
項(xiàng)目結(jié)構(gòu)

主要的目的就是從數(shù)據(jù)集中讀取到彩色圖像和掩碼圖像。
代碼
代碼中涉及到torch.transforms、合并路徑等知識(shí)點(diǎn),我在代碼中都進(jìn)行了詳細(xì)的注釋?zhuān)窂揭獙?duì)照著項(xiàng)目結(jié)構(gòu),如果自己用的話(huà)要根據(jù)項(xiàng)目結(jié)構(gòu)去將相對(duì)路徑改過(guò)來(lái)。dataset.py :當(dāng)前的工作路徑:…\OT-GAN-for-Inpainting-master\src\data
import os
import math
import numpy as np
from glob import glob
from random import shuffle
from PIL import Image, ImageFilter
import torch
import torchvision.transforms.functional as F
import torchvision.transforms as transforms
from torch.utils.data import Dataset, DataLoader
class InpaintingData(Dataset):
def __init__(self, args):
super(Dataset, self).__init__() # 繼承Dataset的父類(lèi)的初始化函數(shù)
self.w = self.h = args.image_size # 通過(guò)args傳入新的屬性---圖像的w和h
self.mask_type = args.mask_type # 通過(guò)args傳入新的屬性---mask_type
# image and mask
self.image_path = [] #創(chuàng)建image_path的數(shù)組
for ext in ['*.jpg', '*.png']: # 獲取每一個(gè)后綴為.jpg或者.png的圖片,為ext
# 將dir_image、data_train和ext拼接作為圖片的路徑,并將其存入到數(shù)組image_path之中,glob()獲取一個(gè)lsit集合
self.image_path.extend(glob(os.path.join(args.dir_image, args.data_train, ext)))
self.mask_path = glob(os.path.join(args.dir_mask, args.mask_type, '*.png')) #拼接dir_mask、mask_type和路徑下所有的.png作為mask_path
# augmentation
self.img_trans = transforms.Compose([ #接收一個(gè) transforms方法的list為參數(shù),將這些操作組合到一起,返回一個(gè)新的tranforms
transforms.RandomResizedCrop(args.image_size), #隨機(jī)隨機(jī)長(zhǎng)寬比裁剪,大小為image_size
transforms.RandomHorizontalFlip(), #隨機(jī)水平翻轉(zhuǎn)
transforms.ColorJitter(0.05, 0.05, 0.05, 0.05), #改變圖像的亮度、對(duì)比度、飽和度和色調(diào)。
transforms.ToTensor()]) # 轉(zhuǎn)為tensor,并歸一化至[0-1]
self.mask_trans = transforms.Compose([
transforms.Resize(args.image_size, interpolation=transforms.InterpolationMode.NEAREST), #將輸入圖像調(diào)整為給定的大小,interpolation是插值方式,此處是默認(rèn)值NEAREST
transforms.RandomHorizontalFlip(), #隨機(jī)水平翻轉(zhuǎn)
transforms.RandomRotation( #隨機(jī)旋轉(zhuǎn)
(0, 45), interpolation=transforms.InterpolationMode.NEAREST), #(0, 45)是角度
])
def __len__(self): # __len__和__getitem__DataSet類(lèi)必須實(shí)現(xiàn)的靜態(tài)方法
return len(self.image_path)
def __getitem__(self, index):
# load image
image = Image.open(self.image_path[index]).convert('RGB') #獲取圖像,并將其轉(zhuǎn)化為RGB(3x8位像素)模式
filename = os.path.basename(self.image_path[index]) #獲取圖片的路徑
if self.mask_type == 'pconv': #如果mask_type為pconv
index = np.random.randint(0, len(self.mask_path)) #隨機(jī)從mask_path中獲取一個(gè)下標(biāo)
mask = Image.open(self.mask_path[index]) #根據(jù)下標(biāo)獲取mask圖片
mask = mask.convert('L') #將mask圖片轉(zhuǎn)化為L(zhǎng)(8位像素的黑白圖片,0表示黑,255表示白)模式
else: # 構(gòu)造mask,有mask數(shù)據(jù)集的話(huà)就運(yùn)行不到這里
mask = np.zeros((self.h, self.w)).astype(np.uint8) #構(gòu)造與h和w一樣大的圖片,都用0填充,并將其轉(zhuǎn)換為uint8
mask[self.h // 4:self.h // 4 * 3, self.w // 4:self.w // 4 * 3] = 1
mask = Image.fromarray(m).convert('L')
# augment
image = self.img_trans(image) * 2. - 1. # 數(shù)據(jù)標(biāo)準(zhǔn)化,將輸出限定在一定的范圍
mask = F.to_tensor(self.mask_trans(mask)) # 將轉(zhuǎn)化后的mask圖像轉(zhuǎn)化為tensor
return image, mask, filename #返回
if __name__ == '__main__':
from attrdict import AttrDict
args = {
'dir_image': '../../examples/logos',
'data_train': 'image',
'dir_mask': '../../examples/logos/mask',
'mask_type': 'pconv',
'image_size': 512
}
args = AttrDict(args) # 將上面定義的參數(shù)傳入AttrDict()作為新參數(shù)
data = InpaintingData(args) #創(chuàng)建InpaintingData對(duì)象
print(len(data), len(data.mask_path)) #輸出data的長(zhǎng)度,mask的長(zhǎng)度
img, mask, filename = data[0] # 獲取第一張圖片
print(img.size(), mask.size(), filename) #打印上述信息
輸出:

再Debug一下看:
如下圖所示,執(zhí)行玩加載數(shù)據(jù)的代碼之后,已經(jīng)成功獲取到數(shù)據(jù)

總結(jié)
這段代碼可以作為讀取數(shù)據(jù)集的一個(gè)DataSet類(lèi)的基礎(chǔ)類(lèi),可以擴(kuò)充進(jìn)行修改,以后有類(lèi)似需要可以拿過(guò)來(lái)修改。
參考資料
[1] https://github.com/researchmm/AOT-GAN-for-Inpainting
到此這篇關(guān)于pytorch dataset實(shí)戰(zhàn)----讀取數(shù)據(jù)集的文章就介紹到這了,更多相關(guān)pytorch 讀取數(shù)據(jù)集內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
不可錯(cuò)過(guò)的十本Python好書(shū)
不可錯(cuò)過(guò)的十本Python好書(shū),分別適合入門(mén)、進(jìn)階到精深三個(gè)不同階段的人來(lái)閱讀,感興趣的小伙伴們可以參考一下2017-07-07
python的pyecharts繪制各種圖表詳細(xì)(附代碼)
這篇文章主要介紹了python的pyecharts繪制各種圖表詳細(xì)(附代碼),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-11-11
python熱力圖實(shí)現(xiàn)的完整實(shí)例
熱力圖的使用場(chǎng)景有描述數(shù)據(jù)在空間的密集程度,常見(jiàn)有城市熱力圖、區(qū)域熱力圖,描述多個(gè)變量之間相關(guān)性高低程度,這篇文章主要給大家介紹了關(guān)于python熱力圖實(shí)現(xiàn)的相關(guān)資料,需要的朋友可以參考下2022-06-06
Python爬蟲(chóng)實(shí)戰(zhàn)JS逆向AES逆向加密爬取
一個(gè)建筑行業(yè)的堂哥為了搞一些商業(yè)數(shù)據(jù)前前后后花了1w,辣條我半個(gè)小時(shí)就能解決的事情,這就是技術(shù)的魅力!聲明:爬取是的公開(kāi)數(shù)據(jù)2021-10-10
python 實(shí)現(xiàn)的車(chē)牌識(shí)別項(xiàng)目
這篇文章主要介紹了python 實(shí)現(xiàn)的車(chē)牌識(shí)別項(xiàng)目,幫助大家更好的理解和使用python,感興趣的朋友可以了解下2021-01-01
python利用opencv實(shí)現(xiàn)顏色檢測(cè)
這篇文章主要為大家詳細(xì)介紹了python利用opencv實(shí)現(xiàn)顏色檢測(cè),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-02-02
Python的信號(hào)庫(kù)Blinker用法詳解
在本篇文章里小編給大家整理了一篇關(guān)于Python的信號(hào)庫(kù)Blinker用法詳解內(nèi)容,有興趣的朋友們可以學(xué)習(xí)下。2020-12-12

