cifar10和cifar100(簡介&可視化)

cifar

CIFAR數據集是 Visual Dictionary
(Teaching computers to recognize objects)
的子集,由三個教授收集,主要來自google和各類搜索引擎的圖片。

備註:cifar官網

1.cifar10

由10個類的60000的32*32彩色圖像組成,每個類有6000個圖像。有50000個訓練圖像和10000個測試圖像。

類型如下:
image

2.cifar100

這個數據集和cifar10類似,它有100個類,每個類包含600個圖像,600個圖像中有500個訓練圖像和100個測試圖像。100類實際是由20個類(每個類又包含5個子類)構成(5*20=100)。

類型如下:

image

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

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("保存完畢.")

image

注:在另一個文件夾還保存了三色的單通道圖

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章