专栏首页AI机器学习与深度学习算法机器学习入门 7-9 人脸识别与特征脸

机器学习入门 7-9 人脸识别与特征脸

本系列是《玩转机器学习教程》一个整理的视频笔记。本章的最后一个小节介绍PCA在人脸识别领域的一个特殊的应用,也就是所谓的特征脸。本小节会介绍什么是特征脸,并通过可视化的方式直观的感受特征脸。

01

特征脸

前几个小节再使用PCA用于降维的时候,样本数据X从n维空间映射到k维空间,我们只需要使用PCA算法求出样本数据矩阵的前k个主成分就行了。而对于前k个主成分我们可以表示成Wk的矩阵形式。

此时的Wk矩阵拥有k行n列,对于X中每一个样本x都和Wk矩阵中的每一行w做点乘,计算得到的结果相当于我们从这个样本x映射到相应的某一行w所表示的这个轴中所得到映射向量的大小。

上面是我们在前几个小节所介绍的内容,但是我们现在换一个思路来想,对于Wk这个矩阵来说,他拥有n列,而我们的样本矩阵此时也有n列,所以可以说Wk和X的列维度是一样的。类比于样本矩阵X,我们将Wk的每一行看成一个样本,只不过对于Wk来说,一共有k个样本(k行),每个样本的特征维度为n(n列)。在前面介绍的时候说Wk这个矩阵的每一行都是一个方向,第一行就是最重要的那个方向,而第二行次重要,依次类推,最后重要的是第k行向量表示的方向。如果我们将Wk中的每一行都看成是一个样本的话,我们可以说第一行所代表的样本是最重要的样本,第二行所代表的样本是次重要的那个样本,依次类推,第k行是最后重要的样本,也就是此时Wk也能非常好的反映原来X样本矩阵这些样本相应的特征。

在人脸识别任务中,X样本矩阵的每一行都是一个人脸图像,如果把Wk的每一行也看成是样本的话,Wk的每一行也可以相应的理解成人脸,因为此时原来的样本矩阵和Wk的列维度是一样的,因此对于X来说每一行表示一个n维度特征的人脸图像,对于拥有相同列维度的Wk来说,每一行也表示成一个n维度特征的人脸图像,此时这个人脸图像称之为特征脸。之所以称之为特征脸,是因为每一个特征脸其实对应的都是一个主成分,相当于表达了一部分原来样本中这些人脸数据对应的特征。特征脸的英文叫做eigen face,其中eigen是特征的意思,和在线性代数中eigen value特征值这个说法是相对应的。

02

编程实现特征脸

前面介绍了什么是特征脸,下面就通过实际编程通过可视化的方式真实的看一看这些特征脸是什么样子的。同样在这里我们依然使用sklearn内部为我们提供的人脸识别数据集"The Labeled Faces in the Wild face recognition dataset"。

sklearn对于如果第一次加载数据集,则会从相应的服务器上下载数据集并保存到指定数据集文件夹中,如果非第一次访问加载的话,会直接从指定数据集文件夹中加载。对于人脸识别数据集而言,如果没有访问外国网站,虽然下载速度相对慢一点,但是还是能够下载的。

sklearn的人脸识别数据集大约200MB,相对而言数据集还是比较大的。在sklearn中加载的faces也是一个字典。

如果以图像的形式输出,有三个维度:

  1. 第一个维度是样本总数,也称为样本维度;
  2. 第二个维度是图像的长;
  3. 第三个维度是图像的宽;

上面打印输出的(13233, 62, 47),表达的含义就是13233个(62, 47)的图像像素矩阵。62 * 47 = 2914,2914相当于把矩阵按照行排列铺平的方式变成一个2914维度的向量。

接下来通过可视化的方式绘制随机的36张人脸,具体方式首先通过

random_indexes = np.random.permutation(len(faces.data))来获取乱序后的索引值,将随机的排列传进data中,得到的X也就是乱序后的人脸数据集,从乱序后的人脸中取出前36张人脸。

如果对人脸数据集中人物是谁感兴趣,可以通过下面属性进行查看。

接下来就来看看什么是特征脸,加下来调用PCA对人脸进行降维即可,此时指定"svd_solver"参数为字符串"randomized",顾名思义就是使用随机的方式求解PCA,这是因为我们现在的数据集比较大,使用随机的方式求解相对会快一些,但是我们没有指定n_components参数,此时想求出来的是所有的主成分,而不是像以前只求出前n_components个主成分。

所谓特征脸就是把每一个主成分都当成一个样本来看待,排的越靠前,这个特征脸越反映整个人脸的特征。此时把这些主成分当成样本来看,取出前36张脸。

