pytorch实现深度学习常用图像分类数据集的划分与读取(Oxford-102flower,CIFAR10/CIFAR100)

2023-11-06

Oxford-102flower花分类数据集,CIFAR10/CIFAR100数据集,

Oxford-102flower

Oxford-102flower是牛津工程大学于2008年发布的用于图像分类的数据集,总共分为102个类,每个类包含40-258张图像,一共8189张图像。

数据下载地址https://www.robots.ox.ac.uk/~vgg/data/flowers/102/

下载图中1.4.5对应的文件,分别为数据的文件,标签的文件和划分的文件。

 数据下载解压后显示如下:

数据中个别图像展示:

 下载好的图像放在一个jpg文件夹中,该文件夹中包含了所有的图像,但其图像排列顺序是有规律,每一类的图像放在一起,然后再放下一类的所有图像,因此我们可以将数据集划分为训练集、验证集和测试集。

 数据集的划分主要依据imagelabels.mat文件和setid.mat文件完成。imagelabels.mat文件主要包换数据的标签信息。

导入头文件:

# encoding:utf-8
import scipy.io
import numpy as np
import os
from PIL import Image

依据imagelabels.mat文件读取图像的标签信息,该文件一共包含8189列,每一个数即代表的该图像所属的类别。在使用时修改imagelabels.mat文件的位置,使程序能够顺利读取。

labels = scipy.io.loadmat('./imagelabels.mat.txt')
labels = np.array(labels['labels'][0]) - 1
print("labels:", labels)

根据setid.mat文件将数据划分为训练集,验证集和测试集。setid.mat文件主要包含每一个类对应的图片信息文件,读取该文件,配合imagelabels.mat文件可实现数据的划分。在使用时修改setid.mat文件的位置,使程序能够顺利读取。

setid = scipy.io.loadmat('./setid.mat.txt')

validation = np.array(setid['valid'][0]) - 1
np.random.shuffle(validation)

train = np.array(setid['trnid'][0]) - 1
np.random.shuffle(train)

test = np.array(setid['tstid'][0]) - 1
np.random.shuffle(test)

将数据存储在fflower_dir中:注意修改图片存储的位置。
 

flower_dir = list()
for img in os.listdir("./102flowers/jpg"):
    flower_dir.append(os.path.join("./102flowers/jpg", img))
flower_dir.sort()

根据setid划分出train并放入train文件夹中:

des_folder_train = "./train"  # 该地址可为新建的训练数据集文件夹的相对地址
for tid in train:
    # 打开图片并获取标签
    img = Image.open(flower_dir[tid])
    print(img)
    # print(flower_dir[tid])
    img = img.resize((256, 256), Image.ANTIALIAS)
    lable = labels[tid]
    # print(lable)
    path = flower_dir[tid]
    print("path:", path)
    base_path = os.path.basename(path)
    print("base_path:", base_path)
    classes = "c" + str(lable)
    class_path = os.path.join(des_folder_train, classes)
    # 判断结果
    if not os.path.exists(class_path):
        os.makedirs(class_path)
    print("class_path:", class_path)
    despath = os.path.join(class_path, base_path)
    print("despath:", despath)
    img.save(despath)

根据setid划分出val并放入val文件夹中:

des_folder_validation = "./val"#该地址为新建的验证数据集文件夹的相对地址

for tid in validation:
    img = Image.open(flower_dir[tid])
    # print(flower_dir[tid])
    img = img.resize((256, 256), Image.ANTIALIAS)
    lable = labels[tid]
    # print(lable)
    path = flower_dir[tid]
    print("path:", path)
    base_path = os.path.basename(path)
    print("base_path:", base_path)
    classes = "c" + str(lable)
    class_path = os.path.join(des_folder_validation, classes)
    # 判断结果
    if not os.path.exists(class_path):
        os.makedirs(class_path)
    print("class_path:", class_path)
    despath = os.path.join(class_path, base_path)
    print("despath:", despath)
    img.save(despath)

根据setid划分出test并放入test文件夹中:

des_folder_test = "./test"#该地址为新建的测试数据集文件夹的绝对地址

