转换为python数据格式保存(.pkl)"/>
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]=0elif (label>=905 and label<1180):data_label[label]=1elif (label>=1180 and label<1291):data_label[label]=2elif (label>=1291 and label<1619):data_label[label]=3elif (label>=1619 and label<1780):data_label[label]=4elif (label>=1780 and label<2289):data_label[label]=5elif (label>=2289 and label<2477):data_label[label]=6else:data_label[label]=7data_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)
更多推荐
CK+表情数据库转换为python数据格式保存(.pkl)
发布评论