栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

Python可视化经典人脸数据集(YALE)

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Python可视化经典人脸数据集(YALE)

读取.mat文件,并人脸数据集可视化

提示:深度学习进行人脸识别,需要使用经典的人脸数据库来训练。
大部分人脸数据集的数据量都比较大,在进行处理时,因为无法可视化操作,因此不方便用户进行数据的选择。因此,采用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)
运行结果

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/934996.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号