1. 程式人生 > 實用技巧 >【筆記】特徵臉(PCA在人臉識別領域的應用)

【筆記】特徵臉(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張圖片,這樣的資料庫就比較靠譜了