cifar10和cifar100(简介&可视化)

cifar

CIFAR数据集是 Visual Dictionary
(Teaching computers to recognize objects)
的子集,由三个教授收集,主要来自google和各类搜索引擎的图片。

备注:cifar官网

1.cifar10

由60000张32*32彩色图像组成,图像有10个类,每个类有6000个图像。分别包含有50000个训练图像和10000个测试图像。

类型如下:
image.png

2.cifar100

这个数据集和cifar10类似,它有100个类,每个类包含600个图像,600个图像中有500个训练图像和100个测试图像。100类实际是由20个类(每个类又包含5个子类)构成(5*20=100)。

类型如下:

image.png

3.数据结构(Python版本)

  • cifar10

数据格式如下:

<1×标签> <3072×像素>
...
<1×标签> <3072×像素>

第一个字节是第一个图像的标签,它是一个0-9范围内的数字。接下来的3072个字节是图像像素的值。前1024个字节是红色通道值,下1024个绿色,最后1024个蓝色。

  • CIFAR-100

二进制版本与CIFAR-10的二进制版本相似,只是每个图像都有两个标签字节(粗略和细小)和3072像素字节,所以二进制文件如下所示:

<1 x粗标签> <1 x精标签> <3072 x像素>
...
<1 x粗标签> <1 x精标签> <3072 x像素>
#查看cifar100 python版本的数据结构
def unpickle(file):
    import pickle
    with open(file, 'rb') as fo:
        dict = pickle.load(fo, encoding='bytes')
    return dict
dict.keys()
#dict_keys([b'data', b'coarse_labels', b'fine_labels', b'filenames', b'batch_label'])

4.可视化

  • pickle模块

pickle模块实现了基本的数据序列化和反序列化。

序列化过程将文本信息转变为二进制数据流,便于存储在硬盘之中,当需要读取文件的时候,从硬盘中读取数据。

反序列可以从文件中得到原始的数据,如字符串、列表、字典等数据。

  • PIL

负责将三色像素合并为一张图片保存

  • matplotlib.image

负责将单色道二维数组保存为一张图片

4.1 cifar10可视化:


import numpy as np
from PIL import Image
import pickle
import os
import matplotlib.image as plimg


CHANNEL = 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")


image.png

4.2 cifar100

cifar100的文件结构和cifar10不同,数据只有一个文件夹里面有50000个图片,且有两个标签,可以从返回的dict的key查看其标签(前文有提到)。

知道其与cifar10后,改写前段代码即可实现。

# -*- coding:utf-8 -*-
import pickle as p
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.image as plimg
from PIL import Image

def 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'labels']
        #X = X.reshape(10000, 3, 32, 32)
        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-10-batches-py/data_batch_1")
    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:#只循环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")#文件夹下是RGB融合后的图像
            for j in range(imgs.shape[0]):
                img = imgs[j]
                name = "img" + str(i) + str(j) + ".jpg"
                print("正在保存图片" + name)
                plimg.imsave("./pic2/" + name, img)#文件夹下是RGB分离的图像
    print("保存完毕.")

[外链图片转存失败(img-vMNeaU8u-1567075458067)(https://i.loli.net/2019/08/29/JZAy5uDpw71GtYP.png)]

注:在另一个文件夹还保存了三色的单通道图

  • 24
    点赞
  • 85
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
CIFAR-10 是一个图像分类数据集,包含 10 个类别,每个类别有 6000 张尺寸为 32x32 的彩色图像。下面是 CIFAR-10 数据集的可视化方法: 首先,导入必要的库和数据集: ```python import numpy as np import matplotlib.pyplot as plt from keras.datasets import cifar10 # 加载数据集 (x_train, y_train), (x_test, y_test) = cifar10.load_data() ``` 然后,定义一个标签字典以及一个函数来显示图像和标签: ```python # 定义标签字典 label_dict = { 0: 'airplane', 1: 'automobile', 2: 'bird', 3: 'cat', 4: 'deer', 5: 'dog', 6: 'frog', 7: 'horse', 8: 'ship', 9: 'truck' } # 定义显示图像和标签的函数 def show_image(x, y, index): plt.imshow(x[index]) plt.title(label_dict[y[index][0]]) plt.axis('off') plt.show() ``` 接下来,我们可以显示数据集中的一些图像和它们的标签: ```python # 显示前 10 张图像 for i in range(10): show_image(x_train, y_train, i) ``` 最后,我们可以使用 t-SNE 算法将图像降维到二维空间,并用不同的颜色表示每个类别: ```python from sklearn.manifold import TSNE # 将训练集数据降维到二维空间 x_train_embedded = TSNE(n_components=2).fit_transform(x_train.reshape(-1, 32 * 32 * 3)) # 绘制降维后的数据点 plt.figure(figsize=(10, 10)) for i in range(10): plt.scatter(x_train_embedded[y_train[:, 0] == i, 0], x_train_embedded[y_train[:, 0] == i, 1], label=label_dict[i]) plt.legend() plt.show() ``` 这样就可以得到 CIFAR-10 数据集的可视化结果了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值