当前位置:网站首页>pytorch 自定义dataset
pytorch 自定义dataset
2022-08-09 02:54:00 【Mick..】
dataset的定义主要包含三个部分。__init__()初始化,这部分主要是初始化一下数据集的地址和相关变量,比如说patchsize的大小。__len__()这部分主要是用来检测数据集的大小的。__getitem__()方法是是通过所以获取数据集中的数据。在这一部分也经常会出现数据增强的处理。
import os
import numpy as np
from torch.utils.data import Dataset
import torch
from PIL import Image
import torchvision.transforms.functional as TF
import random
def is_image_file(filename):
return any(filename.endswith(extension) for extension in ['jpeg', 'JPEG', 'jpg', 'png', 'JPG', 'PNG', 'gif'])
class DatasetTrain(Dataset):
def __init__(self, dir1, patchsize=96):
super(DatasetTrain, self).__init__()
inp_files = sorted(os.listdir(os.path.join(dir1, 'input'))) ##获取全部图片的名称
tar_files = sorted(os.listdir(os.path.join(dir1, 'target')))
self.inp_filenames = [os.path.join(dir1, 'input', x) for x in inp_files if is_image_file(x)]##全部图片的绝对路径
self.tar_filenames = [os.path.join(dir1, 'target', x) for x in tar_files if is_image_file(x)]
self.ps = patchsize
def __len__(self):
return len(self.tar_filenames)
def __getitem__(self, index):
index_ = index % len(self.tar_filenames) ##这里是为了防止索引超出范围
ps = self.ps
inp_path = self.inp_filenames[index_]
tar_path = self.tar_filenames[index_]
inp_img = Image.open(inp_path)
tar_img = Image.open(tar_path)
w,h = tar_img.size
padw = ps-w if w<ps else 0 ###如果patchsize小于宽,则不需要填充。如果patchsize大于宽,则需要填充
padh = ps-h if h<ps else 0
# Reflect Pad in case image is smaller than patch_size
if padw!=0 or padh!=0:
inp_img = TF.pad(inp_img, (0,0,padw,padh), padding_mode='reflect')
tar_img = TF.pad(tar_img, (0,0,padw,padh), padding_mode='reflect')
inp_img = TF.to_tensor(inp_img)
tar_img = TF.to_tensor(tar_img)
hh, ww = tar_img.shape[1], tar_img.shape[2]
rr = random.randint(0, hh-ps)
cc = random.randint(0, ww-ps)
aug = random.randint(0, 8)
# 随机裁剪
inp_img = inp_img[:, rr:rr+ps, cc:cc+ps]
tar_img = tar_img[:, rr:rr+ps, cc:cc+ps]
#数据增强
if aug==1:
inp_img = inp_img.flip(1)
tar_img = tar_img.flip(1)
elif aug==2:
inp_img = inp_img.flip(2)
tar_img = tar_img.flip(2)
elif aug==3:
inp_img = torch.rot90(inp_img,dims=(1,2))
tar_img = torch.rot90(tar_img,dims=(1,2))
elif aug==4:
inp_img = torch.rot90(inp_img,dims=(1,2), k=2)
tar_img = torch.rot90(tar_img,dims=(1,2), k=2)
elif aug==5:
inp_img = torch.rot90(inp_img,dims=(1,2), k=3)
tar_img = torch.rot90(tar_img,dims=(1,2), k=3)
elif aug==6:
inp_img = torch.rot90(inp_img.flip(1),dims=(1,2))
tar_img = torch.rot90(tar_img.flip(1),dims=(1,2))
elif aug==7:
inp_img = torch.rot90(inp_img.flip(2),dims=(1,2))
tar_img = torch.rot90(tar_img.flip(2),dims=(1,2))
filename = os.path.splitext(os.path.split(tar_path)[-1])[0]
return tar_img, inp_img, filename
class DataLoaderVal(Dataset):
def __init__(self, rgb_dir, img_options=None, rgb_dir2=None):
super(DataLoaderVal, self).__init__()
inp_files = sorted(os.listdir(os.path.join(rgb_dir, 'input')))
tar_files = sorted(os.listdir(os.path.join(rgb_dir, 'target')))
self.inp_filenames = [os.path.join(rgb_dir, 'input', x) for x in inp_files if is_image_file(x)]
self.tar_filenames = [os.path.join(rgb_dir, 'target', x) for x in tar_files if is_image_file(x)]
self.img_options = img_options
self.sizex = len(self.tar_filenames) # get the size of target
self.ps = self.img_options['patch_size']
def __len__(self):
return self.sizex
def __getitem__(self, index):
index_ = index % self.sizex
ps = self.ps
inp_path = self.inp_filenames[index_]
tar_path = self.tar_filenames[index_]
inp_img = Image.open(inp_path)
tar_img = Image.open(tar_path)
# Validate on center crop
if self.ps is not None:
inp_img = TF.center_crop(inp_img, (ps,ps))
tar_img = TF.center_crop(tar_img, (ps,ps))
inp_img = TF.to_tensor(inp_img)
tar_img = TF.to_tensor(tar_img)
filename = os.path.splitext(os.path.split(tar_path)[-1])[0]
return tar_img, inp_img, filename
class DataLoaderTest(Dataset):
def __init__(self, inp_dir, img_options):
super(DataLoaderTest, self).__init__()
inp_files = sorted(os.listdir(inp_dir))
self.inp_filenames = [os.path.join(inp_dir, x) for x in inp_files if is_image_file(x)]
self.inp_size = len(self.inp_filenames)
self.img_options = img_options
def __len__(self):
return self.inp_size
def __getitem__(self, index):
path_inp = self.inp_filenames[index]
filename = os.path.splitext(os.path.split(path_inp)[-1])[0]
inp = Image.open(path_inp)
inp = TF.to_tensor(inp)
return inp, filename
边栏推荐
猜你喜欢
随机推荐
JS 实现千分位分隔符
20220528动态规划:最长递增子序列
Shell脚本:正则表达式
Linux安装Redis
lvs+keepalived高可用负载均衡集群
最近看到很多人想自学或者报班但是不清楚如何选择,我今天就和大家说说
20220523搜索和排序:搜索旋转排序数组
LintCode 146. 大小写转换 II
【机器学习】21天挑战赛学习笔记(三)
整数溢出机制 C
多御安全浏览安卓版升级尝鲜,新增下载管理功能
【信号去噪】基于Sage-Husa自适应卡尔曼滤波器实现海浪磁场噪声抑制及海浪磁场噪声的产生附matlab代码
20220529设计问题:二叉树的序列化与反序列化
1160. 拼写单词
SwiftUI * SwiftUI 4.0 全新的导航系统
一款免费的强大办公工具。
“蔚来杯“2022牛客暑期多校训练营7,签到题CFGJ
【元胞自动机】基于元胞自动机模拟社会力因素下的灾害人员疏散应急仿真附matlab代码
1261. 在受污染的二叉树中查找元素
SwiftUI * Grid