首页 最新 热门 推荐

  • 首页
  • 最新
  • 热门
  • 推荐

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

  • 25-02-19 04:01
  • 3097
  • 13276
blog.csdn.net

文章目录

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

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 PIL

root = ...
transforms = transforms.Compose([...])
target_transform = transforms.Compose([...])

folder = ImageFolder(root=root, transform=transforms,
                     target_transform= target_transform, loader=PIL.Image.open)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
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 是对应的类别索引。

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

3. PyTorch实例说明

3.1 实例数据集

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

hymenoptera/hymenoptera_dataset/
├── train  #训练组
│   ├── ants  #4张图像
│   └── bees  #5张图像
└── val   #验证组
    ├── ants  #6张图像
    └── bees  #7张图像
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
3.2 实例说明
  • ImageFolder的属性实例说明:
from torchvision.datasets import ImageFolder

image_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)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

输出为:

['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), ...)]
  • 1
  • 2
  • 3

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

  • ImageFolder的方法实例说明:
from torchvision.datasets import ImageFolder

image_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 9

for img,id in folder3:
    print(img,'|',id)
'''
输出:
 | 0
 | 0
 | 0
 | 0
 | 1
 | 1
 | 1
 | 1
 | 1
'''

print(folder3[0])   #输出:(, 0)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28

4. 总结

torchvision.datasets.ImageFolder 是 PyTorch 中用于加载图像数据集的一个重要类,它特别适用于组织结构清晰的图片分类任务。ImageFolder 假设数据集按照以下结构存储:

  • 根目录(root)
    • 类别1
      • 图像1.jpg
      • 图像2.jpg
      • …
    • 类别2
      • 图像1.jpg
      • 图像3.png
      • …
    • …

每个子文件夹代表一个类别,并且该文件夹的下的图像都会被自动编号。ImageFolder 会遍历这些子文件夹中的所有图像文件,并将它们与其对应的类别标签配对。

使用 ImageFolder 时,其返回的对象是一个可迭代的数据加载器,每次迭代都会产出一个 (image, label) 元组,其中 image 可以是 PIL Image 或经过 transform 转换后的张量形式的图像,而 label 则是从对应文件夹名称映射得到的整数类别标签。

通过结合 PyTorch 的 DataLoader,可以方便地实现图像数据的批量化加载,非常适合于训练深度学习模型。

注:本文转载自blog.csdn.net的使者大牙的文章"https://blog.csdn.net/m0_49963403/article/details/136642111"。版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。如有侵权,请联系我们删除。
复制链接
复制链接
相关推荐
发表评论
登录后才能发表评论和回复 注册

/ 登录

评论记录:

未查询到任何数据!
回复评论:

分类栏目

后端 (14832) 前端 (14280) 移动开发 (3760) 编程语言 (3851) Java (3904) Python (3298) 人工智能 (10119) AIGC (2810) 大数据 (3499) 数据库 (3945) 数据结构与算法 (3757) 音视频 (2669) 云原生 (3145) 云平台 (2965) 前沿技术 (2993) 开源 (2160) 小程序 (2860) 运维 (2533) 服务器 (2698) 操作系统 (2325) 硬件开发 (2492) 嵌入式 (2955) 微软技术 (2769) 软件工程 (2056) 测试 (2865) 网络空间安全 (2948) 网络与通信 (2797) 用户体验设计 (2592) 学习和成长 (2593) 搜索 (2744) 开发工具 (7108) 游戏 (2829) HarmonyOS (2935) 区块链 (2782) 数学 (3112) 3C硬件 (2759) 资讯 (2909) Android (4709) iOS (1850) 代码人生 (3043) 阅读 (2841)

热门文章

101
推荐
关于我们 隐私政策 免责声明 联系我们
Copyright © 2020-2025 蚁人论坛 (iYenn.com) All Rights Reserved.
Scroll to Top