cifar CIFAR数据集是 Visual Dictionary (Teaching computers to recognize objects) 的子集,由三个教授收集,主要来自google和各类搜索引擎的图片。
备注:cifar官网
1.cifar10 由10个类的60000的32*32彩色图像组成,每个类有6000个图像。有50000个训练图像和10000个测试图像。
类型如下:
2.cifar100 这个数据集和cifar10类似,它有100个类,每个类包含600个图像,600个图像中有500个训练图像和100个测试图像。100类实际是由20个类(每个类又包含5个子类)构成(5*20=100)。
类型如下:
3.数据结构(Python版本)
数据格式如下:
1 2 3 <1×标签> <3072×像素> ... <1×标签> <3072×像素>
第一个字节是第一个图像的标签,它是一个0-9范围内的数字。接下来的3072个字节是图像像素的值。前1024个字节是红色通道值,下1024个绿色,最后1024个蓝色。
二进制版本与CIFAR-10的二进制版本相似,只是每个图像都有两个标签字节(粗略和细小)和3072像素字节,所以二进制文件如下所示:
1 2 3 <1 x粗标签> <1 x精标签> <3072 x像素> ... <1 x粗标签> <1 x精标签> <3072 x像素>
1 2 3 4 5 6 7 8 def unpickle (file ): import pickle with open (file, 'rb' ) as fo: dict = pickle.load(fo, encoding='bytes' ) return dict dict .keys()
4.可视化
pickle模块实现了基本的数据序列化和反序列化。
序列化过程将文本信息转变为二进制数据流,便于存储在硬盘之中,当需要读取文件的时候,从硬盘中读取数据。
反序列可以从文件中得到原始的数据,如字符串、列表、字典等数据。
负责将三色像素合并为一张图片保存
负责将单色道二维数组保存为一张图片
4.1 cifar10可视化: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 import numpy as npfrom PIL import Imageimport pickleimport osimport matplotlib.image as plimgCHANNEL = 3 WIDTH = 32 HEIGHT = 32 data = [] labels=[] classification = ['airplane' ,'automobile' ,'bird' ,'cat' ,'deer' ,'dog' ,'frog' ,'horse' ,'ship' ,'truck' ] for i in range (5 ): with open ("./cifar-10-batches-py/data_batch_" + str (i+1 ),mode='rb' ) as file: data_dict = pickle.load(file, encoding='bytes' ) data+= list (data_dict[b'data' ]) labels+= list (data_dict[b'labels' ]) img = np.reshape(data,[-1 ,CHANNEL, WIDTH, HEIGHT]) data_path = "./pic3/" if not os.path.exists(data_path): os.makedirs(data_path) for i in range (100 ): r = img[i][0 ] g = img[i][1 ] b = img[i][2 ] plimg.imsave("./pic4/" +str (i)+"r" +".png" ,r) plimg.imsave("./pic4/" +str (i)+"g" +".png" ,g) plimg.imsave("./pic4/" +str (i) +"b" +".png" ,b) ir = Image.fromarray(r) ig = Image.fromarray(g) ib = Image.fromarray(b) rgb = Image.merge("RGB" , (ir, ig, ib)) name = "img-" + str (i) +"-" + classification[labels[i]]+ ".png" rgb.save(data_path + name, "PNG" )
4.2 cifar100 cifar100的文件结构和cifar10不同,数据只有一个文件夹里面有50000个图片,且有两个标签,可以从返回的dict的key查看其标签(前文有提到)。
知道其与cifar10后,改写前段代码即可实现。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 import pickle as pimport numpy as npimport matplotlib.pyplot as pltimport matplotlib.image as plimgfrom PIL import Imagedef load_CIFAR_batch (filename ): """ load single batch of cifar """ with open (filename, 'rb' )as f: datadict = p.load(f,encoding='bytes' ) X = datadict[b'data' ] Y = datadict[b'coarse_labels' ]+datadict[b'fine_labels' ] X = X.reshape(50000 , 3 , 32 , 32 ) Y = np.array(Y) return X, Y if __name__ == "__main__" : imgX, imgY = load_CIFAR_batch("./cifar-100-python/train" ) print (imgX.shape) print ("正在保存图片:" ) for i in range (imgX.shape[0 ]): imgs = imgX[i] if i < 100 : img0 = imgs[0 ] img1 = imgs[1 ] img2 = imgs[2 ] i0 = Image.fromarray(img0) i1 = Image.fromarray(img1) i2 = Image.fromarray(img2) img = Image.merge("RGB" ,(i0,i1,i2)) name = "img" + str (i)+".png" img.save("./pic1/" +name,"png" ) for j in range (imgs.shape[0 ]): img = imgs[j] name = "img" + str (i) + str (j) + ".jpg" print ("正在保存图片" + name) plimg.imsave("./pic2/" + name, img) print ("保存完毕." )
注:在另一个文件夹还保存了三色的单通道图