pytorh学习笔记——cifar10(一)生成数据

news2024/10/20 14:11:17

        CIFAR(Canadian Institute For Advanced Research)是一个用于图像识别研究的数据集。CIFAR数据集包含多个子数据集,最常用的是CIFAR-10和CIFAR-100。
        CIFAR-10数据集包含60000张32x32彩色图像,分为10个类别,每个类别有6000张图像。这10个类别包括飞机、汽车、鸟类、猫、鹿、狗、青蛙、船和卡车。
        CIFAR-100数据集则包含60000张32x32彩色图像,分为100个类别,每个类别有600张图像。这些类别是按照更细致的分类标准划分的。
        由于CIFAR数据集图像尺寸较小,处理速度较快,适合用于研究和教学。同时,CIFAR数据集也提供了数据的原始像素值和相应的类别标签,方便研究人员进行各种实验和分析。

一、下载和解压数据

数据集的地址:

CIFAR-10 and CIFAR-100 datasets

下载数据集,得到

cifar-10-python.tar.gz这个文件,将其解压缩至当前目录下,它会生成\cifar-10-batches-py这个文件夹,文件夹下的内容为:

 在这个文件夹下再新建两个子文件夹:test和train,用以存放测试和训练的图片。这样,本项目的目录结构和文件内容如图:

二、生成和保存图像文件 

在项目的根目录下新建python脚本unpack.py

1、获取训练用的数据集的所有文件名

import pickle
import glob


def unpickle(file):   # 解压数据,本段代码来自cifar官网 http://www.cs.utoronto.ca/~kriz/cifar.html
    with open(file, 'rb') as fo:
        dict = pickle.load(fo, encoding='bytes')

    return dict


# 输出的类别标签名,从cifar官网可以复制得到  
label_name = ['airplane',
              'automobile',
              'bird',
              'cat',
              'deer',
              'dog',
              'frog',
              'horse',
              'ship',
              'truck']

tran_list = glob.glob('E:\\AI_tset\\cifar10_demo\\cifar-10-python\\cifar-10-batches-py\\data_batch_*')  # 获取所有需要训练的原始数据集文件名
            # “glob.glob ()” 是 Python# 中的一个函数,用于查找符合特定模式的文件路径名。
            # 它返回一个列表,包含所有匹配指定模式的文件路径。
            # 例如,“glob.glob ('*.txt')” 将返回当前目录下所有扩展名为 “.txt” 的文件的路径。

print(tran_list)   # ['E:\\AI_tset\\cifar10_demo\\cifar-10-python\\cifar-10-batches-py\\data_batch_1',
                # 'E:\\AI_tset\\cifar10_demo\\cifar-10-python\\cifar-10-batches-py\\data_batch_2',
                # 'E:\\AI_tset\\cifar10_demo\\cifar-10-python\\cifar-10-batches-py\\data_batch_3',
                # 'E:\\AI_tset\\cifar10_demo\\cifar-10-python\\cifar-10-batches-py\\data_batch_4',
                # 'E:\\AI_tset\\cifar10_demo\\cifar-10-python\\cifar-10-batches-py\\data_batch_5']
print(len(tran_list))  # 5

 从cifar官网可以获得解压数据的函数代码和类别标签的文字列表。至此,获得了训练用的数据集的所有文件名。

2、依次读取文件

# 依次读取每个文件
for l in tran_list:  # 依次读取每个文件
    l_dict = unpickle(l)  # 读取文件,返回一个字典
    print(l_dict.keys())  # dict_keys([b'batch_label', b'labels', b'data', b'filenames'])
    '''这个数据集包含了图像数据和相关的元数据。
    batch_label指的是每个数据批次的标签,
    labels是具体的分类标签,
    data是图像数据,
    而filenames则是图像文件的名称'''
    print(l_dict[b'batch_label'])  # batch 1 of 5...
    print(l_dict[b'labels'][:10])  # [6, 9, 9, 4, 1, 1, 2, 7, 8, 3]  # 类别标签
    print(l_dict[b'data'][:10])  # [102 111 196  77 117 123 134 130 141 135]  # 图像数据
    print(l_dict[b'filenames'][:3])  # [b'compact_car_s_001706.png', b'icebreaker_s_001689.png', b'peke_s_000545.png']  # 文件名

