【单点知识】基于实例讲解PyTorch中的ImageFolder类

2024-03-20 00:52

本文主要是介绍【单点知识】基于实例讲解PyTorch中的ImageFolder类,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

      • 0. 前言
      • 1. ImageFolder功能
      • 2 基本使用方法及参数解析
        • 2.1 基本调用方式
        • 2.2 构造参数说明
        • 2.3 属性
        • 2.4 方法
      • 3. PyTorch实例说明
        • 3.1 实例数据集
        • 3.2 实例说明

0. 前言

按照国际惯例,首先声明:本文只是我自己学习的理解,虽然参考了他人的宝贵见解及成果,但是内容可能存在不准确的地方。如果发现文中错误,希望批评指正,共同进步。

torchvision.datasets.ImageFolder 是 PyTorch 中用于加载图像分类数据集的一个实用类。它特别适用于图像分类任务(可以说是图像分类任务离不开ImageFolder),因为它能够自动将文件夹结构映射到类别标签上

本文将基于实例详细介绍ImageFolder类。

1. ImageFolder功能

  1. ImageFolder 自动遍历指定目录下的所有子文件夹,并将每个子文件夹视为一个不同的类别或标签。
  2. 它允许用户轻松地加载和迭代训练/验证集中的图像数据,同时自动提供对应的类别标签
  3. 可以方便地与 PyTorch 数据加载器(DataLoader)结合使用,实现批量化、并行化数据加载,这对于深度学习模型训练非常关键。

2 基本使用方法及参数解析

2.1 基本调用方式
from torchvision.datasets import ImageFolder
from torchvision import transforms
import PILroot = ...
transforms = transforms.Compose([...])
target_transform = transforms.Compose([...])folder = ImageFolder(root=root, transform=transforms,target_transform= target_transform, loader=PIL.Image.open)
2.2 构造参数说明
  • root(必需):字符串类型,表示数据集所在的根目录。
  • transform(可选,几乎是必须):一个 transforms 对象,用于对读取的图像进行一系列预处理操作,如调整大小、转为 tensor、标准化等。
  • target_transform(可选):对目标标签进行转换的函数或变换对象。
  • loader(可选,从没用过):用于加载图像文件的函数。
2.3 属性
  • classes:一个包含所有类别名称的列表,按照文件夹名字排序。
  • class_to_idx:一个字典,key为类别名称,value为对应的整数索引。
  • imgs:一个元组,形为(image path, class_index)
2.4 方法
  • __getitem__(index):通过索引获取单个数据项,返回一个元组 (image, target),其中 image 是经过 transform 处理后的图像 tensor,target 是对应的类别索引。

利用 ImageFolderDataLoader 结合的方式,可以高效地准备和访问数据,从而大大简化了图像分类任务中数据预处理和加载的工作流程。

3. PyTorch实例说明

3.1 实例数据集

使用之前文章用过的hymenoptera数据集的简化版,其文件结构如下:

hymenoptera/hymenoptera_dataset/
├── train  #训练组
│   ├── ants  #4张图像
│   └── bees  #5张图像
└── val   #验证组├── ants  #6张图像└── bees  #7张图像
3.2 实例说明
  • ImageFolder的属性实例说明:
from torchvision.datasets import ImageFolderimage_path1 = '.\hymenoptera'
image_path2 = '.\hymenoptera\hymenoptera_data'
image_path3 = '.\hymenoptera\hymenoptera_data\\train'folder1 = ImageFolder(root=image_path1)
print(folder1.classes, '|',folder1.class_to_idx,'|', folder1.imgs)
folder2 = ImageFolder(root=image_path2)
print(folder2.classes, '|',folder2.class_to_idx,'|', folder2.imgs)
folder3 = ImageFolder(root=image_path3)
print(folder3.classes, '|',folder3.class_to_idx,'|', folder3.imgs)

输出为:

['hymenoptera_data'] | {'hymenoptera_data': 0} | [('.\\hymenoptera\\hymenoptera_data\\train\\ants\\0013035.jpg', 0), ...)]
['train', 'val'] | {'train': 0, 'val': 1} | [('.\\hymenoptera\\hymenoptera_data\\train\\ants\\0013035.jpg', 0), ...)]
['ants', 'bees'] | {'ants': 0, 'bees': 1} | [('.\\hymenoptera\\hymenoptera_data\\train\\ants\\0013035.jpg', 0), ...)]

这里可以看出,虽然是同一个数据集,但是root选择的文件夹层级不同会有不同的classes和自动编号的classes_id。但是无论选择哪个文件夹层级,imgs都能自动遍历所选文件路径下的所有图像。(从下面的方法说明也能看出)

  • ImageFolder的方法实例说明:
