標籤:python pil cpickle 讀取映像 儲存映像
利用Python PIL、cPickle讀取和儲存映像資料庫
@author:wepon
@blog:http://blog.csdn.net/u012162613/article/details/43226127
電腦視覺、機器學習任務中,經常跟映像打交道,在C++上有成熟的OpenCV可以使用,在Python中也有一個影像處理庫PIL(Python Image Library),當然PIL沒有OpenCV那麼多功能(比如一些臉部偵測的演算法),不過在Python上,我們用PIL進行一些基本的映像讀取與儲存工作就行了,因為演算法方面,Python有很多強大的演算法庫(機器學習庫sklearn、深度學習庫theano)。
本文以一個人臉映像資料庫Olivetti Faces為例,展示如何使用PIL模組、cPickle模組將這個映像資料庫讀取並儲存為pkl檔案。
關於cPickle模組的使用,我在這篇文章裡有講到: DeepLearning tutorial(2)機器學習演算法在訓練過程中儲存參數。下文就不重複了。
一、人臉映像庫Olivetti Faces介紹Olivetti Faces是紐約大學的一個比較小的人臉庫,由40個人的400張圖片構成,即每個人的人臉圖片為10張。每張圖片的灰階級為8位,每個像素的灰階大小位於0-255之間,每張圖片大小為64×64。如,這個圖片大小是1190*942,一共有20*20張人臉,故每張人臉大小是(1190/20)*(942/20)即57*47=2679:
二、利用Python PIL、cPickle讀取和儲存 Olivetti Faces首先使用PIL.Image開啟擷取這張圖片,為了便於數值計算,將其轉化為numpy.array類型,然後每張圖片攤成一個一維向量1*2679,因為有400張,所以得到了400*2679的numpy.array,接著使用cPickle模組,將轉化得到的numpy.array儲存為pkl檔案。注意這是不帶label的資料,我們可以人工地給它們類別0~39,每個類別有10個樣本,故建立一個400*1的label,作為每張圖片對應的類別。
代碼如下:
#讀取人臉庫olivettifaces,並儲存為pkl檔案import numpyfrom PIL import Imageimport cPickle#讀取原始圖片並轉化為numpy.ndarray,將灰階值由0~256轉換到0~1img = Image.open('/home/wepon/olivettifaces.gif')img_ndarray = numpy.asarray(img, dtype='float64')/256#圖片大小時1190*942,一共20*20個人臉圖,故每張人臉圖大小為(1190/20)*(942/20)即57*47=2679#將全部400個樣本儲存為一個400*2679的數組,每一行即代表一個人臉圖,並且第0~9、10~19、20~29...行分別屬於同個人臉#另外,用olivettifaces_label表示每一個樣本的類別,它是400維的向量,有0~39共40類,代表40個不同的人。olivettifaces=numpy.empty((400,2679))for row in range(20):for column in range(20):olivettifaces[row*20+column]=numpy.ndarray.flatten(img_ndarray [row*57:(row+1)*57,column*47:(column+1)*47])#建一個<span style="font-family: SimSun;">olivettifaces_label</span>olivettifaces_label=numpy.empty(400)for label in range(40):olivettifaces_label[label*10:label*10+10]=labelolivettifaces_label=olivettifaces_label.astype(numpy.int)#儲存olivettifaces以及olivettifaces_label到olivettifaces.pkl檔案write_file=open('/home/wepon/olivettifaces.pkl','wb') cPickle.dump(olivettifaces,write_file,-1) cPickle.dump(olivettifaces_label,write_file,-1) write_file.close()
這樣,在目錄/home/wepon/下就會得到一個olivettifaces.pkl檔案。這個檔案就儲存了一個400*2679的向量和一個400*1的向量,代表樣本及樣本類別。
從olivettifaces.pkl中讀取顯示單張圖片:
如果要查看單張圖片,必須先將代表圖片的2679維的向量reshape,如:faces[1].reshape(57,47)。調用pylab顯示圖片。
import cPickleimport pylabread_file=open('/home/wepon/olivettifaces.pkl','rb') faces=cPickle.load(read_file)read_file.close() img1=faces[1].reshape(57,47)pylab.imshow(img)pylab.gray()pylab.show()
機器學習演算法中如何使用olivettifaces.pkl?
在機器學習演算法中,我們一般都會將樣本分拆為訓練樣本、驗證樣本、測試樣本,以及對應的label。該如何拆分?代碼如下:
讀取olivettifaces.pkl檔案,分為訓練集(40*8個樣本),驗證集(40*1個樣本),測試集(40*1個樣本)import cPickleread_file=open('/home/wepon/olivettifaces.pkl','rb') faces=cPickle.load(read_file) label=cPickle.load(read_file) read_file.close() train_data=numpy.empty((320,2679))train_label=numpy.empty(320)valid_data=numpy.empty((40,2679))valid_label=numpy.empty(40)test_data=numpy.empty((40,2679))test_label=numpy.empty(40)for i in range(40):train_data[i*8:i*8+8]=faces[i*10:i*10+8]train_label[i*8:i*8+8]=label[i*10:i*10+8]valid_data[i]=faces[i*10+8]valid_label[i]=label[i*10+8]test_data[i]=faces[i*10+9]test_label[i]=label[i*10+9]
利用Python PIL、cPickle讀取和儲存映像資料庫