3、转换格式

        这里要知道一下cifar数据集对图像数据的存储方式:CIFAR-10数据集的data字段存储格式是原始的二进制数据,这些数据代表图像的像素值。每个图像都是32x32像素的彩色图像,因此每个图像有3072个字节(32x32x3),其中每个字节代表一个颜色通道(红、绿、蓝)的一个像素值。
        具体来说,CIFAR-10数据集的data字段中,每3072个连续的字节(32x32x3)代表一张图像。
        这3072个字节被分为三个部分,每个部分1024(32x32)个字节,分别对应图像的红、绿、蓝三个颜色通道。
        每个颜色通道的1024个字节又被进一步分为32块,每个块包含32个字节,对应图像中的一行中的所有像素(每个像素是1列),这样的行共有32行。
        例如,对于第一张图像,前1024个字节代表红色通道,接下来的1024个字节代表绿色通道,最后的1024个字节代表蓝色通道。
        在Python中,将这些数据以NumPy数组的形式存储和处理,数组的形状为(3072,),将其重塑为(3, 32, 32)的形状,以便于进行图像处理和显示。
        进一步的,为了在opencv中处理图像,又将数组转置成opencv的形状。

# 依次读取每个文件
for l in tran_list:  # 依次读取每个文件
    l_dict = unpickle(l)  # 读取文件,返回一个字典
    # print(l_dict.keys())  # dict_keys([b'batch_label', b'labels', b'data', b'filenames'])
    '''这个数据集包含了图像数据和相关的元数据。
    batch_label指的是每个数据批次的标签,
    labels是具体的分类标签,
    data是图像数据,
    而filenames则是图像文件的名称'''
    # print(l_dict[b'batch_label'])  # batch 1 of 5...
    # print(l_dict[b'labels'][:10])  # [6, 9, 9, 4, 1, 1, 2, 7, 8, 3]  # 类别标签
    # print(l_dict[b'data'][:10])  # [102 111 196  77 117 123 134 130 141 135]  # 图像数据
    # print(l_dict[b'filenames'][:3])  # [b'compact_car_s_001706.png', b'icebreaker_s_001689.png', b'peke_s_000545.png']  # 文件名
    for im_idx, im_data in enumerate(l_dict[b'data']):  # 依次读取每个文件中的图像数据])
        im_data = im_data.reshape(3, 32, 32).transpose(1, 2, 0)  # 转换格式并生成图像数据
        '''在CIFAR-10数据集中,图像数据的原始存储格式是(3, 32, 32),这意味着每个图像有三个维度:红色通道、绿色通道和蓝色通道,
        每个通道都是一个32x32的矩阵。这种格式是为了方便按通道存储和处理数据。然而,在大多数图像处理库中,如Pillow或OpenCV,
        图像通常以(高度, 宽度, 通道)的格式存储,即(32, 32, 3)。这样的格式更符合人们直观上对图像的理解,即先看到高度,然后是宽度,
        最后是颜色通道。因此,代码中的im_data.reshape(3, 32, 32).transpose(1, 2, 0)操作是为了将数据从CIFAR-10的原始存储
        格式(3, 32, 32)转换为更通用的图像处理格式(32, 32, 3)。transpose(1, 2, 0)操作就是将三个维度重新排列,使得高度成为第
        一个维度,宽度成为第二个维度,通道成为第三个维度。'''
        im_label = l_dict[b'labels'][im_idx]  # 获取类别标签
        print(label_name[im_label])
        cv2.imshow('show', cv2.resize(im_data, (100, 100)))  # 显示图像
        cv2.waitKey(0)  # 等待按键

运行之后:

至此,已经把元数据转换为图像数据。

4、保存图像:

im_name = l_dict[b'filenames'][im_idx]  # 获取文件名
        dir_name = 'E:\\AI_tset\\cifar10_demo\\cifar-10-python\\cifar-10-batches-py\\train\\'+label_name[im_label]  # 当前类别文件夹名
        if not os.path.exists(dir_name):  # 如果不存在
            os.makedirs(dir_name)  # 创建文件夹

        cv2.imwrite(dir_name+'\\'+im_name.decode('utf-8')+'.png', im_data)  # 保存图像

 这样,就会创建每个分类的文件夹,并在文件夹中存储了所有的图像文件

