1. 程式人生 > >利用Python PIL cPickle讀取和儲存影象資料庫

利用Python PIL cPickle讀取和儲存影象資料庫

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow

也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!

               

利用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]



           

給我老師的人工智慧教程打call!http://blog.csdn.net/jiangjunshow

這裡寫圖片描述