最近想弄點樣本來做個簡單的圖檔分類,期望能找到所有的樣本圖檔檔案和标簽檔案,這樣就可以模拟實際場景下進行機器學習了。在網上找了一番,都是打包的資料,也有解析出樣本圖檔的,但是都不是很全,例如缺少标簽。下面就嘗試從cifar-10中擷取所有圖檔和樣本資料。
cifar-10 資料集介紹請看官網:
http://www.cs.toronto.edu/~kriz/cifar.html
樣本共有10個分類:飛機、汽車、鳥、貓、鹿、狗、青蛙、馬、船、卡車
資料集有60000張 32x32 像素彩色圖檔(RGB)
注意這裡的RGB很重要,在訓練過程中要和MNIST區分開,因為MNIST是單色的而cifar-10是RGB的。
每個類别圖檔有6000張,10個類别圖檔共60000張 = 訓練圖檔50000張 + 測試圖檔10000張。
先從官網下載下傳樣本資料集如下:
好了,有個樣本資料集我們現在将樣本解析成圖檔儲存到本地,我們希望圖檔的命名方式可以顯示出其類别,例如: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("儲存完畢.")
運作完成後目前目錄如下:
我們打開看一下:
ok,60000張彩色圖檔帶标簽都生成了,現在看這些圖檔感覺直覺多了,我們可以針對這些樣本開始自己的訓練了。
下一篇我們再拿這些樣本(假設這些樣本是自己實際場景的)進行訓練。一步一步從最基本、最原始的開始。