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.")