文章目录
- 1、CIFAR-10数据集介绍
- 1.1 CIFAR-10数据集的构成
- 1.2 batches.meta
- 1.3 data_batch_n.py & test_batch.py
- 2、获取一张图片的data数据
- 2.1 反序列化获得numpy数据
- 2.2 清楚numpy中的H、W、C的含义
- 2.3 清楚RGB图片在numpy中的表示
- 3、处理图片数据的代码
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中使用picklec模块序列化并保存在文件中
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数组。该数组的每一行都存储了一个32
×
\times
× 32的彩色图像。前1024个条目包含红色通道的值,接下来的1024个是绿色,最后的1024个是蓝色。图像是按行主顺序存储的,所以数组的前32个条目是图像第一行的红色通道值。
行主顺序,顾名思义,就是把图片的宽按顺序存储在数组中。每一个像素代表着一个值(像素点的模糊程度),每一个颜色通道有 (32
×
\times
× 32) 1024个值。RGB图片一共有三个通道,故每一张图片有 (3
×
\times
× 1024) 3074个值。
2.2 清楚numpy中的H、W、C的含义
长宽高,分别是numpy数组的三个维度。可以这样理解:这是一个三层嵌套的数组,对第一层数组的取len函数,获得的取值是高度;对第二层数组的取len函数,获得的取值是宽度;第三层数组的取len函数,获得的取值是通道数。
读取data数据,给出直观理解:
import numpy as np
array = np.reshape(pic_dict[b'data'][9999], (3, 32, 32)).astype('uint8')
下面框起来的是array数组的高,一共有三个:
下面框起来的是array数组的宽,一共有32个:
最后框起来的是array数组的通道数,一共有32个:
2.3 清楚RGB图片在numpy中的表示
这是处理后的一张cifar-10图片的部分数组。可以清楚地看到,我用红、绿、蓝标好的通道数。该图片是处理后的data_batch_1中的第9999即最后一张图片,处理的代码我将在第三部分给出。
3、处理图片数据的代码
import numpy as np
array = np.reshape(pic_dict[b'data'][9999], (3, 32, 32)).astype('uint8')
print(array)
# 可以理解成矩阵的转置
array = np.transpose(array, (1, 0, 2))
print(array)
array = np.transpose(array, (0, 2, 1))
print(array)
# RGB变成BGR
# [...,::-1]是对最内层的列表进行逆序取值
array = array[...,::-1]
print(array)
import cv2
# # 图像是按行主顺序存储的,所以前32个数值是红色通道
cv2.imwrite('图片.png', array)
- 难点一:理解np.shape重构一维数组的方法,且为什么要以(3, 32, 32)的方式读取。
- 难点二:理解np.transpose的调换x、y、z轴的顺序,转置的目的是变成RGB图片格式的数组。
我相信在第二部分中的讲解,以及对照代码的分布输出后,你会有一个全新的理解。
原创不易,如果觉得不错,请给个支持,谢谢。