读取Cifar10数据 还原成图片时错位失真 问题发现及解决
背景
在下载了cifar10的数据后 进行了还原图像的处理,使用的是二进制文件的处理方式
但是还原出来的图片失真错位
解决
每个图片的名字包括了 类别_序号.jpg
类别范围0-9
很显然数据是错误的
再次看了下载的数据 发现自己下载到的是python格式的数据~~~囧
官网说明:http://www.cs.toronto.edu/~kriz/cifar.html
cifar10 提供了三种不同类型的数据格式
python version, matlab version 以及 binary version
具体数据下载地址
python version:http://www.cs.toronto.edu/~kriz/cifar-10-python.tar.gz
matlab version:http://www.cs.toronto.edu/~kriz/cifar-10-matlab.tar.gz
binary version:http://www.cs.toronto.edu/~kriz/cifar-10-binary.tar.gz
python/matlab的格式是一致的:
包含了data_batch_1, data_batch_2, …, data_batch_5以及test_batch
通过下述函数可以解析 的到一个dict
def unpickle(file):
import pickle
with open(file, 'rb') as fo:
dict = pickle.load(fo, encoding='bytes')
return dict
这个字典的格式如下:
- data —一个100003072的numpy数组,数据类型是无符号整形uint8。这个数组的每一行存储了3232大小的彩色图像(32323通道=3072)。前1024个数是red通道,然后分别是green,blue。另外,图像是以行的顺序存储的,也就是说前32个数就是这幅图的像素矩阵的第一行。
- labels —一个范围在0-9的含有10000个数的列表(一维的数组)。第i个数就是第i个图像的类标。
此外除了data_batch外还有一个batches.meta的文件也可解析成字典
- label_names — 一个包含10个元素的列表,每一个描述了labels array中每个数字对应类标的名字。比如:label_names[0] = “airplane”, label_names[1] = “automobile”
binary格式:
包含了data_batch_1.bin, data_batch_2.bin, …, data_batch_5.bin, 以及 test_batch.bin. (注意.bin结尾)
格式如下
<1 x label><3072 x pixel>
...
<1 x label><3072 x pixel>
也就是说,第一个字节是指类标,在0-9之间。接下来就是3072个字节,内容与上面python版本的的一样。每个文件都有10000这样的3073个字节,没有任何分隔行,所以每个文件都是30730000字节的长度。
这就是对cifar10数据的格式介绍
当时就是因为在下载时没有仔细查看下下来的格式类型 导致了用binary的处理方式去处理了python的数据 从而图像失真错位
重新下载了binary格式的数据 再一次解析图片 成功!