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

主要的目的就是從數據集中讀取到彩色圖像和掩碼圖像。
代碼
代碼中涉及到torch.transforms、合并路徑等知識點,我在代碼中都進行了詳細的注釋,路徑要對照著項目結構,如果自己用的話要根據項目結構去將相對路徑改過來。dataset.py :當前的工作路徑:…\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的父類的初始化函數
self.w = self.h = args.image_size # 通過args傳入新的屬性---圖像的w和h
self.mask_type = args.mask_type # 通過args傳入新的屬性---mask_type
# image and mask
self.image_path = [] #創(chuàng)建image_path的數組
for ext in ['*.jpg', '*.png']: # 獲取每一個后綴為.jpg或者.png的圖片,為ext
# 將dir_image、data_train和ext拼接作為圖片的路徑,并將其存入到數組image_path之中,glob()獲取一個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([ #接收一個 transforms方法的list為參數,將這些操作組合到一起,返回一個新的tranforms
transforms.RandomResizedCrop(args.image_size), #隨機隨機長寬比裁剪,大小為image_size
transforms.RandomHorizontalFlip(), #隨機水平翻轉
transforms.ColorJitter(0.05, 0.05, 0.05, 0.05), #改變圖像的亮度、對比度、飽和度和色調。
transforms.ToTensor()]) # 轉為tensor,并歸一化至[0-1]
self.mask_trans = transforms.Compose([
transforms.Resize(args.image_size, interpolation=transforms.InterpolationMode.NEAREST), #將輸入圖像調整為給定的大小,interpolation是插值方式,此處是默認值NEAREST
transforms.RandomHorizontalFlip(), #隨機水平翻轉
transforms.RandomRotation( #隨機旋轉
(0, 45), interpolation=transforms.InterpolationMode.NEAREST), #(0, 45)是角度
])
def __len__(self): # __len__和__getitem__DataSet類必須實現(xiàn)的靜態(tài)方法
return len(self.image_path)
def __getitem__(self, index):
# load image
image = Image.open(self.image_path[index]).convert('RGB') #獲取圖像,并將其轉化為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)) #隨機從mask_path中獲取一個下標
mask = Image.open(self.mask_path[index]) #根據下標獲取mask圖片
mask = mask.convert('L') #將mask圖片轉化為L(8位像素的黑白圖片,0表示黑,255表示白)模式
else: # 構造mask,有mask數據集的話就運行不到這里
mask = np.zeros((self.h, self.w)).astype(np.uint8) #構造與h和w一樣大的圖片,都用0填充,并將其轉換為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. # 數據標準化,將輸出限定在一定的范圍
mask = F.to_tensor(self.mask_trans(mask)) # 將轉化后的mask圖像轉化為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) # 將上面定義的參數傳入AttrDict()作為新參數
data = InpaintingData(args) #創(chuàng)建InpaintingData對象
print(len(data), len(data.mask_path)) #輸出data的長度,mask的長度
img, mask, filename = data[0] # 獲取第一張圖片
print(img.size(), mask.size(), filename) #打印上述信息
輸出:

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

總結
這段代碼可以作為讀取數據集的一個DataSet類的基礎類,可以擴充進行修改,以后有類似需要可以拿過來修改。
參考資料
[1] https://github.com/researchmm/AOT-GAN-for-Inpainting
到此這篇關于pytorch dataset實戰(zhàn)----讀取數據集的文章就介紹到這了,更多相關pytorch 讀取數據集內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
python爬取企查查企業(yè)信息之selenium自動模擬登錄企查查
這篇文章主要介紹了python爬取企查查企業(yè)信息之自動模擬登錄企查查以及selenium獲取headers,selenium獲取cookie,需要的朋友可以參考下2021-04-04
Windows和夜神模擬器上抓包程序mitmproxy的安裝使用詳解
mitmproxy是一個支持HTTP和HTTPS的抓包程序,有類似Fiddler、Charles的功能,只不過它是一個控制臺的形式操作,這篇文章主要介紹了Windows和夜神模擬器上抓包程序mitmproxy的安裝使用詳解,需要的朋友可以參考下2022-10-10
Python Pillow Image.save 保存為jpg圖片壓縮問題
Pillow 庫支持多種圖片格式,Pillow 能夠很輕松地實現(xiàn)圖片格式之間的轉換。本文就來詳細的介紹一下Image.save的具體使用,感興趣的可以了解一下2021-11-11
Linux下Pycharm、Anaconda環(huán)境配置及使用踩坑
這篇文章主要介紹了Linux下Pycharm、Anaconda環(huán)境配置及使用踩坑,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-12-12
Python中報錯 “TypeError: ‘list‘ object is&n
這篇文章主要介紹了Python中報錯 “TypeError: ‘list‘ object is not callable”問題及解決方案,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-09-09
詳解用python實現(xiàn)基本的學生管理系統(tǒng)(文件存儲版)(python3)
這篇文章主要介紹了python實現(xiàn)基本的學生管理系統(tǒng),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2019-04-04

