利用Python PIL、cPickle讀取和儲存映像資料庫

來源:互聯網
上載者:User

標籤: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讀取和儲存映像資料庫

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.