天天看點

cifar-10學習——1、擷取樣本圖檔和标簽模拟實際場景訓練

最近想弄點樣本來做個簡單的圖檔分類,期望能找到所有的樣本圖檔檔案和标簽檔案,這樣就可以模拟實際場景下進行機器學習了。在網上找了一番,都是打包的資料,也有解析出樣本圖檔的,但是都不是很全,例如缺少标簽。下面就嘗試從cifar-10中擷取所有圖檔和樣本資料。

cifar-10 資料集介紹請看官網:

http://www.cs.toronto.edu/~kriz/cifar.html

cifar-10學習——1、擷取樣本圖檔和标簽模拟實際場景訓練

樣本共有10個分類:飛機、汽車、鳥、貓、鹿、狗、青蛙、馬、船、卡車

資料集有60000張 32x32 像素彩色圖檔(RGB)

注意這裡的RGB很重要,在訓練過程中要和MNIST區分開,因為MNIST是單色的而cifar-10是RGB的。

每個類别圖檔有6000張,10個類别圖檔共60000張 = 訓練圖檔50000張 + 測試圖檔10000張。

先從官網下載下傳樣本資料集如下:

cifar-10學習——1、擷取樣本圖檔和标簽模拟實際場景訓練

好了,有個樣本資料集我們現在将樣本解析成圖檔儲存到本地,我們希望圖檔的命名方式可以顯示出其類别,例如:1_cat.png,78_airplan.png。

打開spyder開始編寫代碼 cifar-10可視化.py:

import pickle as p  
import numpy as np  
from PIL import Image  
import os

#加載資料
def load_CIFAR_batch(filename):  
    with open(filename, 'rb') as f:  
        datadict = p.load(f,encoding='latin1')  
        X = datadict['data']  
        Y = datadict['labels']  
        X = X.reshape(10000, 3, 32, 32)  
        Y = np.array(Y)  
        return X, Y  
  
#将标簽轉換成英文       
def getLabelType(typeIndex,label):
    index = label[typeIndex]
    if index == 0:
        return "airplane"
    if index == 1:
        return "automobile"
    if index == 2:
        return "bird"
    if index == 3:
        return "cat"
    if index == 4:
        return "deer"
    if index == 5:
        return "dog"
    if index == 6:
        return "frog"
    if index == 7:
        return "horse"
    if index == 8:
        return "ship"
    if index == 9:
        return "truck"
    
#建立每個batch圖檔儲存的檔案夾   
def mkdir(path):  
    folder = os.path.exists(path)  
    if not folder:              
        os.makedirs(path)
        print("建立檔案夾"+path)
        return 1
    else:
        return 0
  
    
#儲存圖檔和标簽
def saveImgAndLabel(tag):
    saveDir = "./batch_images_"+str(tag)
    if mkdir(saveDir) == 0:
        return 
    if tag == "test":
        imgX, labelX = load_CIFAR_batch("./test_batch") #加載測試資料集
    else:
        imgX, labelX = load_CIFAR_batch("./data_batch_"+str(tag)) #加載訓練資料集
    for i in range(0,10000): 
        imgs = imgX[i]  
        img0 = imgs[0]  
        img1 = imgs[1]  
        img2 = imgs[2]  
        #生成image對象RGB 
        i0 = Image.fromarray(img0) 
        i1 = Image.fromarray(img1)  
        i2 = Image.fromarray(img2)  
        img = Image.merge("RGB",(i0,i1,i2)) 
        #這裡是生成英文标簽的名字
        label = getLabelType(i,labelX)
        name = str(i)+'_'+label+'.png'
        img.save(saveDir+"/"+name,"png") 
        print(name)

#程式入口
if __name__ == "__main__":  
    for i in range(1,7):
        if i == 6:
            saveImgAndLabel('test')
        else:
            saveImgAndLabel(i)
    print("儲存完畢.")  
        
    
           

運作完成後目前目錄如下:

cifar-10學習——1、擷取樣本圖檔和标簽模拟實際場景訓練

我們打開看一下:

cifar-10學習——1、擷取樣本圖檔和标簽模拟實際場景訓練
cifar-10學習——1、擷取樣本圖檔和标簽模拟實際場景訓練

ok,60000張彩色圖檔帶标簽都生成了,現在看這些圖檔感覺直覺多了,我們可以針對這些樣本開始自己的訓練了。

下一篇我們再拿這些樣本(假設這些樣本是自己實際場景的)進行訓練。一步一步從最基本、最原始的開始。

繼續閱讀