大部分人脸数据集的数据量都比较大,在进行处理时,因为无法可视化操作,因此不方便用户进行数据的选择。因此,采用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:datasetsYale_32x32.mat")
# 加载后的数据是字典类型
print(type(data))
# 使用。keys()查看字典的键
data.keys()
# 以下为输出结果,复制请删除
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:datasetsAR_32x32.mat' fig = getPhoto(fname)
以上即是本次文章的主要内容,getPhoto()函数可以直接调用,使用过程中注意在子图中调整子图的个数即可,后续优化再进行更新。