其中一个文件夹中的图像文件: 

 当前进度的所有代码:

import pickle
import glob
import numpy as np
import cv2


# 解压数据,本段代码来自cifar官网 http://www.cs.utoronto.ca/~kriz/cifar.html
def unpickle(file):
    with open(file, 'rb') as fo:
        dict = pickle.load(fo, encoding='bytes')

    return dict


# 输出的类别标签名,从cifar官网可以复制得到
label_name = ['airplane',
              'automobile',
              'bird',
              'cat',
              'deer',
              'dog',
              'frog',
              'horse',
              'ship',
              'truck']

# 获取所有需要训练的原始数据集文件名
tran_list = glob.glob('E:\\AI_tset\\cifar10_demo\\cifar-10-python\\cifar-10-batches-py\\data_batch_*')  # 获取所有需要训练的原始数据集文件名
            # “glob.glob ()” 是 Python# 中的一个函数,用于查找符合特定模式的文件路径名。
            # 它返回一个列表,包含所有匹配指定模式的文件路径。
            # 例如,“glob.glob ('*.txt')” 将返回当前目录下所有扩展名为 “.txt” 的文件的路径。

# print(tran_list)   # ['E:\\AI_tset\\cifar10_demo\\cifar-10-python\\cifar-10-batches-py\\data_batch_1',
                # 'E:\\AI_tset\\cifar10_demo\\cifar-10-python\\cifar-10-batches-py\\data_batch_2',
                # 'E:\\AI_tset\\cifar10_demo\\cifar-10-python\\cifar-10-batches-py\\data_batch_3',
                # 'E:\\AI_tset\\cifar10_demo\\cifar-10-python\\cifar-10-batches-py\\data_batch_4',
                # 'E:\\AI_tset\\cifar10_demo\\cifar-10-python\\cifar-10-batches-py\\data_batch_5']
# print(len(tran_list))  # 5

# 依次读取每个文件
for l in tran_list:  # 依次读取每个文件
    l_dict = unpickle(l)  # 读取文件,返回一个字典
    # print(l_dict.keys())  # dict_keys([b'batch_label', b'labels', b'data', b'filenames'])
    '''这个数据集包含了图像数据和相关的元数据。
    batch_label指的是每个数据批次的标签,
    labels是具体的分类标签,
    data是图像数据,
    而filenames则是图像文件的名称'''
    # print(l_dict[b'batch_label'])  # batch 1 of 5...
    # print(l_dict[b'labels'][:10])  # [6, 9, 9, 4, 1, 1, 2, 7, 8, 3]  # 类别标签
    # print(l_dict[b'data'][:10])  # [102 111 196  77 117 123 134 130 141 135]  # 图像数据
    # print(l_dict[b'filenames'][:3])  # [b'compact_car_s_001706.png', b'icebreaker_s_001689.png', b'peke_s_000545.png']  # 文件名
    for im_idx, im_data in enumerate(l_dict[b'data']):  # 依次读取每个文件中的图像数据])
        im_data = im_data.reshape(3, 32, 32).transpose(1, 2, 0)  # 转换格式并生成图像数据
        '''在CIFAR-10数据集中,图像数据的原始存储格式是(3, 32, 32),这意味着每个图像有三个维度:红色通道、绿色通道和蓝色通道,
        每个通道都是一个32x32的矩阵。这种格式是为了方便按通道存储和处理数据。然而,在大多数图像处理库中,如Pillow或OpenCV,
        图像通常以(高度, 宽度, 通道)的格式存储,即(32, 32, 3)。这样的格式更符合人们直观上对图像的理解,即先看到高度,然后是宽度,
        最后是颜色通道。因此,代码中的im_data.reshape(3, 32, 32).transpose(1, 2, 0)操作是为了将数据从CIFAR-10的原始存储
        格式(3, 32, 32)转换为更通用的图像处理格式(32, 32, 3)。transpose(1, 2, 0)操作就是将三个维度重新排列,使得高度成为第
        一个维度,宽度成为第二个维度,通道成为第三个维度。'''
        im_label = l_dict[b'labels'][im_idx]  # 获取类别标签
        print(label_name[im_label])
        cv2.imshow('show', cv2.resize(im_data, (100, 100)))  # 显示图像
        cv2.waitKey(0)  # 等待按键

