经典人脸数据集的可视化AR,Yale,YaleB
Posted Huthan
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了经典人脸数据集的可视化AR,Yale,YaleB相关的知识,希望对你有一定的参考价值。
将人脸数据集中的数据可视化
大部分人脸数据集的数据量都比较大,在进行处理时,因为无法可视化操作,因此不方便用户进行数据的选择。因此,采用python
中的matplotlib、numpy
等库对人脸数据集进行可视化操作。方法涉及到Yale、AR
等知名的人脸数据集。
首先是导入需要的库
import numpy as np
import scipy
from scipy.io import loadmat
import matplotlib.pyplot as plt
import pandas as pd
numpy
用来处理矩阵,scipy
用于科学计算,matplotlib
用于可视化,pandas
用于查看数据。
因为部分人脸数据集采用matlab
中的.mat
格式文件存储,在python
中处理时,会将.mat
文件读取成dict
格式,所以需要使用字典的方法知道具体数据对应的键,方便取出数据。
# 使用scipy.io中的loadmat加载mat文件
data = scipy.io.loadmat("F:\\datasets\\Yale_32x32.mat")
# 加载后的数据是字典类型
print(type(data))
# 使用。keys()查看字典的键
data.keys()
# 以下为输出结果,复制请删除
<class 'dict'>
dict_keys(['__header__', '__version__', '__globals__', 'fea', 'gnd'])
根据字典的键可以看出,'fea'
对应数据,'gnd'
对应标签。
# 根据字典的键可知,‘fea’存储数据,‘gnd’存储标签
X = data['fea']
# 使用pandas.DataFrame查看一下数据
pd.DataFrame(X)
X.shape
# 使用.shape可知样本个数有165个,有1024个特征点组成图像
# 以下为输出结果,复制请删除
(165, 1024)
获取到数据集的shape
是165x1024
,1024是数据集的维度,也是数据存储的像素点,165是样本的个数,因此,需要查看数据集的介绍。
Yale数据集中共涉及15个人,每人11张黑白人脸图像,图像大小为100*100。每张图像已剪裁好位置至正对人脸。该数据集的特点就是,数据少,图像小。
获取需要获得图像数
row,col = X.shape
print(row,col)
# 以下为输出结果,复制请删除
165 1024
首先,我们要获取数据的行和列,前面提到行对应样本的个数,列对应样本的特征数。
下面利用循环,创建一个数组,将每一个样本的数据存储到一个1x1024的矩阵中,并将其调整为32x32大小的矩阵,对每一个矩阵进行转置运算,否则图像是偏的,添加到一个列表中。循环结束后,将列表转成数组的形式。
images = []
# 循环建立图像
for i in range(row):
img = np.array(col) # 创建一个数组存储数据
img = X[i]
img = img.reshape(32,32).T # 将一个样本转成32x32的矩阵
images.append(img) # 将样本添加到一个列表中
images = np.array(images) # 将列表转成数组形式
最后使用matplotlib对数据进行可视化操作,首先是创建画布,并且创建一定数量的子图,子图的创建可根据数据集的描述填写参数,整体画布的大小figsize
自由设定,然后对子图进行循环操作,将对应的数据填充到子图中,即可显示最后的效果。
# 15,11为创建子图的个数,根据数据集包含的信息填写
# 例如Yale数据集包含15个人的11张图像,因此可以写15,11,每一行是一个样本的信息
fig,axes = plt.subplots(2,11
,figsize=(16,9)
,subplot_kw="xticks":[],"yticks":[]
)
for i,ax in enumerate(axes.flat):
ax.imshow(images[i]
,cmap="gray"
)
下面为可视化的结果
将方法封装成一个函数进行调用
定义一个getphoto()
的函数,参数fname
为要读取的数据集的本机地址。
def getPhoto(fname):
data = scipy.io.loadmat(fname)
X = data['fea']
row,col = X.shape
images = []
for i in range(row):
img = np.array(col)
img = X[i]
img = img.reshape(32,32).T
images.append(img)
images = np.array(images)
# 15,11为创建子图的个数,根据数据集包含的信息填写
# 例如Yale数据集包含15个人的11张图像,因此可以写15,11,每一行是一个样本的信息
fig,axes = plt.subplots(10,28
,figsize=(16,9)
,subplot_kw="xticks":[],"yticks":[]
)
for i,ax in enumerate(axes.flat):
ax.imshow(images[i]
,cmap="gray"
)
return fig
下面进行演示,将AR数据进行可视化。
fname = 'F:\\datasets\\AR_32x32.mat'
fig = getPhoto(fname)
以上即是本次文章的主要内容,getPhoto()
函数可以直接调用,使用过程中注意在子图中调整子图的个数即可,后续优化再进行更新。
论文 数据集总结
1、Yale人脸库(美国):耶鲁大学,15人,每人11张照片,主要包括光照条件的变化,表情的变化等。
2、ORL人脸库(英国):剑桥大学,40人,每人10张照片,包括表情变化,微小姿态变化,20%以内的尺度变化
3、CMU PIE人脸库(美国):卡耐基梅隆大学,所谓PIE就是姿态(POSE),光照(ILLUMINATION)和表情(EXPRESSION)的缩写,CMU PIE人脸库建立于2000年11月,它包括来自68个人的40000张照片,其中包括了每个人的13种姿态条件,43种光照条件和4种表情下的照片,现 有的多姿态人脸识别的文献基本上都是在CMU PIE人脸库上测试的。
4、AR人脸库(美国):Purdue 大学,126人的彩色照片,光照,尺度和表情变化。
以上是关于经典人脸数据集的可视化AR,Yale,YaleB的主要内容,如果未能解决你的问题,请参考以下文章
基于Python PCA+SVM+KFold方法人脸识别(AR人脸数据集)