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