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

时间:2023-09-08 22:45:07

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

什么是特征脸

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

PCA的具体实现思想见

【笔记】主成分分析法PCA的原理及计算

(在notebook中)

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

  from sklearn.datasets import fetch_lfw_people
faces = fetch_lfw_people()

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

  faces.keys()

结果为

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

其中faces.data.shape

结果为

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

对应的faces.images.shape

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

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

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

  random_indexes = np.random.permutation(len(faces.data))
X = faces.data[random_indexes] example_faces = X[:36,:]
example_faces.shape

结果为

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

绘制函数:

  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)

图像为

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

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

结果为

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

具体的实现特征脸

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

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

结果为

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

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

结果为

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

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

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

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

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

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

  faces2 = fetch_lfw_people(min_faces_per_person=60)

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

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

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

结果为

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

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

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