for tid in test:
    img = Image.open(flower_dir[tid])
    # print(flower_dir[tid])
    img = img.resize((256, 256), Image.ANTIALIAS)
    lable = labels[tid]
    # print(lable)
    path = flower_dir[tid]
    print("path:", path)
    base_path = os.path.basename(path)
    print("base_path:", base_path)
    classes = "c" + str(lable)
    class_path = os.path.join(des_folder_test, classes)
    # 判断结果
    if not os.path.exists(class_path):
        os.makedirs(class_path)
    print("class_path:", class_path)
    despath = os.path.join(class_path, base_path)
    print("despath:", despath)
    img.save(despath)

划分好的数据集如下所示:

CIFAR10/CIFAR100

CIFAR-10 数据集由 10 个类中的 60000 张 32x32 彩色图像组成,每类 6000 张图像。有50000个训练图像和10000个测试图像。

数据集分为五个训练批次和一个测试批次,每个批次包含 10000 张图像。测试批处理包含来自每个类的 1000 个随机选择的图像。训练批次以随机顺序包含剩余的图像,但某些训练批次可能包含来自一个类的图像多于另一个类的图像。在它们之间,训练批次恰好包含来自每个类的5000张图像。

 

 CIFAR-100与CIFAR-10类似,只是它有 100 个类,每个类包含 600 张图像。每类有 500 张训练图像和 100 张测试图像。CIFAR-100 中的 100 个类被分为 20 个超类。每个图像都带有一个“精细”标签(它所属的类)和一个“粗”标签(它所属的超类)。其标签具有两种,一种是粗粒度标签,一种是细粒度标签,如下:

 官方的读取方法:

def unpickle(file):
    import pickle
    with open(file, 'rb') as fo:
        dict = pickle.load(fo, encoding='bytes')
    return dict
  • 数据 -- 一个 10000x3072 的 uint8s 的 numpy 数组。阵列的每一行都存储一个 32x32 的彩色图像。前 1024 个条目包含红色通道值,接下来的 1024 个条目包含绿色通道值,最后 1024 个条目包含蓝色通道值。图像按行主顺序存储,因此数组的前 32 个条目是图像第一行的红色通道值。
  • 标签 -- 0-9 范围内的 10000 个数字的列表。索引 i 处的数字表示数组数据中第 i个图像的标签。

数据集包含另一个文件,称为批处理.meta。它也包含一个Python字典对象。它具有以下条目:

  • label_names -- 一个包含 10 个元素的列表,它为上述 labels 数组中的数字标签提供了有意义的名称。例如,label_names[0] == “飞机”,label_names[1] == “汽车”等。

在实际应用过程中已经封装好的数据,所以我们也可以直接调用封装函数实现数据的读取。

预处理方式:我这里没有做数据增强,也可以添加翻转,旋转,缩放等数据增强操作。

data_transform = {
        "train": transforms.Compose([
                                    
                                     transforms.ToTensor(),
                                     transforms.Normalize((0.485, 0.456, 0.406), (0.229, 0.224, 0.225))
                                     ]),
        "val": transforms.Compose([
                                    
                                   transforms.ToTensor(),
                                   transforms.Normalize((0.485, 0.456, 0.406), (0.229, 0.224, 0.225))
                                   ])}

数据读取与载入:

    train_dataset=torchvision.datasets.CIFAR100(root='./data/cifar100',train=True,download=True,transform=data_transform['train'])
    val_dataset=torchvision.datasets.CIFAR100(root='./data/cifar100',train=False,download=False,transform=data_transform['val'])

    train_num=len(train_dataset)
    val_num=len(val_dataset)

    train_loader=torch.utils.data.DataLoader(train_dataset,batch_size=128,shuffle=True)
    val_loader=torch.utils.data.DataLoader(val_dataset,batch_size=128,shuffle=False)

    print("using {} images for training, {} images for val.".format(train_num,
                                                                           val_num))

其中train_loader 和val_loader可以直接送入网络训练。

    for step,data in enumerate(train_loader):
        img,lable=data
        print(len(data))
        print(step,lable)

查看其标签:结果如下

2是表示data的长度,data是一个list数据,第一位是图像信息,第二位是标签信息,371是指数据按128的大小分好之后的第371份,由于是标签,所以有128个数字,每个数字表示该batch中对应图像的标签 。可以用这个标签信息去算loss。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

