CK+表情數據庫轉換爲python數據格式保存(.pkl)

CK+數據庫的下載及介紹上一個博文已經介紹過,本博文主要介紹將CK+表情數據庫轉換爲python數據格式保存(.pkl)

注:此代碼運行前已經將數據庫處理爲64*64的照片
詳細講解請見代碼註釋,如有疑問,歡迎交流

下圖是CK數據庫的部分表情圖片

這裏寫圖片描述
這裏寫圖片描述
這裏寫圖片描述
這裏寫圖片描述
這裏寫圖片描述
這裏寫圖片描述
這裏寫圖片描述

下面附代碼


1. 讀取圖片保存爲.pkl文件

#-*- coding: utf-8 -*- 
import os
import numpy
from PIL import Image   
from pylab import * 
import cPickle      

def get_imlist(path):   #此函數讀取特定文件夾下的png格式圖像
    return [os.path.join(path,f) for f in os.listdir(path) if f.endswith('.png')]

x=[]    #存放圖片路徑
len_data=0  #圖片個數
for i in range(8):
    img_path=get_imlist('D:\\CK\\'+str(i))  #字符串連接
    #print neutral  #這裏以list形式輸出bmp格式的所有圖像(帶路徑)
    for j in range(len(img_path)):
        x.append(img_path[j])
#   print len(img_path)
    len_data=len_data+len(img_path) #這可以以輸出圖像個數
# print len_data
#print len(x)
d=len_data
data=numpy.empty((d,64*64)) #建立d*(64*64)的矩陣
while d>0:
    img=Image.open(x[d-1])  #打開圖像 
    #img_ndarray=numpy.asarray(img)
    img_ndarray=numpy.asarray(img,dtype='float64')/256  #將圖像轉化爲數組並將像素轉化到0-1之間
    data[d-1]=numpy.ndarray.flatten(img_ndarray)    #將圖像的矩陣形式轉化爲一維數組保存到data中
    d=d-1
# print len_data
# print shape(data)[1]  #輸出矩陣大小


data_label=numpy.empty(len_data)
for label in range(len_data):
    if label<924:
        data_label[label]=0
    elif (label>=905 and label<1180):
        data_label[label]=1
    elif (label>=1180 and label<1291):
        data_label[label]=2
    elif (label>=1291 and label<1619):
        data_label[label]=3
    elif (label>=1619 and label<1780):
        data_label[label]=4
    elif (label>=1780 and label<2289):
        data_label[label]=5
    elif (label>=2289 and label<2477):
        data_label[label]=6
    else:
        data_label[label]=7

data_label=data_label.astype(numpy.int)  #將標籤轉化爲int類型
# print data_label[924]
# print data_label[1638]


#保存data以及data_label到data.pkl文件  
write_file=open('D:\\CK\\data.pkl','wb')    
cPickle.dump(data,write_file,-1)    
cPickle.dump(data_label,write_file,-1)    
write_file.close()   

2. 從.pkl數據中讀取圖像顯示並存入.txt文件中

#-*- coding: utf-8 -*- 
import cPickle  
import pylab  
from pylab import *     #導入savetxt模塊

read_file=open('D:\\CK\\data.pkl','rb')    
faces=cPickle.load(read_file)  
read_file.close()   
img=faces[0].reshape(64,64)
savetxt('faces.txt',img,fmt="%.0f") #將矩陣保存到txt文件中
pylab.imshow(img)  
pylab.gray()  
pylab.show() 

3. 將數據庫分爲訓練集,驗證集,測試集

#-*- coding: utf-8 -*- 

import numpy
import pylab  
#讀取data.pkl文件,分爲訓練集(2072個樣本),驗證集(444個樣本),測試集(444個樣本)  
import cPickle  
import random
read_file=open('D:\\CK\\data.pkl','rb')  
faces=cPickle.load(read_file)    
label=cPickle.load(read_file)    
read_file.close()   

train_data=numpy.empty((2072,4096))  
train_label=numpy.empty(2072)  
valid_data=numpy.empty((444,4096))  
valid_label=numpy.empty(444)  
test_data=numpy.empty((444,4096))  
test_label=numpy.empty(444)  

li=range(2960)
random.shuffle(li)

print li[1]
train_data[1]=faces[li[1]]
train_label[1]=label[li[1]]  

#測試是否正確
# img=train_data[1].reshape(64,64)
# pylab.imshow(img)  
# pylab.gray()  
# pylab.show() 
# print train_label[1]

for i in range(2960):
    if (i<2072):
        train_data[i]=faces[li[i]]
        train_label[i]=label[li[i]]  
    elif (i>=2072 and i<2516):
        valid_data[i-2072]=faces[li[i]]  
        valid_label[i-2072]=label[li[i]]
    else:  
        test_data[i-2516]=faces[li[i]]  
        test_label[i-2516]=label[li[i]] 

#另外一種實現
# random.seed(1)
# random.shuffle(faces)
# random.seed(1)
# random.shuffle(label)
發佈了37 篇原創文章 · 獲贊 84 · 訪問量 24萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章