当前位置: 首页 > news >正文

pytorch torchvision.ImageFolder的使用

参考:https://pytorch-cn.readthedocs.io/zh/latest/torchvision/torchvision-datasets/

torchvision.datasets

Datasets 拥有以下API:

  • __getitem__ 
  • __len__

Datasets都是 torch.utils.data.Dataset的子类,所以,他们也可以通过torch.utils.data.DataLoader使用多线程(python的多进程)。

举例说明: 

torch.utils.data.DataLoader(coco_cap, batch_size=args.batchSize, shuffle=True, num_workers=args.nThreads)

在构造函数中,不同的数据集直接的构造函数会有些许不同,但是他们共同拥有 keyword 参数。

  • transform: 一个函数,原始图片作为输入,返回一个转换后的图片。
  • target_transform - 一个函数,输入为target,输出对其的转换。例子,输入的是图片标注的string,输出为word的索引。

 

ImageFolder

一个通用的数据加载器,数据集中的数据以以下方式组织

root/dog/xxx.png
root/dog/xxy.png
root/dog/xxz.png

root/cat/123.png
root/cat/nsdf3.png
root/cat/asd932_.png

既其默认你的数据集已经自觉按照要分配的类型分成了不同的文件夹,一种类型的文件夹下面只存放一种类型的图片

运行命令为:

import torchvision.datasets as dset
dset.ImageFolder(root="root folder path", [transform, target_transform])
  • root : 指定图片存储的路径,在下面的例子中是'./data/dogcat_2'
  • transform: 一个函数,原始图片作为输入,返回一个转换后的图片。
  • target_transform - 一个函数,输入为target,输出对其的转换。例子,输入的是图片标注的string,输出为word的索引。

有以下成员变量:

  • self.classes - 用一个list保存 类名
  • self.class_to_idx - 类名对应的 索引
  • self.imgs - 保存(img-path, class) tuple的list
即后面可以通过查看返回的数据集对象来查看相应的值,下面举例说明:
 
图片为:

可见分成了cat和dog两类

import torchvision.datasets as dset
dataset = dset.ImageFolder('./data/dogcat_2') #没有transform,先看看取得的原始图像数据
print(dataset.classes)  #根据分的文件夹的名字来确定的类别
print(dataset.class_to_idx) #按顺序为这些类别定义索引为0,1...
print(dataset.imgs) #返回从所有文件夹中得到的图片的路径以及其类别

返回:

['cat', 'dog']
{'cat': 0, 'dog': 1}
[('./data/dogcat_2/cat/cat.12484.jpg', 0), ('./data/dogcat_2/cat/cat.12485.jpg', 0), ('./data/dogcat_2/cat/cat.12486.jpg', 0), ('./data/dogcat_2/cat/cat.12487.jpg', 0), ('./data/dogcat_2/dog/dog.12496.jpg', 1), ('./data/dogcat_2/dog/dog.12497.jpg', 1), ('./data/dogcat_2/dog/dog.12498.jpg', 1), ('./data/dogcat_2/dog/dog.12499.jpg', 1)]

如果在数据下面又添加了一个类型'others',那么访问类型的时候返回的就是:

['cat', 'dog', 'others']
{'cat': 0, 'dog': 1, 'others': 2}

 

查看得到的图片数据:

#从返回结果可见得到的数据仍是PIL Image对象
print(dataset[0])
print(dataset[0][0])
print(dataset[0][1]) #得到的是类别0,即cat

返回:

(<PIL.Image.Image image mode=RGB size=497x500 at 0x11D99A9B0>, 0)
<PIL.Image.Image image mode=RGB size=497x500 at 0x11DD24278>
0

 

然后定义一个对数据进行处理的transform:

#可以看出来此时得到的图片数据已经是处理过后的tensor数据了
print(dataset[0][0])
print(dataset[0][0].size()) #大小也是经过设定后的大小224
print(dataset[0][1]) #得到的是类别0,即cat

返回:

