经典人脸数据集的可视化【AR,Yale,YaleB】

  • Post author:
  • Post category:其他




将人脸数据集中的数据可视化


大部分人脸数据集的数据量都比较大,在进行处理时,因为无法可视化操作,因此不方便用户进行数据的选择。因此,采用

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

首先,我们要获取数据的行和列,前面提到行对应样本的个数,列对应样本的特征数。

下面利用循环,创建一个数组,将每一个样本的数据存储到一个1×1024的矩阵中,并将其调整为32×32大小的矩阵,对每一个矩阵进行转置运算,否则图像是偏的,添加到一个列表中。循环结束后,将列表转成数组的形式。

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)

AR数据集可视化结果

以上即是本次文章的主要内容,

getPhoto()

函数可以直接调用,使用过程中注意在子图中调整子图的个数即可,后续优化再进行更新。



版权声明:本文为weixin_46435420原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。