4、转换测试集图片 

将上述代码稍加修改,转换测试集图片:

import os
import pickle
import glob
import numpy as np
import cv2


# 解压数据,本段代码来自cifar官网 http://www.cs.utoronto.ca/~kriz/cifar.html
def unpickle(file):
    with open(file, 'rb') as fo:
        dict = pickle.load(fo, encoding='bytes')

    return dict


# 输出的类别标签名,从cifar官网可以复制得到
label_name = ['airplane',
              'automobile',
              'bird',
              'cat',
              'deer',
              'dog',
              'frog',
              'horse',
              'ship',
              'truck']

# 获取所有需要训练的原始数据集文件名
tran_list = glob.glob('E:\\AI_tset\\cifar10_demo\\cifar-10-python\\cifar-10-batches-py\\test_batch*')  # 获取所有需要训练的原始数据集文件名
            # “glob.glob ()” 是 Python# 中的一个函数,用于查找符合特定模式的文件路径名。
            # 它返回一个列表,包含所有匹配指定模式的文件路径。
            # 例如,“glob.glob ('*.txt')” 将返回当前目录下所有扩展名为 “.txt” 的文件的路径。

# print(tran_list)   # ['E:\\AI_tset\\cifar10_demo\\cifar-10-python\\cifar-10-batches-py\\data_batch_1',
                # 'E:\\AI_tset\\cifar10_demo\\cifar-10-python\\cifar-10-batches-py\\data_batch_2',
                # 'E:\\AI_tset\\cifar10_demo\\cifar-10-python\\cifar-10-batches-py\\data_batch_3',
                # 'E:\\AI_tset\\cifar10_demo\\cifar-10-python\\cifar-10-batches-py\\data_batch_4',
                # 'E:\\AI_tset\\cifar10_demo\\cifar-10-python\\cifar-10-batches-py\\data_batch_5']
# print(len(tran_list))  # 5

# 依次读取每个文件
for l in tran_list:  # 依次读取每个文件
    l_dict = unpickle(l)  # 读取文件,返回一个字典
    # print(l_dict.keys())  # dict_keys([b'batch_label', b'labels', b'data', b'filenames'])
    '''这个数据集包含了图像数据和相关的元数据。
    batch_label指的是每个数据批次的标签,
    labels是具体的分类标签,
    data是图像数据,
    而filenames则是图像文件的名称'''
    # print(l_dict[b'batch_label'])  # batch 1 of 5...
    # print(l_dict[b'labels'][:10])  # [6, 9, 9, 4, 1, 1, 2, 7, 8, 3]  # 类别标签
    # print(l_dict[b'data'][:10])  # [102 111 196  77 117 123 134 130 141 135]  # 图像数据
    # print(l_dict[b'filenames'][:3])  # [b'compact_car_s_001706.png', b'icebreaker_s_001689.png', b'peke_s_000545.png']  # 文件名
    for im_idx, im_data in enumerate(l_dict[b'data']):  # 依次读取每个文件中的图像数据])
        im_data = im_data.reshape(3, 32, 32).transpose(1, 2, 0)  # 转换格式并生成图像数据
        '''在CIFAR-10数据集中,图像数据的原始存储格式是(3, 32, 32),这意味着每个图像有三个维度:红色通道、绿色通道和蓝色通道,
        每个通道都是一个32x32的矩阵。这种格式是为了方便按通道存储和处理数据。然而,在大多数图像处理库中,如Pillow或OpenCV,
        图像通常以(高度, 宽度, 通道)的格式存储,即(32, 32, 3)。这样的格式更符合人们直观上对图像的理解,即先看到高度,然后是宽度,
        最后是颜色通道。因此,代码中的im_data.reshape(3, 32, 32).transpose(1, 2, 0)操作是为了将数据从CIFAR-10的原始存储
        格式(3, 32, 32)转换为更通用的图像处理格式(32, 32, 3)。transpose(1, 2, 0)操作就是将三个维度重新排列,使得高度成为第
        一个维度,宽度成为第二个维度,通道成为第三个维度。'''
        im_label = l_dict[b'labels'][im_idx]  # 获取类别标签
        # print(label_name[im_label])
        # cv2.imshow('show', cv2.resize(im_data, (100, 100)))  # 显示图像
        # cv2.waitKey(0)  # 等待按键
        # with open(im_name, 'wb') as fo:  # 保存图像
        #     fo.write(im_data)  # 写入图像数据
        im_name = l_dict[b'filenames'][im_idx]  # 获取文件名
        dir_name = 'E:\\AI_tset\\cifar10_demo\\cifar-10-python\\cifar-10-batches-py\\test\\'+label_name[im_label]  # 当前类别文件夹名
        if not os.path.exists(dir_name):  # 如果不存在
            os.makedirs(dir_name)  # 创建文件夹

        cv2.imwrite(dir_name+'\\'+im_name.decode('utf-8')+'.png', im_data)  # 保存图像

