提示:深度学习进行人脸识别,需要使用经典的人脸数据库来训练。
大部分人脸数据集的数据量都比较大,在进行处理时,因为无法可视化操作,因此不方便用户进行数据的选择。因此,采用python中的matplotlib、numpy等库对人脸数据集进行可视化操作。方法涉及到Yale、AR等知名的人脸数据集。
读取可视化
- 读取.mat文件,并人脸数据集可视化
- 导入库
- 读入Yale数据
- 获取需要获取图像数
- 运行结果
- 将方法封装成一个函数进行调用
- 运行结果
导入库
import numpy as np import scipy import scipy.io as sy import matplotlib.pyplot as plt import pandas as pd
numpy用来处理矩阵,scipy用于科学计算,matplotlib用于可视化,pandas用于查看数据。
提示:以下是本篇文章正文内容,下面案例可供参考
读入Yale数据因为部分人脸数据集采用matlab中的.mat格式文件存储,在python中处理时,会将.mat文件读取成dict格式,所以需要使用字典的方法知道具体数据对应的键,方便取出数据。
# 使用scipy.io中的loadmat加载mat文件 f = sy.loadmat(r'D:/PythonProjects/test/mat/Yale_64x64.mat') # 加载后的数据是字典类型 print(type(f)) # 使用.keys()查看字典的键 print(f.keys())
根据字典的键可以看出,‘fea’对应数据,‘gnd’对应标签。
# 根据字典的键可以看出,'fea'对应数据,'gnd'对应标签。 X = f['fea'] # 使用pandas.DataFrame查看一下数据 pd.DataFrame(X) print(X.shape) # 使用.shape可知样本个数有165个,有1024个特征点组成图像 X = np.transpose(X) # 以下为输出结果,X.shape --> (165, 1024)
获取到数据集的shape是165x4096,4096是数据集的维度,也是数据存储的像素点,165是样本的个数,因此,需要查看数据集的介绍。
Yale数据集中共涉及15个人,每人11张黑白人脸图像,图像大小为100*100。每张图像已剪裁好位置至正对人脸。该数据集的特点就是,数据少,图像小。
row, col = X.shape print(row, col) # 以下为输出结果,复制请删除 165 4096
首先,我们要获取数据的行和列,前面提到行对应样本的个数,列对应样本的特征数。
下面利用循环,创建一个数组,将每一个样本的数据存储到一个1x4096的矩阵中,并将其调整为32x32大小的矩阵,对每一个矩阵进行转置运算,否则图像是偏的,添加到一个列表中。循环结束后,将列表转成数组的形式。
images = []
for i in range(row):
img = np.array(col)
img = X[i]
img = img.reshape(64, 64).T
images.append(img)
image = np.array(images)
最后使用matplotlib对数据进行可视化操作,首先是创建画布,并且创建一定数量的子图,子图的创建可根据数据集的描述填写参数,整体画布的大小figsize自由设定,然后对子图进行循环操作,将对应的数据填充到子图中,即可显示最后的效果。
fig, axes = plt.subplots(2, 11, figsize=(16, 9), subplot_kw={"xticks": [], "yticks": []})
for i, ax in enumerate(axes.flat):
print(ax)
ax.imshow(images[i], cmap="gray")
plt.show()
运行结果
将方法封装成一个函数进行调用
定义一个getphoto()的函数,参数fname为要读取的数据集的本机地址。
头文件getPhoto,写入getPhoto函数。
import numpy
import scipy.io as sy
from PIL import Image
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
def getPhoto(fname):
data = sy.loadmat(fname)
X = data['fea']
X = np.transpose(X)
row, col = X.shape
images = []
for i in range(row):
img = np.array(col)
img = X[i]
img = img.reshape(64, 64).T
images.append(img)
images = np.array(images)
# 15,11为创建子图的个数,根据数据集包含的信息填写
# 例如Yale数据集包含15个人的11张图像,因此可以写15,11,每一行是一个样本的信息
fig, axes = plt.subplots(15, 11
, figsize=(16, 9)
, subplot_kw={"xticks": [], "yticks": []}
)
for i, ax in enumerate(axes.flat):
ax.imshow(images[i], cmap="gray")
plt.show()
return fig
主函数需要加入头文件,将YALE数据进行可视化。如下代码:
import numpy import scipy.io as sy from PIL import Image import numpy as np import matplotlib.pyplot as plt import pandas as pd from getPhoto import getPhoto fname = r"D:/PythonProjects/test/mat/Yale_64x64.mat" fig = getPhoto(fname)运行结果



