经典人脸数据集的可视化【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)

获取到数据集的shape165x1024,1024是数据集的维度,也是数据存储的像素点,165是样本的个数,因此,需要查看数据集的介绍。

Yale数据集中共涉及15个人,每人11张黑白人脸图像,图像大小为100*100。每张图像已剪裁好位置至正对人脸。该数据集的特点就是,数据少,图像小。
经典人脸数据集的可视化【AR,Yale,YaleB】_第1张图片

获取需要获得图像数

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"
             )

下面为可视化的结果

经典人脸数据集的可视化【AR,Yale,YaleB】_第2张图片

将方法封装成一个函数进行调用

定义一个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,Yale,YaleB】_第3张图片

以上即是本次文章的主要内容,getPhoto()函数可以直接调用,使用过程中注意在子图中调整子图的个数即可,后续优化再进行更新。

你可能感兴趣的:(认真学ML,ar,python,机器学习)