pytorch dataset实战案例之读取数据集的代码

目录
  • 概述
  • 项目结构与代码
  • 总结
  • 参考资料

概述

最近在跑一篇图像修复论文的代码,配置好环境之后开始运行,发现数据一直加载不进去。
害,还是得看人家代码咋写的,一句一句看逻辑,准能找出问题。通读dataset后,发现了问题所在,终于成功加载了数据集。

项目结构与代码

项目结构

主要的目的就是从数据集中读取到彩色图像和掩码图像。
代码
代码中涉及到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 = []    #创建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类必须实现的静态方法
        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)     #创建InpaintingData对象
    print(len(data), len(data.mask_path))   #输出data的长度,mask的长度
    img, mask, filename = data[0]   # 获取第一张图片
    print(img.size(), mask.size(), filename)    #打印上述信息

输出:

再Debug一下看:
如下图所示,执行玩加载数据的代码之后,已经成功获取到数据

总结

这段代码可以作为读取数据集的一个DataSet类的基础类,可以扩充进行修改,以后有类似需要可以拿过来修改。

参考资料

[1] https://github.com/researchmm/AOT-GAN-for-Inpainting

到此这篇关于pytorch dataset实战----读取数据集的文章就介绍到这了,更多相关pytorch 读取数据集内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • PyTorch 解决Dataset和Dataloader遇到的问题

    今天在使用PyTorch中Dataset遇到了一个问题.先看代码 class psDataset(Dataset): def __init__(self, x, y, transforms = None): super(Dataset, self).__init__() self.x = x self.y = y if transforms == None: self.transforms = Compose([Resize((224, 224)), ToTensor()]) else: sel

  • 解决pytorch load huge dataset(大数据加载)

    问题 最近用pytorch做实验时,遇到加载大量数据的问题.实验数据大小在400Gb,而本身机器的memory只有256Gb,显然无法将数据一次全部load到memory. 解决方法 首先自定义一个MyDataset继承torch.utils.data.Dataset,然后将MyDataset的对象feed in torch.utils.data.DataLoader()即可. MyDataset在__init__中声明一个文件对象,然后在__getitem__中缓慢读取数据,这样就不会一次把所

  • 关于Pytorch的MNIST数据集的预处理详解

    关于Pytorch的MNIST数据集的预处理详解 MNIST的准确率达到99.7% 用于MNIST的卷积神经网络(CNN)的实现,具有各种技术,例如数据增强,丢失,伪随机化等. 操作系统:ubuntu18.04 显卡:GTX1080ti python版本:2.7(3.7) 网络架构 具有4层的CNN具有以下架构. 输入层:784个节点(MNIST图像大小) 第一卷积层:5x5x32 第一个最大池层 第二卷积层:5x5x64 第二个最大池层 第三个完全连接层:1024个节点 输出层:10个节点(M

  • pytorch中的dataset用法详解

    目录 1.torch.utils.data 里面的dataset使用方法 2.torchvision.datasets的使用方法 用法1:使用官方数据集 用法2:ImageFolder通用的自己数据集加载器 1.torch.utils.data 里面的dataset使用方法 当我们继承了一个 Dataset类之后,我们需要重写 len 方法,该方法提供了dataset的大小: getitem 方法, 该方法支持从 0 到 len(self)的索引 from torch.utils.data im

  • PyTorch加载自己的数据集实例详解

    数据预处理在解决深度学习问题的过程中,往往需要花费大量的时间和精力. 数据处理的质量对训练神经网络来说十分重要,良好的数据处理不仅会加速模型训练, 更会提高模型性能.为解决这一问题,PyTorch提供了几个高效便捷的工具, 以便使用者进行数据处理或增强等操作,同时可通过并行化加速数据加载. 数据集存放大致有以下两种方式: (1)所有数据集放在一个目录下,文件名上附有标签名,数据集存放格式如下: root/cat_dog/cat.01.jpg root/cat_dog/cat.02.jpg ...

  • 手把手教你实现PyTorch的MNIST数据集

    概述 MNIST 包含 0~9 的手写数字, 共有 60000 个训练集和 10000 个测试集. 数据的格式为单通道 28*28 的灰度图. 获取数据 def get_data(): """获取数据""" # 获取测试集 train = torchvision.datasets.MNIST(root="./data", train=True, download=True, transform=torchvision.tran

  • pytorch dataset实战案例之读取数据集的代码

    目录 概述 项目结构与代码 总结 参考资料 概述 最近在跑一篇图像修复论文的代码,配置好环境之后开始运行,发现数据一直加载不进去.害,还是得看人家代码咋写的,一句一句看逻辑,准能找出问题.通读dataset后,发现了问题所在,终于成功加载了数据集. 项目结构与代码 项目结构 主要的目的就是从数据集中读取到彩色图像和掩码图像.代码代码中涉及到torch.transforms.合并路径等知识点,我在代码中都进行了详细的注释,路径要对照着项目结构,如果自己用的话要根据项目结构去将相对路径改过来.dat

  • Pytorch中使用ImageFolder读取数据集时忽略特定文件

    目录 一.使用ImageFolder读取数据集时忽略特定文件 二.ImageFolder只读取部分类别文件夹 一.使用ImageFolder读取数据集时忽略特定文件 如果事先知道需要忽略哪些文件,当然直接从数据集里删除就行了.但如果需要在程序运行时动态确认,或者筛选规则比较复杂,人工不好做,就需要让ImageFolder在读取时使用自定义的筛选规则. ImageFolder有一个可选参数为is_valid_file,参数类型为可调用的函数,该函数传入一个str参数,返回一个bool值.当返回值为

  • 使用pytorch读取数据集

    目录 pytorch读取数据集 第一种 第二种 第三种 pytorch学习记录 注意事项 pytorch读取数据集 使用pytorch读取数据集一般有三种情况 第一种 读取官方给的数据集,例如Imagenet,CIFAR10,MNIST等 这些库调用torchvision.datasets.XXXX()即可,例如想要读取MNIST数据集 import torch import torch.nn as nn import torch.utils.data as Data import torchv

  • pytorch加载语音类自定义数据集的方法教程

    前言 pytorch对一下常用的公开数据集有很方便的API接口,但是当我们需要使用自己的数据集训练神经网络时,就需要自定义数据集,在pytorch中,提供了一些类,方便我们定义自己的数据集合 torch.utils.data.Dataset:所有继承他的子类都应该重写  __len()__  , __getitem()__ 这两个方法 __len()__ :返回数据集中数据的数量 __getitem()__ :返回支持下标索引方式获取的一个数据 torch.utils.data.DataLoad

  • 使用pytorch进行图像的顺序读取方法

    产生此次实验的原因:当我使用pytorch进行神经网络的训练时,需要每次向CNN传入一组图像,并且这些图片的存放位置是在两个文件夹中: A文件夹:图片1a,图片2a,图片3a--图片1000a B文件夹:图片1b, 图片2b,图片3b--图片1000b 所以在每个循环里,我都希望能从A中取出图片Na,同时从B文件夹中取出对应的图片Nb. 测试一:通过pytorch官方文档中的dataloader搭配python中的迭代器iterator dataset = dset.ImageFolder( r

  • 使用 PyTorch 实现 MLP 并在 MNIST 数据集上验证方式

    简介 这是深度学习课程的第一个实验,主要目的就是熟悉 Pytorch 框架.MLP 是多层感知器,我这次实现的是四层感知器,代码和思路参考了网上的很多文章.个人认为,感知器的代码大同小异,尤其是用 Pytorch 实现,除了层数和参数外,代码都很相似. Pytorch 写神经网络的主要步骤主要有以下几步: 1 构建网络结构 2 加载数据集 3 训练神经网络(包括优化器的选择和 Loss 的计算) 4 测试神经网络 下面将从这四个方面介绍 Pytorch 搭建 MLP 的过程. 项目代码地址:la

  • pytorch加载自己的图像数据集实例

    之前学习深度学习算法,都是使用网上现成的数据集,而且都有相应的代码.到了自己开始写论文做实验,用到自己的图像数据集的时候,才发现无从下手 ,相信很多新手都会遇到这样的问题. 参考文章https://www.jb51.net/article/177613.htm 下面代码实现了从文件夹内读取所有图片,进行归一化和标准化操作并将图片转化为tensor.最后读取第一张图片并显示. # 数据处理 import os import torch from torch.utils import data fr

  • pytorch加载自己的图片数据集的2种方法详解

    目录 ImageFolder 加载数据集 使用pytorch提供的Dataset类创建自己的数据集. Dataset加载数据集 总结 pytorch加载图片数据集有两种方法. 1.ImageFolder 适合于分类数据集,并且每一个类别的图片在同一个文件夹, ImageFolder加载的数据集, 训练数据为文件件下的图片, 训练标签是对应的文件夹, 每个文件夹为一个类别 导入ImageFolder()包 from torchvision.datasets import ImageFolder 在

  • Python自动化办公实战案例详解(Word、Excel、Pdf、Email邮件)

    目录 背景 实现过程 1)替换Word模板生成对应邀请函 2)将Word邀请函转化为Pdf格式 4)自动发送邮件 5)完整代码 总结 背景 想象一下,现在你有一份Word邀请函模板,然后你有一份客户列表,上面有客户的姓名.联系方式.邮箱等基本信息,然后你的老板现在需要替换邀请函模板中的姓名,然后将Word邀请函模板生成Pdf格式,之后编辑统一的邀请话术(邮件正文),再依次发送邀请函附件到客户邮箱,你会怎么做? 正常情况下,我们肯定是复制粘贴Excel表格中的客户姓名,之后挨个Word文档进行替换

  • Python文件操作实战案例之用户登录

    目录 一.前言 二.案例:用户登录 1.案例分析 2.程序设计 2.1 main() 2.2 c_flag() 2.3 init() 2.4 print_login_menu() 2.5 user_select() 2.6 root_login() 2.7 user_register() 2.8 user_login() 3.功能演示 总结 一.前言 在上一小节,我们介绍了文件的基本操作以及数据交换的格式,为了巩固我们上一节文件操作的知识. 在这里我们做一个最基本的案例:用户登录 二.案例:用户

随机推荐