【笔记】特征脸(PCA在人脸识别领域的应用)

人脸识别与特征脸(简单介绍)

什么是特征脸

特征脸(Eigenface)是指用于机器视觉领域中的人脸识别问题的一组特征向量,该方法被认为是第一种有效的人脸识别方法。

PCA的具体实现思想见
【笔记】主成分分析法PCA的原理及计算

(在notebook中)

我们需要加载相应的方法fetch_lfw_people,其为一个人脸识别数据库,加载以后,就可以直接调用了,头一次使用要下载,具体情况见另一篇博客使用sklearn中的fetch_mldata的错误情况以及可能可行的解决方法,其中有说明

  from sklearn.datasets import fetch_lfw_people
  faces = fetch_lfw_people()

我们可以看到其中相应的内容

  faces.keys()

结果为

其中faces.data.shape
结果为

对应的faces.images.shape
结果为(第一个为样本总数,对于每个样本都是62*47的图像)

然后我们随机出36张脸,首先对样本进行一个随机的排列,然后将随机的排列放入X中,然后取出X中前36张脸,然后看一下对应的数据

  random_indexes = np.random.permutation(len(faces.data))
  X = faces.data[random_indexes]

  example_faces = X[:36,:]
  example_faces.shape

结果为

绘制函数:

  def plot_faces(faces):

      fig,axes = plt.subplots(6,6,figsize=(10,10),
                         subplot_kw={'xticks':[],'yticks':[]},
      gridspec_kw=dict(hspace=0.1,wspace=0.1))
      for i,ax in enumerate(axes.flat):
          ax.imshow(faces[i].reshape(62,47),cmap='bone')
      plt.show()

  plot_faces(example_faces)

图像为

可以使用faces.target_names来查看包含的人名
结果为

具体的实现特征脸

这里使用PCA的另一种构建方式svd_solver参数,让其等于randomized,希望使用随机的方式求解PCA(对所有的数据),这样来实例化pca,然后进行fit

  %%time
  from sklearn.decomposition import PCA
  pca = PCA(svd_solver='randomized')
  pca.fit(X)

结果为

使用pca.components_.shape来看一下有多少个维度及主成分
结果为

绘制图像,注意,图像越靠前,越能反映整个样本的总特征

  plot_faces(pca.components_[:36,:])

图像为(这些就被称为特征脸)

因为有很多的图片是一个人一张,而有一些是一个人有很多张,这样出来的数据有的时候是不靠谱的,那么我们就可以获得样本数比较多的人的图片来增加准确度,我们可以

  faces2 = fetch_lfw_people(min_faces_per_person=60)

通过faces2.data.shape,可以发现这样就会少很多

使用len(faces2.target_names)来看一下一共多少人名
结果为

这样faces2中就只有8个人,每个人不少于60张图片,这样的数据库就比较靠谱了

原文地址:https://www.cnblogs.com/jokingremarks/p/14302686.html