加载自己的图像数据集

news2024/12/28 20:58:18

文章目录

  • 1 加载图像数据集
  • 2 图像预处理
  • 3 再次加载数据集
  • 4 这里还有一个问题,我们没有验证集
  • 5 构建DataLoader
  • 6 检查是否正确导入数据集

原文链接:《加载自己的图像数据集》

​ 数据集下载链接

1 加载图像数据集

目录结构:

image-20230426200033333

针对这种非常典型的数据集组织方式
我们可以用torchvision.datasets.ImageFolder来加载数据集

import os
import torchvision

data_path = '.\\archive'

train_dataset = torchvision.datasets.ImageFolder(os.path.join(data_path, 'train'))

注意!这并不是把训练集中所有的图像都加载到了内存,那样太耗费内存了,仅仅是把训练集中的图像在磁盘中的存储路径加载了。

train_dataset有几个重要的属性:

# 这个是一个元组列表
# 元组的第一个元素是图像在磁盘中的路径,第二个元素是图像所属的数字标签
# 类似这样('.\\archive\\train\\dandelion\\2503034372_db7867de51_m.jpg', 1)
train_dataset.imgs

# 就是我们要预测的图像所属的数字标签列表
# 顺序和上面的元组列表顺序一样
train_dataset.targets

# 类别的中文名称
# 在这里就是那5个文件夹的名称列表
train_dataset.classes
# ['daisy', 'dandelion', 'roses', 'sunflowers', 'tulips']

# 这是一个字典
# 键为train_dataset.classes
# 值为train_dataset.targets
train_dataset.class_to_idx
# {'daisy': 0, 'dandelion': 1, 'roses': 2, 'sunflowers': 3, 'tulips': 4}

# 我们可以通过len(train_dataset)查看训练集中一共有多少样本
len(train_dataset) # 3670

我们可以查看一下第一张图像:

from PIL import Image

# 读取图像, train_dataset.imgs[0][0]是第一张图像的路径
img = Image.open(train_dataset.imgs[0][0])
img

output_5_0

2 图像预处理

前面已经看到这些图像现在都是尺寸各异,那么在正式使用这些图像之前,我们首先需要将这些图像的尺寸统一,然后还有一些其他的预处理。常见的预处理顺序是:

  1. 调整图像尺寸为模型规定的尺寸,比如3x224x224。

  2. 如果是训练集,那还要做一些数据增强操作,比如随机水平翻转图像。

  3. 将图像转成张量。自动归一化像素值在0到1之间,这样有助于高效训练CNN。

当然实际的预处理操作可能比这个多,这只是举个例子。

这些操作可以放到管道里依次执行:

import torchvision.transforms as transforms

transform = transforms.Compose([
    transforms.RandomResizedCrop(224),  # 随机缩放裁剪出224x224的区域
    transforms.RandomHorizontalFlip(),  # 在水平方向上随机翻转图像,50%的概率
    transforms.ToTensor()  # 转成张量,自动归一化到0~1
])

3 再次加载数据集

那么现在加载数据集的正确方式就是:

import os
import torchvision
import torchvision.transforms as transforms

# 如果遇到损坏的图像则跳过
from PIL import ImageFile

ImageFile.LOAD_TRUNCATED_IMAGES = True

data_path = '.\\archive'

train_transform = transforms.Compose([
    transforms.RandomResizedCrop(224),  # 随机缩放裁剪出224x224的区域
    transforms.RandomHorizontalFlip(),  # 在水平方向上随机翻转图像,50%的概率
    transforms.ToTensor()  # 转成张量,自动归一化到0~1
])

# 测试集的transform仅仅是缩放图像到合适尺寸并在转成张量
test_transform = transforms.Compose([
    transforms.Resize(256),  # 缩放到256x256的大小,因为后面要裁剪成224x224
    transforms.CenterCrop(224),  # 从中心裁剪成224x224的大小
    transforms.ToTensor()
])

train_dataset = torchvision.datasets.ImageFolder(
    os.path.join(data_path, 'train'), transform=transform)

test_dataset = torchvision.datasets.ImageFolder(
    os.path.join(data_path, 'test'), transform=transform)

注意!训练集和测试集用了不同的transforms。因为在训练模型时我们需要用到tranforms来帮助我们实现数据增强(Data Augmentation)来减小模型过拟合的可能性。

4 这里还有一个问题,我们没有验证集

