人臉識別與特征臉(簡單介紹)
什么是特征臉
特征臉(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張圖片,這樣的數據庫就比較靠譜了