from torchvision.datasets import ImageFolderimage_path1 = '.\hymenoptera'
image_path2 = '.\hymenoptera\hymenoptera_data'
image_path3 = '.\hymenoptera\hymenoptera_data\\train'folder1 = ImageFolder(root=image_path1)
folder2 = ImageFolder(root=image_path2)
folder3 = ImageFolder(root=image_path3)print(len(folder1),len(folder2),len(folder3)) #输出:22 22 9for img,id in folder3:print(img,'|',id)
'''
输出:
<PIL.Image.Image image mode=RGB size=768x512 at 0x20AA7E5D550> | 0
<PIL.Image.Image image mode=RGB size=500x375 at 0x20AA7E5D7D0> | 0
<PIL.Image.Image image mode=RGB size=500x369 at 0x20AA7E5ECD0> | 0
<PIL.Image.Image image mode=RGB size=500x181 at 0x20AA7E5D850> | 0
<PIL.Image.Image image mode=RGB size=500x450 at 0x20AA7E5D7D0> | 1
<PIL.Image.Image image mode=RGB size=500x412 at 0x20AA7E5ECD0> | 1
<PIL.Image.Image image mode=RGB size=500x334 at 0x20AA7E5D850> | 1
<PIL.Image.Image image mode=RGB size=500x400 at 0x20AA7E5D7D0> | 1
<PIL.Image.Image image mode=RGB size=500x173 at 0x20AA7E5ECD0> | 1
'''print(folder3[0])   #输出:(<PIL.Image.Image image mode=RGB size=768x512 at 0x20AA7E5D850>, 0)

这篇关于【单点知识】基于实例讲解PyTorch中的ImageFolder类的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/827764

相关文章

C# WinForms存储过程操作数据库的实例讲解

《C#WinForms存储过程操作数据库的实例讲解》:本文主要介绍C#WinForms存储过程操作数据库的实例,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、存储过程基础二、C# 调用流程1. 数据库连接配置2. 执行存储过程(增删改)3. 查询数据三、事务处

springboot security验证码的登录实例

《springbootsecurity验证码的登录实例》:本文主要介绍springbootsecurity验证码的登录实例,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,... 目录前言代码示例引入依赖定义验证码生成器定义获取验证码及认证接口测试获取验证码登录总结前言在spring

tomcat多实例部署的项目实践

《tomcat多实例部署的项目实践》Tomcat多实例是指在一台设备上运行多个Tomcat服务,这些Tomcat相互独立,本文主要介绍了tomcat多实例部署的项目实践,具有一定的参考价值,感兴趣的可... 目录1.创建项目目录,测试文China编程件2js.创建实例的安装目录3.准备实例的配置文件4.编辑实例的

python+opencv处理颜色之将目标颜色转换实例代码

《python+opencv处理颜色之将目标颜色转换实例代码》OpenCV是一个的跨平台计算机视觉库,可以运行在Linux、Windows和MacOS操作系统上,:本文主要介绍python+ope... 目录下面是代码+ 效果 + 解释转HSV: 关于颜色总是要转HSV的掩膜再标注总结 目标:将红色的部分滤

使用PyTorch实现手写数字识别功能

《使用PyTorch实现手写数字识别功能》在人工智能的世界里,计算机视觉是最具魅力的领域之一,通过PyTorch这一强大的深度学习框架,我们将在经典的MNIST数据集上,见证一个神经网络从零开始学会识... 目录当计算机学会“看”数字搭建开发环境MNIST数据集解析1. 认识手写数字数据库2. 数据预处理的

Spring 中使用反射创建 Bean 实例的几种方式

《Spring中使用反射创建Bean实例的几种方式》文章介绍了在Spring框架中如何使用反射来创建Bean实例,包括使用Class.newInstance()、Constructor.newI... 目录1. 使用 Class.newInstance() (仅限无参构造函数):2. 使用 Construc

Pytorch微调BERT实现命名实体识别

《Pytorch微调BERT实现命名实体识别》命名实体识别(NER)是自然语言处理(NLP)中的一项关键任务,它涉及识别和分类文本中的关键实体,BERT是一种强大的语言表示模型,在各种NLP任务中显著... 目录环境准备加载预训练BERT模型准备数据集标记与对齐微调 BERT最后总结环境准备在继续之前,确

C++快速排序超详细讲解

《C++快速排序超详细讲解》快速排序是一种高效的排序算法,通过分治法将数组划分为两部分,递归排序,直到整个数组有序,通过代码解析和示例,详细解释了快速排序的工作原理和实现过程,需要的朋友可以参考下... 目录一、快速排序原理二、快速排序标准代码三、代码解析四、使用while循环的快速排序1.代码代码1.由快

pytorch+torchvision+python版本对应及环境安装

《pytorch+torchvision+python版本对应及环境安装》本文主要介绍了pytorch+torchvision+python版本对应及环境安装,安装过程中需要注意Numpy版本的降级,... 目录一、版本对应二、安装命令(pip)1. 版本2. 安装全过程3. 命令相关解释参考文章一、版本对

MyBatis-Plus中Service接口的lambdaUpdate用法及实例分析

《MyBatis-Plus中Service接口的lambdaUpdate用法及实例分析》本文将详细讲解MyBatis-Plus中的lambdaUpdate用法,并提供丰富的案例来帮助读者更好地理解和应... 目录深入探索MyBATis-Plus中Service接口的lambdaUpdate用法及示例案例背景