利用torch.utils.data.random_split可以帮助我们划分数据集,而且是保持数据集中每个类别的数据量比例不变。

import torch

# 从train_dataset中抽取80%作为训练集
num_train = int(0.8 * len(train_dataset))
# 余下20%作为验证集
num_val = int(0.2 * len(train_dataset))

# torch.manual_seed(0) 为了方便复现设置的随机抽样生成器
train, val = torch.utils.data.random_split(
    train_dataset, [num_train, num_val], torch.manual_seed(0))

5 构建DataLoader

有了数据集之后我们还要批量的将数据集真正加载到内存/显存:

from torch.utils.data import DataLoader

train_dl = DataLoader(train, batch_size=128, shuffle=True)
val_dl = DataLoader(val, batch_size=128, shuffle=False)
test_dl = DataLoader(test_dataset, batch_size=128, shuffle=True)

batch_size参数表示一次性加载多少张图像(样本)进入内存。

shuffle表示是否对数据集中的图像(样本)进行混洗。

6 检查是否正确导入数据集

别忘了随机检查几份样本观察一下正确导入了数据集哦,对于图像数据集,那么就是直接画出来看:

import matplotlib.pyplot as plt

imgs, labels = next(iter(train_dl))  # 从train_dl中取出一个批次的数据, iter()是生成器, next()是迭代器
figure = plt.figure(figsize=(10, 8))
cols, rows = 3, 3
for i in range(1, cols * rows + 1):
    img, label = imgs[i], labels[i]  # imgs[i]是第i张图像, labels[i]是第i张图像的标签
    figure.add_subplot(rows, cols, i)
    plt.title(train_dataset.classes[label])
    plt.axis("off")
    # img.permute(1, 2, 0)是将张量的维度换位, 使得第0维度在最后, 以便于matplotlib显示,
    # 因为matplotlib显示的是RGB图像, 而pytorch的图像是CHW格式, 所以需要将CHW转换为HWC
    plt.imshow(img.permute(1, 2, 0))
plt.show()

output_17_0

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/464997.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java+proj4j实现根据EPSG编码进行坐标系转换

场景 JavaGeoTools实现WKT数据根据EPSG编码进行坐标系转换: JavaGeoTools实现WKT数据根据EPSG编码进行坐标系转换_霸道流氓气质的博客-CSDN博客 上面使用GeoTools实现坐标系转换。 VueOpenlayersproj4实现坐标系转换: VueOpenlayersproj4实现坐标系转换_霸道流…

VUE3页面div点击改变样式

如题目所示。 用上VUE之后,前后端分离,组件式开发,代码复用、独立性和隔离性都挺好,可维护性得以提高。相比之下,以前用jQuery,代码实在太多了。 不过,vue有个地方不大好,就是控制…

算法基础(二)(共有30道例题)

