大部分人脸数据集的数据量都比较大,在进行处理时,因为无法可视化操作,因此不方便用户进行数据的选择。因此,采用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()
函数可以直接调用,使用过程中注意在子图中调整子图的个数即可,后续优化再进行更新。