tensor([[[-0.7412, -0.7490, -0.7725,  ...,  0.3176,  0.3412,  0.3725],
         [-0.7333, -0.7412, -0.7882,  ...,  0.3255,  0.3647,  0.4039],
         [-0.7098, -0.7569, -0.8039,  ...,  0.3255,  0.3725,  0.4039],
         ...,
         [ 0.3961,  0.3961,  0.4039,  ...,  0.2627,  0.2627,  0.2549],
         [ 0.4196,  0.4039,  0.4118,  ...,  0.2549,  0.2392,  0.2314],
         [ 0.4275,  0.4275,  0.4431,  ...,  0.2314,  0.2314,  0.2235]],

        [[-0.7412, -0.7490, -0.7725,  ...,  0.3882,  0.3725,  0.3569],
         [-0.7333, -0.7412, -0.7882,  ...,  0.3961,  0.3961,  0.3882],
         [-0.7098, -0.7569, -0.8039,  ...,  0.3882,  0.4039,  0.3882],
         ...,
         [ 0.0431,  0.0510,  0.0667,  ..., -0.0824, -0.0824, -0.0902],
         [ 0.0510,  0.0431,  0.0588,  ..., -0.0824, -0.1059, -0.1137],
         [ 0.0353,  0.0353,  0.0510,  ..., -0.0902, -0.1059, -0.1216]],

        [[-0.8353, -0.8431, -0.8667,  ...,  0.3255,  0.3255,  0.3255],
         [-0.8196, -0.8275, -0.8824,  ...,  0.3333,  0.3490,  0.3569],
         [-0.7804, -0.8353, -0.8667,  ...,  0.3333,  0.3569,  0.3569],
         ...,
         [-0.2863, -0.2784, -0.2627,  ..., -0.3569, -0.3569, -0.3647],
         [-0.2549, -0.2706, -0.2549,  ..., -0.3569, -0.3804, -0.3882],
         [-0.2235, -0.2471, -0.2392,  ..., -0.3569, -0.3804, -0.4039]]])
torch.Size([3, 224, 224])
0

 

 
 
 
 
 
 

转载于:https://www.cnblogs.com/wanghui-garcia/p/10649364.html

相关文章:

  • 理解:return、break、continue区别
  • 数据库巡检项
  • 结合JDK源码看设计模式——适配器模式
  • SpringBoot 整合Mybatis
  • 1023. Camelcase Matching驼峰式匹配
  • Linux基础命令试题——第二周
  • 基于SimpleChain Beta的跨链交互与持续稳态思考
  • 一位6年老Android面经总结
  • PESCMS Ticket 客服工单系统 v1.2.5 发布
  • mysql补
  • JS中常遇到的浏览器兼容问题和解决方法
  • 百度联合清华发布国内首个基于AI实践的产业智能化白皮书
  • 防护等级高的才能适合在任何环境中应用
  • 只想着一直调用一直爽, 那API凭证泄漏风险如何破?
  • 一句话,讲清楚java泛型的本质(非类型擦除)
  • C++入门教程(10):for 语句
  • ES学习笔记(12)--Symbol
  • EventListener原理
  • Java 实战开发之spring、logback配置及chrome开发神器(六)
  • JavaScript设计模式系列一:工厂模式
  • Java的Interrupt与线程中断
  • Java知识点总结(JavaIO-打印流)
  • Linux Process Manage
  • Mac转Windows的拯救指南
  • SegmentFault 技术周刊 Vol.27 - Git 学习宝典:程序员走江湖必备
  • spring cloud gateway 源码解析(4)跨域问题处理
  • 分布式任务队列Celery
  • 浮动相关
  • 欢迎参加第二届中国游戏开发者大会
  • 基于遗传算法的优化问题求解
  • 免费小说阅读小程序
  • 提醒我喝水chrome插件开发指南
  • 我是如何设计 Upload 上传组件的
  • 限制Java线程池运行线程以及等待线程数量的策略
  • 一天一个设计模式之JS实现——适配器模式
  • 异常机制详解
  • ​渐进式Web应用PWA的未来
  • #LLM入门|Prompt#1.7_文本拓展_Expanding
  • $.proxy和$.extend
  • (2)关于RabbitMq 的 Topic Exchange 主题交换机
  • (floyd+补集) poj 3275
  • (HAL)STM32F103C6T8——软件模拟I2C驱动0.96寸OLED屏幕
  • (二)JAVA使用POI操作excel
  • (附源码)ssm户外用品商城 毕业设计 112346
  • (强烈推荐)移动端音视频从零到上手(下)
  • (顺序)容器的好伴侣 --- 容器适配器
  • (学习日记)2024.01.09
  • (一)基于IDEA的JAVA基础10
  • (转)树状数组
  • .NET CF命令行调试器MDbg入门(二) 设备模拟器
  • .NET core 自定义过滤器 Filter 实现webapi RestFul 统一接口数据返回格式
  • .NET MVC第五章、模型绑定获取表单数据
  • .Net转前端开发-启航篇,如何定制博客园主题
  • .skip() 和 .only() 的使用
  • @RestControllerAdvice异常统一处理类失效原因