六、数据结构 (一)数组 定义:数组是存放在连续内存空间上的相同类型数据的集合。数组可以方便的通过下标索引的方式获取到下标下对应的数据。 注意: (1)数组下标都是从0开始的。 (2&#xff0…

【SWAT水文模型】SWAT水文模型建立及应用第二期:土地利用数据的准备(待更新)

SWAT水文模型建立及应用:土地利用数据的准备 1 简介2 土地利用数据的下载1.1 数据下载方式1.2 数据下载 2 土地利用数据的准备2.1 矢量转栅格2.2 土地利用类型的重分类2.3 土地利用分布图投影调整2.4 土地利用类型索引表建立 参考 SWAT水文模型建立及应用第一期主要…

前苹果设计总监创办,Humane想用AI+AR界面取代手机

在2001年,微软研究院一位工程师Gordon Bell开始了一段长时间的“生活记录”(Lifelogging)之旅,他会在胸前、头顶或是眼镜腿处佩戴相机,每30秒自动拍摄一张照片,以捕捉自己生命中的瞬间,记录下他…

数字化转型导师坚鹏:金融科技与保险公司转型

金融科技与保险公司转型 课程背景: 数字化背景下,很多保险公司存在以下问题: 不了解保险公司数转型现状、困惑与成功方法? 不清楚金融科技如何赋能保险公司数字化转型? 不了解保险公司数字化转型标杆企业成功案…

Linux系统上C程序的编译与调试

gcc分布编译链接: 预处理(Pre-Processing)编译(Compiling)汇编(Assembling)链接(Linking) gcc -E hello.c -o hello.i #预处理 gcc -S hello.i -o hello.s #编译 gcc -c…

ThingsBoard教程更新通知,规则节点全解析系列更新

前言 自从 《ThingsBoard系列教程》 专栏上线,我收到了很多读者的认同和肯定,这是我一直坚持分享的理由之一,做有价值的事,帮助他人。前段时间因为写书和学习的原因,ThingsBoard专栏已经4个月没更新。这就导致一些读者…

【点击查看】讯飞星火正在回答···

Hi,开发者: 关于世界,你有过什么样的疑问?每一次的提问,都代表着我们在关注什么,思考什么,好奇什么。世界的每一次更新,都始于一个新的提问。 我是讯飞星火认知大模型,…

【爆肝更新】第二章:Python基础语法——保姆级,超万字!

这一章我们开始学习Python的基础语法,包含字面量,运算符,变量,字符串格式化,input函数等,这一章是为整个Python体系学习打好基础,所以一定要重视起来。 习惯看视频的同学可以看这个免费教程&am…

面试题30天打卡-day13

1、Linux 中的硬链接和软连接是什么,二者有什么区别? 在Linux系统下,有两种链接文件,一种是硬链接(Hard Link),一种是软链接,也称为符号链接(Symbolic Link)…

Linux-使用mobaxterm连接虚拟机ubuntu

一、准备工作 VMware:16.0.0 Ubuntu:18.4 MobaxTerm:链接:https://pan.baidu.com/s/1dNsahe9wO5KrWlWXtNqT0A?pwdaz39 提取码:az39 二、实操 1.检查系统是否安装ssh service sshd status 如果显示未安装&#xff0…

Notes/Domino的未来在于

大家好,才是真的好。 很多企业不谈论应用程序,让Domino的平台价值和市场前景变得有些黯淡。 毕竟作为全球第一款企业级的邮箱平台,过去大部分企业和组织都在使用Notes/Domino。而从10来年前,很多企业开始大规模地由Notes/Domino…

GPT-3.5 生成 Fabric Cypher

GPT-3.5 生成 Fabric Cypher GPT-3.5 生成 Fabric CypherFabric 架构图数据库节点设计图数据模型设计Fabric 快速开始指南下载必要资源配置 构建数据在graph-node-1节点构建股票图谱在graph-node-2节点构建高管图谱 GPT-3.5 生成 Fabric Cypher Here’s the table of contents:…

【Java】『蓝桥杯』10道编程题及答案(四)

系列文章 【Java】『蓝桥杯』10道编程题及答案(一) 本文链接:https://blog.csdn.net/youcheng_ge/article/details/130223115 【Java】『蓝桥杯』10道编程题及答案(二) 本文链接:https://blog.csdn.net/y…

五种PDF转Word免费的软件!(附带转换效果对比!)

本文将介绍种PDF转Word免费软件,让您快速将PDF文件转换为可编辑的Word文件。 随着现代科学技术的飞速发展,PDF格式已经成为我们工作和生活中常用的文档格式之一。PDF文件的格式是固定的,不容易被篡改,因此经常被用来制作各种关键文…

1691_python学习笔记之week3_递归

全部学习汇总: GreyZhang/python_basic: My learning notes about python. (github.com) 最初接触递归的时候觉得这个有点不好理解,怎么能够有这种思维方式?这完全不同于之前自己所能够了解的那种一加一等于二的方式。相对于能够看得见的那种…

企业采购都在用什么系统管理采购流程?ERP够用了吗?

ERP(企业资源计划)和采购管理系统都是企业信息化系统的一部分,它们在企业中扮演着不同的角色。下面是它们之间的区别:区别 功能不同:ERP系统是一个综合性的企业管理系统,覆盖范围广,包括财务、人…

Android12 material you 动态配色

动态配色功能是 Material You 设计的核心 一、完整的动态配色流程包括四个步骤,如下所示: 用户通过 OEM 选择器更改壁纸或主题。AOSP 逻辑会自动从所选壁纸中提取单一源颜色。将源颜色扩展到颜色API,AOSP 将单一源颜色扩展为 5 ,…

JS实现拼音(字母)匹配(搜索)汉字(姓名)

这就是个模糊查询,我们平常做的都是直接输入汉字去把对应的值过滤出来,但我还真是第一次通过拼音去查询(当然不只是拼音,汉字也是可以的),以前还真没注意这个。唉,这可咋搞,我怎么知…