CIFAR-10数据集
⼀、CIFAR-10
CIFAR-10数据集由10类32x32的彩⾊图⽚组成,⼀共包含60000张图⽚,每⼀类包含6000图⽚。其中50000张图⽚作为训练
集,10000张图⽚作为测试集。
CIFAR-10数据集被划分成了5个训练的batch和1个测试的batch,每个batch均包含10000张图⽚。测试集batch的图⽚是从每个类别中随机挑选的1000张图⽚组成的,训练集batch以随机的顺序包含剩下的50000张图⽚。不过⼀些训练集batch可能出现包含某⼀类图⽚⽐其他类的图⽚数量多的情况。训练集batch包含来⾃每⼀类的5000张图⽚,⼀共50000张训练图⽚。
下图显⽰的是数据集的类,以及每⼀类中随机挑选的10张图⽚:
⼆、CIFAR-10数据集解析
官⽅给出了多个CIFAR-10数据集的版本,以下是链接:
Version    Size    md5sum
CIFAR-10 python version    163 MB    c58f30108f718f92721af3b95e74349a
CIFAR-10 Matlab version    175 MB    70270af85842c9e89bb428ec9976c926
CIFAR-10 binary version (suitable for C programs)    162 MB    c32a1d4ab5d03f1284b67883e8d87530
此处我们下载python版本。
下载完成后,解压,得到如下⽬录结构的⽂件夹:
其中:
名称作⽤
data_batch_1训练集的第⼀个batch,含有10000张图⽚
data_batch_2训练集的第⼆个batch,含有10000张图⽚
data_batch_3训练集的第三个batch,含有10000张图⽚
data_batch_4训练集的第四个batch,含有10000张图⽚
data_batch_5训练集的第五个batch,含有10000张图⽚
readme.html⽹页⽂件,程序中不需要使⽤该⽂件
readme.html⽹页⽂件,程序中不需要使⽤该⽂件
test_batch测试集的batch,含有10000张图⽚
名称作⽤
上述⽂件结构中,每⼀个batch⽂件包含⼀个python的字典(dict)结构,结构如下:
名称作⽤
b’data’ 是⼀个10000x3072的array,每⼀⾏的元素组成了⼀个32x32的3通道图⽚,共10000张
b’labels’⼀个长度为10000的list,对应包含data中每⼀张图⽚的label
b’batch_label’ 这⼀份batch的名称
b’filenames’⼀个长度为10000的list,对应包含data中每⼀张图⽚的名称
真正重要的两个关键字是data和labels,剩下的两个并不是⼗分重要。
# -*- coding: utf-8 -*-
"""
Created on Wed Apr 11 14:51:27 2018
@author: Administrator
"""
'''
⽤于加载数据集合
数据集下载地址:o.edu/~kriz/
CIFAR-10数据集介绍:blog.csdn/davincil/article/details/78793067
⼀、CIFAR-10
CIFAR-10数据集由10类32x32的彩⾊图⽚组成,⼀共包含60000张图⽚,每⼀类包含6000图⽚。其中50000张图⽚作为训练集,10000张图⽚作为测试集。
CIFAR-10数据集被划分成了5个训练的batch和1个测试的batch,每个batch均包含10000张图⽚。
测试集batch的图⽚是从每个类别中随机挑选的1000张图⽚组成的,⼀共10000张测试图⽚,
训练集batch包含来⾃每⼀类的5000张图⽚,⼀共50000张训练图⽚。
训练集batch以随机的顺序包含剩下的50000张图⽚。
不过⼀些训练集batch可能出现包含某⼀类图⽚⽐其他类的图⽚数量多的情况。
'''
'''
⽂件下载之后,解压主要包括以下⽂件
名称作⽤
data_batch_1    训练集的第⼀个batch,含有10000张图⽚
data_batch_2    训练集的第⼆个batch,含有10000张图⽚
data_batch_3    训练集的第三个batch,含有10000张图⽚
data_batch_4    训练集的第四个batch,含有10000张图⽚
data_batch_5    训练集的第五个batch,含有10000张图⽚
readme.html    ⽹页⽂件,程序中不需要使⽤该⽂件
test_batch    测试集的batch,含有10000张图⽚
上述⽂件结构中,每⼀个batch⽂件包含⼀个python的字典(dict)结构,结构如下:
上述⽂件结构中,每⼀个batch⽂件包含⼀个python的字典(dict)结构,结构如下:
名称作⽤
b'data’          是⼀个10000x3072的array,每⼀⾏的元素组成了⼀个32x32的3通道图⽚,共10000张
b'labels’          ⼀个长度为10000的list,对应包含data中每⼀张图⽚的label
b'batch_label' 这⼀份batch的名称
b'filenames'      ⼀个长度为10000的list,对应包含data中每⼀张图⽚的名称
'''
import pickle
import numpy as np
import cv2
from skimage import io
class datagenerator(object):
def __init__(self):
pass
def unpickle(self,filename):
'''
batch⽂件中真正重要的两个关键字是data和labels
反序列化出对象
每⼀个batch⽂件包含⼀个python的字典(dict)结构,结构如下:
名称作⽤
b'data’          是⼀个10000x3072的array,每⼀⾏的元素组成了⼀个32x32的3通道图⽚,共10000张
b'labels’          ⼀个长度为10000的list,对应包含data中每⼀张图⽚的label
b'batch_label' 这⼀份batch的名称
b'filenames'      ⼀个长度为10000的list,对应包含data中每⼀张图⽚的名称
'''
with open(filename,'rb')  as  f:
#默认把字节转换为ASCII编码这⾥设置encoding='bytes'直接读取字节数据因为⾥⾯含有图⽚像素数据⼤⼩从0-255 不能解码为ascii编码,因此先转换成字节            dic = pickle.load(f,encoding='bytes')
return dic
def get_image(self,image):
'''
提取每个通道的数据,进⾏重新排列,最后返回⼀张32x32的3通道的图⽚
在字典结构中,每⼀张图⽚是以被展开的形式存储(即⼀张32x32的3通道图⽚被展开成了3072长度的list),
每⼀个数据的格式为uint8,前1024个数据表⽰红⾊通道,接下来的1024个数据表⽰绿⾊通道,最后的1024
个通道表⽰蓝⾊通道。
image:每⼀张图⽚的数据数据按照R,G,B通道依次排列长度为3072
'''
assert len(image) == 3072
#对list进⾏切⽚操作,然后reshape
r = image[:1024].reshape(32,32,1)
g = image[1024:2048].reshape(32,32,1)
b = image[2048:].reshape(32,32,1)
#numpy提供了atenate((a1,a2,...), axis=0)函数。能够⼀次完成多个数组的拼接。其中a1,a2,...是数组类型的参数
#沿着某个轴拼接,默认为列⽅向(axis=0)
img = np.concatenate((r,g,b),-1)
return img
def get_data_by_keyword(self,keyword,filelist=[],normalized=False,size=(32,32),one_hot=False):
'''
按照给出的关键字提取batch中的数据(默认是训练集的所有数据)
args:
keyword:'data’ 或 'labels’ 或  'batch_label' 或  'filenames' 表⽰需要返回的项
filelist:list 表⽰要读取的⽂件集合
normalized:当keyword = 'data',表⽰是否需要归⼀化
normalized:当keyword = 'data',表⽰是否需要归⼀化
size:当keyword = 'data',表⽰需要返回的图⽚的尺⼨
one_hot:当keyword = 'labels'时,one_hot=Flase,返回实际标签  True时返回⼆值化后的标签
return:
keyword = 'data' 返回像素数据
keyword = 'labels' 返回标签数据
keyword = 'batch_label' 返回batch的名称
keyword = 'filenames' 返回图像⽂件名
'''
#keyword编码为字节
keyword = de('ascii')
assert keyword in [b'data',b'labels',b'batch_label',b'filenames']
assert type(filelist) is list and len(filelist) != 0
assert type(normalized) is bool
assert type(size) is tuple or type(size) is list
ret = []
for i in range(len(filelist)):
#反序列化出对象
dic = self.unpickle(filelist[i])
if keyword == b'data':
#b'data’          是⼀个10000x3072的array,每⼀⾏的元素组成了⼀个32x32的3通道图⽚,共10000张                #合并成⼀个数组
for item in dic[b'data']:
ret.append(item)
print('总长度:',len(ret))
elif keyword == b'labels':
#b'labels’          ⼀个长度为10000的list,对应包含data中每⼀张图⽚的label
#合并成⼀个数组
for item in dic[b'labels']:
ret.append(item)
elif keyword == b'batch_label':
#b'batch_label' 这⼀份batch的名称
#合并成⼀个数组
for item in dic[b'batch_label']:
ret.append(item.decode('ascii'))    #把数据转换为ascii编码
else:
#b'filenames'      ⼀个长度为10000的list,对应包含data中每⼀张图⽚的名称
#合并成⼀个数组
for item in dic[b'filenames']:
ret.append(item.decode('ascii'))    #把数据转换为ascii编码
if keyword == b'data':
if normalized == False:
array = np.ndarray([len(ret),size[0],size[1],3],dtype = np.float32)
#遍历每⼀张图⽚数据
for i in range(len(ret)):
#图像进⾏缩放
array[i] = _image(ret[i]),size)
return array
else:
array = np.ndarray([len(ret),size[0],size[1],3],dtype = np.float32)
#遍历每⼀张图⽚数据
#遍历每⼀张图⽚数据
for i in range(len(ret)):
array[i] = _image(ret[i]),size)/255
return array
pass
elif keyword == b'labels':
#⼆值化标签
if one_hot == True:
#类别
depth = 10
m = np.zeros([len(ret),depth])
for i in range(len(ret)):
m[i][ret[i]] = 1
return m
pass
#其它keyword直接返回
return ret
import os
import pickle
def  save_images():
'''
报CIFAR-10数据集图⽚提取出来保存下来
1.创建⼀个⽂件夹 CIFAR-10-data 包含两个⼦⽂件夹test,train
2.在⽂⾰⼦⽂件夹创建10个⽂件夹⽂件名依次为0-9  对应10个类别
3.训练集数据⽣成bmp格式⽂件,存在对应类别的⽂件下
4.测试集数据⽣成bmp格式⽂件,存在对应类别的⽂件下
⽣成两个⽂件train_label.pkl,test_label.pkl 分别保存相应的图⽚⽂件路径以及对应的标签    '''
#根⽬录
root = 'CIFAR-10-data'
#如果存在该⽬录说明数据存在
if os.path.isdir(root):
print(root+'⽬录已经存在!')
return
'''
如果⽂件夹不存在创建⽂件夹
'''
#'data'⽬录不存在,创建⽬录
os.mkdir(root)
#创建⽂件失败
if not os.path.isdir(root):
print(root+'⽬录创建失败!')
return
#创建'test'和'train'⽬录以及⼦⽂件夹
train = os.path.join(root,'train')
os.mkdir(train)import pickle
if os.path.isdir(train):
for i in range(10):
name = os.path.join(train,str(i))
os.mkdir(name)
test = os.path.join(root,'test')
os.mkdir(test)
if os.path.isdir(test):
for i in range(10):
name = os.path.join(test,str(i))

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。