执行上述脚本,得到测试集的图片集。

 三、

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

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

相关文章

SpringCloud无介绍快使用,单机Eureka服务注册中心cloud-eureka-server7001搭建(十)

TOC 问题背景 从零开始学springcloud微服务项目 注意事项: 约定 > 配置 > 编码IDEA版本2021.1这个项目,我分了很多篇章,每篇文章一个操作步骤,目的是显得更简单明了controller调service,service调dao项目源码以及…

Python学习的自我理解和想法(17)

学的是b站的课程(千锋教育),跟老师写程序,不是自创的代码! 今天是学Python的第17天,学的内容是面向对象设计。开学了,时间不多,写得不多,见谅。 目录 1.面向对象入门 …

基于PHP+MySQL+Vue的网上订餐系统

摘要 本文介绍了一个基于PHPMySQLVue技术的网上订餐系统。该系统旨在为用户提供便捷的在线订餐服务,同时提高餐厅的运营效率。系统后端采用PHP语言开发,利用MySQL数据库进行数据存储与管理,实现了用户注册登录、菜品浏览、购物车管理、订单提…

es kibana .logstash离线集群安装

es离线集群安装 下载对应的版本一般看你客户端引用的是什么版本我这里下载的是7.6.2 官方下载地址:https://www.elastic.co/cn/downloads/elasticsearch 源码安装-环境准备:在etc/hosts文件添加3台主机 node-001 192.168.1.81 node-002 19…

图像中的数值计算

