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

2019-11-23 21:03:57 浏览数 (1)

本系列是《玩转机器学习教程》一个整理的视频笔记。本章的最后一个小节介绍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。使用这种人脸图片足够的数据集进行人脸识别相对来说就比较靠谱。

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

0 人点赞