pytorch实现深度学习常用图像分类数据集的划分与读取(Oxford-102flower,CIFAR10/CIFAR100) 的相关文章

  • h5学习笔记:flex space-between 实现左右对齐布局

    今天在尝试拼小程序界面的时候一直想换种口味 于是想使用flex布局 小程序支持flex也比较好 今天遇到一个问题就是要实现一个一左 一右 方式布局 之前习惯了用绝对布局的方式 可以将右边的元素实现right 0 处理 细心想了一既然使用fl
  • netdata监控服务器主机(包括Docker容器)

    效果 Docker部署 创建挂载目录 mkdir p data netdata netdatacache netdatalib docker运行 docker run d name netdata p 19999 19999 v data
  • 四个问题,判断自己是否适合学习编程

    下面有四个问题 可以测一测你是否适合学习编程 你的逻辑和抽象思维能力比较强吗 你愿意花费很多业余时间去学习新的东西吗 你对研究和探索未知领域保持足够的好奇心吗 遇到问题和困难的时候你有足够的耐心和毅力去解决吗 如果上面这四个问题中有三个及以
  • Unity导入模型一面有贴图另一面透明的解决方案

    出现这种情况是因为模型用了双面材质 而Unity不支持双面材质 故导入模型到Unity中 会出现一面有贴图 另一面透明的情况 解决方法 1 自定义一个双面材质Shader 代码如下 Shader Nature Vegitation Vert
  • 手把手教你添加多个IP地址

    IP地址 IP地址是指互联网协议地址 又译为网际协议地址 是IP协议提供的一种统一的地址格式 它为互联网上的每一个网络和每一台主机分配一个逻辑地址 以此来屏蔽物理地址的差异 子网掩码 子网掩码又叫网络掩码 地址掩码 子网络遮罩 它用来指明一
  • Linux如何查看JDK的安装路径

    which java 首先要申明一下which java是定位不到安装路径的 which java定位到的是java程序的执行路径 root localhost which java usr bin java root localhost
  • sqli-labs-master第21关、22关

    前言 昨天我们研究了http头部cookie注入 反正我是让让抓包软件给搞死了 废了老半天劲 我们来研究下加密后的cookie 第21关 看到这个页面我们还是输入用户密码 返回了这个页面 提示了一系列的信息 我们还是抓包分析下 看到了加密后
  • 【RocketMQ】设计理念与核心概念扫盲

    RocketMQ 设计理念与核心概念扫盲 文章目录 RocketMQ 设计理念与核心概念扫盲 一 RocketMQ的设计理念和目标 1 1 设计理念 1 2 设计目标 二 RocketMQ的核心概念扫盲篇 2 1 部署架构 2 1 1 Na
  • 公司规定所有接口都用 POST请求?

    最近在逛知乎的时候发现一个有趣的问题 公司规定所有接口都用 post 请求 这是为什么 看到这个问题的时候其实我也挺有感触的 因为我也曾经这样问过我自己 在19的时候接到一个项目是从零开始搭建一个微服务 当时就有了解过接口的一些规范 比如耳
  • Myeclipse8.x集成Aptana

    MyEclipse8 x集成Aptana 2011 01 02 14 25 47 分类 Java 举报 字号 订阅 前几天在网上找了很多关于MyEclipse集成Aptana插件 找到的只有MyEclipse6 0的版本 而且都是同一篇文章
  • SpringBoot系列教程JPA之update使用姿势

    通过本篇博文 您至少可以选到 save 直接根据id来修改记录 利用jpl 实现查询修改的使用姿势 初识事物的神秘面纱 I 环境准备 在开始之前 当然得先准备好基础环境 如安装测试使用mysql 创建SpringBoot项目工程 设置好配置
  • 【源码篇】基于ssm+vue+微信小程序的医疗科普小程序

    系统介绍 这是一个ssm vue 微信小程序的医疗科普小程序 分为pc端和微信小程序端 pc端包括 管理员角色和学生角色 管理员拥有 学生管理 科普知识管理 论坛管理 收藏管理 试卷管理 留言板管理 试题管理 系统管理 考试管理 学生端拥有
  • keil中下载程序界面设置

    下午在调试DAU的时候忽然出现internal command error的情况 以往是将下载器重新上电或编译器重启既可 但是今天这一招怎么也不灵光了 换一个硬件可以正常下载 不死心 试着修改下载器选项 当Connect选择为Under R
  • 游戏UI特效教程 章鱼学院UI动效基础课(68课)

    本文包含两大单元 展示类动效原型单元 可交互动效原型单元 在展示类动效单元中 我们会着重利用AE这款软件 由浅入深的 对三个案例进行学习并制作 通过学习这个单元的知识 大家可以掌握UI动效中 AE基本的使用技巧 并在带领下完成三个案例 通过
  • ts 移动端h5 拍照预览

    通过typescript实现一个简单版本 移动端 拍照 和预览功能 1 需求列表 点击拍照唤起手机后置摄像头 拍照完成在页面预览照片 2 技术实现 2 1 布局和唤起后置摄像头 唤起摄像头采用 input 里面 type file 类型 为
  • Shell脚本攻略:文本三剑客之sed

    目录 一 理论 1 sed 二 实验 1 sed命令的寻址打印 2 显示奇偶 3 查找替换 4 后向引用 5 截取版本号 6 替换IP地址 一 理论 1 sed 1 概念 sed 英文全称为stream editor流式编辑器 sed 对输
  • neo4j学习笔记

    文章目录 neo4j note 一 概述 1 链接 2 介绍 数据模型 二 使用 1 环境搭建 2 CQL 1 创建 Create 2 查询Match 3 Return 4 关系基础 创建 1 现有节点之间创建无属性的关系 2 现有节点之间
  • 哈夫曼树构造哈夫曼编码

    在传输文字时 经常要将文字转换成二进制字符串 所以我们希望编码最短 但是又想保证它的唯一性 哈夫曼树具有最小带权路径长度 用来实现编码就可以编码最短 所以用哈夫曼树来构造编码 而前缀编码就可以保证在解码的时候不会出现多种可能 就实现了唯一性
  • 第二章。c#变量和数据输入

    1 C 中常见的数据类型 1 整型 整数类型 表示整数 比如年 月 日 年龄等都是整数 整型的关键字 int 最常用的 short long 2浮点型 带小数点的数 比如身高 米 体重 100 5kg 等都是浮点数 浮点型分成两种 1 单精
  • quartz对于定时任务Misfire的处理

    使用quartz过程中 产生了很多问题 遇到就记录一下 虽然用的比较少了 但还是有一些项目在使用 问题描述 创建一个每天执行的任务test1 创建自动运行状态 然后停止任务 一直等到当天定时时间过去 然后再启动 发现定时任务还是先执行了一次

