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)