1. 程式人生 > >CIFAR-10 dataset 的下載與使用、轉圖片

CIFAR-10 dataset 的下載與使用、轉圖片

基本資訊

CIFAR-10 是一個包含60000張圖片的資料集。其中每張照片為32*32的彩色照片,每個畫素點包括RGB三個數值,數值範圍 0 ~ 255。
所有照片分屬10個不同的類別,分別是 ‘airplane’, ‘automobile’, ‘bird’, ‘cat’, ‘deer’, ‘dog’, ‘frog’, ‘horse’, ‘ship’, ‘truck’
其中五萬張圖片被劃分為訓練集,剩下的一萬張圖片屬於測試集。

下載資料集

開啟下面的連結進入官網下載
http://www.cs.toronto.edu/~kriz/cifar.html
在這裡插入圖片描述
下載完成後先解壓縮,之後會得到如下幾個檔案
在這裡插入圖片描述
data_batch_1 ~ data_batch_5 是劃分好的訓練資料,每個檔案裡包含10000張圖片,test_batch 是測試集資料,也包含10000張圖片。他們的結構是一樣的,下面就用 data_batch_1 作為例子進行說明。

讀取資料

import pickle

def load_file(filename):
    with open(filename, 'rb') as fo:
        data = pickle.load(fo, encoding='latin1')
    return data

首先定義讀取資料的函式,這幾個檔案都是通過 pickle 產生的,所以在讀取的時候也要用到這個包。
這裡面返回的data是一個字典,先看看這個字典裡面有哪些鍵吧。

data = load_file('test_batch')
print(data.keys())

輸出結果

dict_keys(['batch_label'
, 'labels', 'data', 'filenames'])
  • batch_label

對應的值是一個字串,用來表明當前檔案的一些基本資訊。

如果是 data_batch_1 這個檔案,裡面的值就是

pythontraining batch 1 of 5
  
如果是 test_batch 這個檔案,裡面的值就是

pythontesting batch 1 of 1

  • labels

對應的值是一個長度為10000的列表,每個數字取值範圍 0~9,代表當前圖片所屬類別

  • data

10000 * 3072 的二維陣列,每一行代表一張圖片的畫素值。(32323=3072)

  • filenames

長度為10000的列表,裡面每一項是代表圖片檔名的字串。

batches.meta 檔案可以用相同的方法讀取,裡面存的是一些基本資訊。

  • num_cases_per_batch

10000

  • label_names

['airplane', 'automobile', 'bird', 'cat', 'deer', 'dog', 'frog', 'horse', 'ship', 'truck']

  • num_vis

3072

轉為圖片

 # -*- coding: utf-8 -*-
from scipy.misc import imsave
import numpy as np
import pickle

# 解壓縮,返回解壓後的字典
def unpickle(file):
    fo = open(file, 'rb')
    dict = pickle.load(fo, encoding='latin1')
    fo.close()
    return dict

# 生成訓練集圖片,如果需要png格式,只需要改圖片字尾名即可。
for j in range(1, 6):
    dataName = "data_batch_" + str(j)  # 讀取當前目錄下的data_batch12345檔案,dataName其實也是data_batch檔案的路徑,本文和指令碼檔案在同一目錄下。
    Xtr = unpickle(dataName)
    print(dataName + " is loading...")

    for i in range(0, 10000):
        img = np.reshape(Xtr['data'][i], (3, 32, 32))  # Xtr['data']為圖片二進位制資料
        img = img.transpose(1, 2, 0)  # 讀取image
        picName = 'train/' + str(Xtr['labels'][i]) + '_' + str(i + (j - 1)*10000) + '.jpg'  # Xtr['labels']為圖片的標籤,值範圍0-9,本文中,train資料夾需要存在,並與指令碼檔案在同一目錄下。
        imsave(picName, img)
    print(dataName + " loaded.")

print("test_batch is loading...")

# 生成測試集圖片
testXtr = unpickle("test_batch")
for i in range(0, 10000):
    img = np.reshape(testXtr['data'][i], (3, 32, 32))
    img = img.transpose(1, 2, 0)
    picName = 'test/' + str(testXtr['labels'][i]) + '_' + str(i) + '.jpg'
    imsave(picName, img)
print("test_batch loaded.")

在這裡插入圖片描述