【单点知识】基于实例讲解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

相关文章

Python使用国内镜像加速pip安装的方法讲解

《Python使用国内镜像加速pip安装的方法讲解》在Python开发中,pip是一个非常重要的工具,用于安装和管理Python的第三方库,然而,在国内使用pip安装依赖时,往往会因为网络问题而导致速... 目录一、pip 工具简介1. 什么是 pip?2. 什么是 -i 参数?二、国内镜像源的选择三、如何

前端原生js实现拖拽排课效果实例

《前端原生js实现拖拽排课效果实例》:本文主要介绍如何实现一个简单的课程表拖拽功能,通过HTML、CSS和JavaScript的配合,我们实现了课程项的拖拽、放置和显示功能,文中通过实例代码介绍的... 目录1. 效果展示2. 效果分析2.1 关键点2.2 实现方法3. 代码实现3.1 html部分3.2

Python itertools中accumulate函数用法及使用运用详细讲解

《Pythonitertools中accumulate函数用法及使用运用详细讲解》:本文主要介绍Python的itertools库中的accumulate函数,该函数可以计算累积和或通过指定函数... 目录1.1前言:1.2定义:1.3衍生用法:1.3Leetcode的实际运用:总结 1.1前言:本文将详

mysqld_multi在Linux服务器上运行多个MySQL实例

《mysqld_multi在Linux服务器上运行多个MySQL实例》在Linux系统上使用mysqld_multi来启动和管理多个MySQL实例是一种常见的做法,这种方式允许你在同一台机器上运行多个... 目录1. 安装mysql2. 配置文件示例配置文件3. 创建数据目录4. 启动和管理实例启动所有实例

Java function函数式接口的使用方法与实例

《Javafunction函数式接口的使用方法与实例》:本文主要介绍Javafunction函数式接口的使用方法与实例,函数式接口如一支未完成的诗篇,用Lambda表达式作韵脚,将代码的机械美感... 目录引言-当代码遇见诗性一、函数式接口的生物学解构1.1 函数式接口的基因密码1.2 六大核心接口的形态学

Redis的Zset类型及相关命令详细讲解

《Redis的Zset类型及相关命令详细讲解》:本文主要介绍Redis的Zset类型及相关命令的相关资料,有序集合Zset是一种Redis数据结构,它类似于集合Set,但每个元素都有一个关联的分数... 目录Zset简介ZADDZCARDZCOUNTZRANGEZREVRANGEZRANGEBYSCOREZ

Go中sync.Once源码的深度讲解

《Go中sync.Once源码的深度讲解》sync.Once是Go语言标准库中的一个同步原语,用于确保某个操作只执行一次,本文将从源码出发为大家详细介绍一下sync.Once的具体使用,x希望对大家有... 目录概念简单示例源码解读总结概念sync.Once是Go语言标准库中的一个同步原语,用于确保某个操

java图像识别工具类(ImageRecognitionUtils)使用实例详解

《java图像识别工具类(ImageRecognitionUtils)使用实例详解》:本文主要介绍如何在Java中使用OpenCV进行图像识别,包括图像加载、预处理、分类、人脸检测和特征提取等步骤... 目录前言1. 图像识别的背景与作用2. 设计目标3. 项目依赖4. 设计与实现 ImageRecogni

Java操作ElasticSearch的实例详解

《Java操作ElasticSearch的实例详解》Elasticsearch是一个分布式的搜索和分析引擎,广泛用于全文搜索、日志分析等场景,本文将介绍如何在Java应用中使用Elastics... 目录简介环境准备1. 安装 Elasticsearch2. 添加依赖连接 Elasticsearch1. 创

使用C#代码计算数学表达式实例

《使用C#代码计算数学表达式实例》这段文字主要讲述了如何使用C#语言来计算数学表达式,该程序通过使用Dictionary保存变量,定义了运算符优先级,并实现了EvaluateExpression方法来... 目录C#代码计算数学表达式该方法很长,因此我将分段描述下面的代码片段显示了下一步以下代码显示该方法如