通过cifar-10数据集理解numpy数组的高(H)、宽(W)、通道数(C)

1、CIFAR-10数据集介绍

1.1 CIFAR-10数据集的构成

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

  该数据集被分为五个训练集的batch和一个测试集的batch,每个batch有10000张图像。

  测试集的batch包含从每个类中随机选择的1000张图像。

  训练集的batch包含其余的随机顺序的图像,但一些训练集的batch可能包含一个类别的图像多于另一个。
在它们之间,训练集的batch恰好包含了来自每一类的5000张图像。

1.2 batches.meta

  • num_cases_per_batch: 10000
  • label_names: [‘airplane’, ‘automobile’, ‘bird’, ‘cat’, ‘deer’, ‘dog’, ‘frog’, ‘horse’, ‘ship’, ‘truck’]
  • num_vis: 3072

1.3 data_batch_n.py & test_batch.py

  • batch_label
  • labels
  • data
  • filenames

2、获取一张图片的data数据

2.1 反序列化获得numpy数据

# cifar10的数据在python中使用pickle模块序列化并保存在文件中
def unpickle(file):
    import pickle
    with open(file, 'rb') as fo:
        dict = pickle.load(fo, encoding='bytes') 
    return dict

label_loc = '../raw_Data/cifar-10-batches-py/batches.meta'
label_dict = unpickle(label_loc)

pic_loc = '../raw_Data/cifar-10-batches-py/data_batch_1'
pic_dict = unpickle(pic_loc)

  在官网这样介绍data:它保存了10000 × \times × 3072的uint8的numpy数组,一个uint8表示一个字节。该数组的每一行都存储了一个32 × \times × 32的彩色图像。前1024个条目包含红色通道的值,接下来的1024个是绿色,最后的1024个是蓝色。图像是按行主顺序存储的,所以数组的前32个条目是图像红色通道值的第一行。
  行主顺序,顾名思义,就是把图片的宽按顺序存储在数组中。每一个像素代表着一个值(像素点的模糊程度),每一个颜色通道有 (32 × \times × 32) 1024个值。RGB图片一共有三个通道,故每一张图片有 (3 × \times × 1024) 3074个值。

2.2 清楚numpy中的H、W、C的含义

  H、W、C,分别对应numpy数组的三个维度和图片的高、宽、通道数。
  读取data数据,给出直观理解:这是一个三层嵌套的数组,对第一层数组的取len函数,获得的取值是通道数;对第二层数组的取len函数,获得的取值是高度;第三层数组的取len函数,获得的取值是宽度。

import numpy as np
array = np.reshape(pic_dict[b'data'][9999], (3, 32, 32)).astype('uint8') # 当encoding='bytes'时输出的字符串前会带字符b

  下面框起来的是data_batch_1中第10000张图片的通道数,一共有三个:
H
  下面框起来的是图片的高度,一共有32个:
W
  最后框起来的是图片的宽度,一共有32个:
C

2.3 清楚RGB图片在numpy中的表示

  这是处理后的一张cifar-10图片的部分数组。可以清楚地看到,我用红、绿、蓝标好的通道数。该图片是处理后的data_batch_1中的第9999即最后一张图片的BGR格式的numpy数组,处理的代码我将在第三部分给出。

  我按照上图数组的表示,用PPT画了一下这张图片像素的表示:

在这里插入图片描述

3、处理图片数据的代码

import numpy as np
array = np.reshape(pic_dict[b'data'][9999], (3, 32, 32)).astype('uint8')
print(array) ## array.shape 为(3, 32, 32)
# 可以理解成矩阵的转置,下面两个转置步骤可以合并成 array = np.transpose(array, (1, 2, 0))
array = np.transpose(array, (1, 0, 2))
print(array) ## array.shape 为(32, 3, 32)
array = np.transpose(array, (0, 2, 1))
print(array) ## array.shape 为(32, 32, 3)
# RGB变成BGR
# [...,::-1]是对最内层的列表进行逆序取值。array[::-1]表示倒序,实际上array就是一个普通的三维数组
array = array[...,::-1]
print(array)
import cv2
# # 图像是按行主顺序存储的,所以前32个数值是红色通道
cv2.imwrite('图片.png', array)
  1. 难点一:理解np.shape重构一维数组的方法,且为什么要以(3, 32, 32)的方式读取。
  2. 难点二:理解np.transpose的调换x、y、z轴的顺序,转置的目的是变成RGB图片格式的数组。
    我相信在第二部分中的讲解,以及对照代码的分布输出后,你会有一个全新的理解。
    原创不易,如果觉得不错,请给个支持,谢谢。
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

TerryBlog

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值