目录 图像读取与形状图像数据展示图像数据操作超出范围的像素值处理 图像读取与形状 使用cv2.imread函数读取图像文件。图像的形状通过shape属性获取,格式为(高度, 宽度, 颜色通道数)。 import cv2img1 cv2.imread(bg.jpg) img2 cv2.imread(fish.jpg)print(img1…

微信小程序:miniprogram-ci自动打包工具使用介绍以及支持配置环境变量、jekins打包、taro、uni-app三方工具

微信小程序:miniprogram-ci自动打包工具使用介绍以及支持配置环境变量、jekins打包、taro、uni-app三方工具 背景介绍 一直都是本地电脑运行微信开发者工具打包上传。多项目中新老版本对node版本要求不一致,老是切来切去。而且同一个人开发上传需要打包…

求最大公约数(c语言)

先看题👇 我这里介绍的方法:辗转相除法: 最大公约数: 最大公约数是指同时能整除俩个或更多整数的最大正整数。 欧几里得算法就是求最大公约数的算法 求最大公约数涉及到一个数学原理的转换: 俩个数的最大公约数等于其中一个数和…

关于我、重生到500年前凭借C语言改变世界科技vlog.7——数组函数实践

文章目录 扫雷游戏专题1.扫雷游戏的设计分析1.1 棋盘1.2 文件 2.扫雷游戏的实现3.扫雷游戏的扩展 希望读者们多多三连支持小编会继续更新你们的鼓励就是我前进的动力! 扫雷游戏专题 掌握了前面的数组与函数的知识,我们可以制作一款大多电脑上都有的简易…

公交信息在线查询系统|基于java和小程序的公交信息在线查询系统小程序设计与实现(源码+数据库+文档)

公交信息在线查询系统小程序 目录 基于java和小程序的公交信息在线查询系统小程序设计与实现 一、前言 二、系统功能设计 三、系统实现 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取: 博主介绍:✌️大厂…

解锁文本数据可视化的无限可能:Wordcloud库全解析

文章目录 **🌟解锁文本数据可视化的无限可能:Wordcloud库全解析🔐**1. **背景介绍**2. **Wordcloud库是什么?**3. **如何安装Wordcloud库?**4. **Wordcloud库的基本函数使用方法**5. **实际应用场景**6. **常见问题及解…

VUE 仿神州租车-开放平台

项目背景: 神州租车是一家提供汽车租赁服务的公司,其API开放平台为开发者提供了访问神州租车相关服务和数据的接口。用VUE技术来仿照其开发平台。 成果展示: 首页: API文档: 关于我们:

MyBatis实践:提高持久层数据处理效率

文章目录 1 Mybatis简介1.1 简介1.2 持久层框架对比 2 快速入门2.1 准备数据库2.2 项目搭建2.3 依赖导入2.4 准备MyBatis配置文件2.5 实体类准备2.6 准备Mapper接口和MapperXML文件2.7 运行和测试 3. 核心配置文件4. MyBatis进阶使用4.0 以包为单位,引入所有的映射文…

算法Day-4

24. 两两交换链表中的节点 给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。 示例 1: 输入:head [1,2,…

Windows10去掉隐藏文件仍找不到hosts文件的解决办法

正常情况下hosts文件在目录C:\Windows\System32\drivers\etc中,最近新装的Windows10系统发现该目录下没有hosts文件。 执行如下命令hosts文件出现: 执行 for /f %P in (dir %windir%\WinSxS\hosts /b /s) do copy %P %windir%\System32\drivers\etc &am…

ubuntu 20.04 网卡启用后,只有ipv6 没有 ipv4 无法上网

🏆本文收录于《全栈Bug调优(实战版)》专栏,主要记录项目实战过程中所遇到的Bug或因后果及提供真实有效的解决方案,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&am…

JS | JS之深入理解客户区尺寸client系列属性

目录 一、客户区大小 clientHeight clientWidth clientLeft clientTop 二、页面大小 三、注意事项 关于元素尺寸,一般地,有偏移大小offset、客户区大小client和滚动大小scroll。前文已经介绍过偏移属性,后文将介绍scroll滚动大小&…

责任链模式下,解决开闭原则问题实践

前言 在现代软件工程中,设计模式是解决常见问题的有效工具之一。它们吸收了前人的经验,不仅帮助开发者编写更清晰、更可维护的代码,还能促进团队之间的沟通和协作。责任链模式(Chain of Responsibility Pattern)作为一…

C语言 | Leetcode C语言题解之第485题最大连续1的个数

题目&#xff1a; 题解&#xff1a; int findMaxConsecutiveOnes(int* nums, int numsSize) {int maxCount 0, count 0;for (int i 0; i < numsSize; i) {if (nums[i] 1) {count;} else {maxCount fmax(maxCount, count);count 0;}}maxCount fmax(maxCount, count);…

最近网站频繁跳转到黑产网站,怀疑是51.la统计代码的问题

最近我的几个网站&#xff0c;都出现了一个问题&#xff0c;就是访问的时候会莫名其妙的跳转到黑产网站。 通过排查了网页代码&#xff0c;发现网页都有一个共同点&#xff0c;就是使用了51.la统计。为什么会怀疑是51la统计代码问题&#xff1f;因为我的网页只有统计代码外没有…

Vulnhub打靶-jangow

基本信息 靶机下载&#xff1a;https://www.vulnhub.com/entry/jangow-101,754/ 攻击机器&#xff1a;192.168.20.128&#xff08;Windows操作系统&#xff09;& 192.168.20.138&#xff08;kali&#xff09; 提示信息&#xff1a;这个框的秘密是枚举&#xff01; 靶机…