随机推荐

  • 在Bios中开启虚拟化设置

    1 进入BIOS 开机时按baiF2或F12或DEL或ESC等键 各电脑有所不同 2 进入duBIOS后 找到Configuration选项 选zhi择Intel Virtual Technology并回车 将光标dao移至Enabled
  • C++使用模板实现元素的反序

    实现任意类型序列中元素的反序 所涉知识点 示例代码 开发环境 运行结果 注意 所涉知识点 阅读此文需要掌握的知识点 回调函数 模板类 类模板 栈 示例代码 这里直接上代码 pragma once include
  • Qt中的并发

    QThread是一个低级 low level 类 适合用于显式地构建长期运行的线程 QtConcurrent是一个命名空间 提供了用于编写并发软件的更高层次的类和算法 该命名空间中有一个重要的类 QThreadPool 这是一个管理线程池的
  • [第四届-强网杯]:Funhash

  • C#的基本知识

    1 static修饰符 本页介绍 static 修饰符关键字 static 关键字也是 using static 指令的一部分 使用 static 修饰符可声明属于类型本身而不是属于特定对象的静态成员 static 修饰符可用于声明 sta
  • Spring中事务几个常见的问题

    首先 事务这个概念是数据库层面的 Spring只是基于数据库中的事务进行扩展 以及提供了一些能让程序员更新方便操作事务的方式 Spring如何处理事务 Spring中支持编程式事务和声明式事务管理两种方式 1 编程式事务 可以使用Trans
  • 一天内Boss转发5k次,「高性能Java:核心原理案例实战」已被封杀

    前言 市面上讲Java框架的书很多 包括SpingBoot SpringCloud Kafka等 但这些书通常只会让你技术的 量 增长 而 质 仍处于SSM的阶段 而且互联网上并没有体系化 结构化的提升技术的 质 的教材 于是团长行动了起来
  • ubuntu环境下编译内核详解

    一 下载源代码和编译软件的准备 下载内核源代码 http www kernel org 注意 点击2 6 25内核的F版 即完整版 如果你懒得去网站点联接 运行下列命令 代码 cd wget http www kernel org pub
  • c语言代码中调用系统命令行.sh shell脚本,linux shell system传参

    C语言代码中调用命令行 1 使用system 命令行 执行完命令行后 会返回原先C代码的位置 继续执行 2 如果命令行中需要传参 使用 sprintf 先处理好命令行的内容 再 system system echo 123 int a 3
  • C/C++基本数据类型所占字节数

    关于这个基本的问题 很早以前就很清楚了 C标准中并没有具体给出规定那个基本类型应该是多少字节数 而且这个也与机器 OS 编译器有关 比如同样是在32bits的操作系统系 VC 的编译器下int类型为占4个字节 而tuborC下则是2个字节
  • 文件的结构及存取方法

    文件的组织形式是文件的结构 从不同的角度分析文件有不同的结构形式 逻辑结构和物理结构 从用户角度出发 研究文件的抽象组织方式而定义的文件组织形式为文件的逻辑结构 从系统的角度出发 研究文件的物理组织方式而定义的文件组织形式为文件的物理结构
  • 【虚拟机】VMware16保姆级安装教程

    大家好 我是雷工 工作中需要用到各种各样的工控软件 有时候甚至需要不同版本的软件 但频繁装卸软件比较麻烦 而且像WinCC和博图软件对系统要求比较严格 卸载重装可能就出问题 此时就不得不重装系统 重装系统各种软件都需要重装一遍 费时费力 这
  • 七、Python基础(异常、模块、文件操作)

    七 Python基础 异常 模块 文件操作 目录 七 Python基础 异常 模块 文件操作 一 异常 1 抛出异常 2 简单的捕获异常语法 3 错误类型的捕获 4 异常捕获的完整语法 5 异常的传递 6 raise 主动抛出异常 二 模块
  • 关于面向对象中的get 和set方法的总结,为什么不用public的详解,详解。

    我们都知道去构造一个实体类的时候 标准都是去 private 一个私有变量 然后再给这个私有 变量加上 公开 get 和 set 我总是会忍不住去想一下 为什么不直接去public 变量 是为了什么 是一种标准 还是说有什么好处 发现网上确
  • 行为驱动开发(BDD)你准备好了吗?

    GitChat 作者 冰尘 原文 行为驱动开发 BDD 你准备好了吗 关注微信公众号 GitChat 技术杂谈 一本正经的讲技术 不要错过文末彩蛋 这个Chat笔者将会和大家一起探讨下面的主题 什么是行为驱动开发 BDD 为什么使用行为驱动
  • STM32+ESP8266(ESP-12F)物联网温度计-移植paho MQTT协议连接阿里云

    STM32 ESP8266 ESP 12F 物联网温度计 移植paho MQTT协议连接阿里云 目录 STM32 ESP8266 ESP 12F 物联网温度计 移植paho MQTT协议连接阿里云 一 硬件及软件准备 1 硬件 STM32单
  • stm32串口通信,收发字符串,并对其进行解析

    串口以字符串接收和发送 将传输的数据转化为整数 正负 stm32发送端 motor position Read Encoder Angle Encoder sensor position Get Adc Average Angle Adc
  • Java后端WebSocket的Tomcat实现

    一 WebSocket简单介绍 随着互联网的发展 传统的HTTP协议已经很难满足Web应用日益复杂的需求了 近年来 随着HTML5的诞生 WebSocket协议被提出 它实现了浏览器与服务器的全双工通信 扩展了浏览器与服务端的通信功能 使服
  • SSM框架学习记录-Spring_day01

    1 核心概念 当前项目中的问题 下面代码的实现十分简单 但是业务层需要调用数据层的方法 就要在业务层new数据层的对象 如果数据层的实现类发生变化 业务层的代码也需要跟着改变 意味着要编译打包和重新部署 数据层实现 public class
  • pytorch实现深度学习常用图像分类数据集的划分与读取(Oxford-102flower,CIFAR10/CIFAR100)

    Oxford 102flower花分类数据集 CIFAR10 CIFAR100数据集 Oxford 102flower Oxford 102flower是牛津工程大学于2008年发布的用于图像分类的数据集 总共分为102个类 每个类包含40