上面这些脸就被称为特征脸,对于这些特征脸来说,排在前面的特征脸相对来说比较笼统,比如排在第一个位置的特征脸就是在告诉我们人脸大概的位置,只有人脸椭圆形的轮廓,越往后鼻子眼睛的信息慢慢的就清晰了起来。我们通过求出的特征脸:

  1. 一方面可以直观的看出来在人脸识别的过程中,我们是怎么看到每一张人脸相应的特征的;
  2. 另外一方面通过之前的式子也可以看出来,其实我们的每一张人脸都是这些特征脸的相应的线性组合,而特征脸依据重要程度顺次的排在这里。

这就是这一小节所介绍的PCA在人脸识别领域中的一个专门的应用特征脸。不过对于我们的人脸数据集来说,一共有1万多张人脸,相对应的有5000多个不同的人,平均下来其实每个人只有两张脸,相对来说太少了,但是这个人脸数据集本身的分布就是极不均衡的,有很多人可能就只有一张图片,但是有另外的一些人,可能相对应的有几十张图片,而对于人脸来说几十张图片对于人脸来说就已经足够了。如果想要获得样本数比较多的这些人相对应的人脸图像,在拿到样本库的时候,调用"fetch_lfw_people"的时候,可以向里面传入一个参数,这个参数叫做"min_faces_per_person",比如此时给"min_faces_per_person = 60",就代表我们只从里面取出来,对于这个人来说他至少需要有60张照片,这样的数据提取出来。

此时得到的faces2中,一共有8个人,其中的每一个人在人脸数据集中所拥有的人脸图像数大于等于60。使用这种人脸图片足够的数据集进行人脸识别相对来说就比较靠谱。

在下一章将解除另外一个非常重要的问题-多项式回归,简单来说多项式回归就是使用线性回归的思路来解决非线性回归的问题,同时也会引入机器学习中非常重要的问题-模型的泛化。

本文分享自微信公众号 - AI机器学习与深度学习算法(AI-KangChen),作者:Chenkc

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-11-20

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 机器学习入门 7-1 什么是主成分分析法PCA?

    本系列是《玩转机器学习教程》一个整理的视频笔记。本小节主要介绍什么是主成分分析法PCA。

    Chenkc
  • 机器学习入门 7-5 高维数据映射为低维数据

    我们此时有一个m行n列的样本矩阵X,此时的X样本矩阵代表有m个样本n个特征。通过前面的关于主成分的学习,此时假设我们已经求出针对X样本矩阵来说前k个主成分,每一...

    Chenkc
  • 机器学习入门 8-1 什么是多项式回归

    本系列是《玩转机器学习教程》一个整理的视频笔记。本章主要介绍多项式回归的相关知识,并通过多项式回归引入模型泛化的相关概念。本小节主要介绍解决非线性回归问题非常简...

    Chenkc
  • ES Pipeline Aggregation(管道聚合)

    同级管道聚合,它计算同级聚合中指定度量的平均值。同级聚合必须是多桶聚合,针对的是度量聚合(metric Aggregation)。 示例如下:

    丁威
  • 046android初级篇之android多分辨率兼容

    android:anyDensity="true"时,应用程序安装在不同密度的终端上时,程序会分别加载xxhdpi、xhdpi、hdpi、mdpi、ldpi文件...

    上善若水.夏
  • python内置函数3-cmp()

    用户2398817
  • 呐你们要的算法(一)No.17

    我是小蕉。 今天跟大家分享一下,机器学习中最简单的算法之一,KNN近邻算法,这是一个有监督的分类学习算法。 啥玩意叫有监督呢?就是作为训练的每个样本都是有标记...

    大蕉
  • 12种不宜使用的Javascript语法

    这几天,我在读《Javascript语言精粹》。 这本书很薄,100多页,正好假日里翻翻。 该书的作者是Douglas Crockford,他是目前世界上最精通...

    ruanyf
  • 社群全力配合!AIT以榜首身份上线年度最火爆交易所—FCoin!

    大盘不稳、熊市一片血红,韭菜们虽在各大交易所手持多种代币,但交易价格持续萎靡、交易量迟迟无法上涨,让大家多少都有些无精打采、奄奄一息。

    区块链领域
  • python3 sorted 如何自定义排序标准

    但是在 python3 中,cmp 这个参数已经被移除了,那么在 python3 中应该怎么实现 python2 的 cmp 功能呢?

    ke1th

扫码关注云+社区

领取腾讯云代金券

玩转腾讯云 有奖征文活动