機器學習入門 7-9 人臉識別與特徵臉

  • 2019 年 11 月 23 日
  • 筆記

本系列是《玩轉機器學習教程》一個整理的視頻筆記。本章的最後一個小節介紹PCA在人臉識別領域的一個特殊的應用,也就是所謂的特徵臉。本小節會介紹什麼是特徵臉,並通過可視化的方式直觀的感受特徵臉。

01

特徵臉

前幾個小節再使用PCA用於降維的時候,樣本數據X從n維空間映射到k維空間,我們只需要使用PCA算法求出樣本數據矩陣的前k個主成分就行了。而對於前k個主成分我們可以表示成Wk的矩陣形式。

此時的Wk矩陣擁有k行n列,對於X中每一個樣本x都和Wk矩陣中的每一行w做點乘,計算得到的結果相當於我們從這個樣本x映射到相應的某一行w所表示的這個軸中所得到映射向量的大小。

上面是我們在前幾個小節所介紹的內容,但是我們現在換一個思路來想,對於Wk這個矩陣來說,他擁有n列,而我們的樣本矩陣此時也有n列,所以可以說Wk和X的列維度是一樣的。類比於樣本矩陣X,我們將Wk的每一行看成一個樣本,只不過對於Wk來說,一共有k個樣本(k行),每個樣本的特徵維度為n(n列)。在前面介紹的時候說Wk這個矩陣的每一行都是一個方向,第一行就是最重要的那個方向,而第二行次重要,依次類推,最後重要的是第k行向量表示的方向。如果我們將Wk中的每一行都看成是一個樣本的話,我們可以說第一行所代表的樣本是最重要的樣本,第二行所代表的樣本是次重要的那個樣本,依次類推,第k行是最後重要的樣本,也就是此時Wk也能非常好的反映原來X樣本矩陣這些樣本相應的特徵。

在人臉識別任務中,X樣本矩陣的每一行都是一個人臉圖像,如果把Wk的每一行也看成是樣本的話,Wk的每一行也可以相應的理解成人臉,因為此時原來的樣本矩陣和Wk的列維度是一樣的,因此對於X來說每一行表示一個n維度特徵的人臉圖像,對於擁有相同列維度的Wk來說,每一行也表示成一個n維度特徵的人臉圖像,此時這個人臉圖像稱之為特徵臉。之所以稱之為特徵臉,是因為每一個特徵臉其實對應的都是一個主成分,相當於表達了一部分原來樣本中這些人臉數據對應的特徵。特徵臉的英文叫做eigen face,其中eigen是特徵的意思,和在線性代數中eigen value特徵值這個說法是相對應的。

02

編程實現特徵臉

前面介紹了什麼是特徵臉,下面就通過實際編程通過可視化的方式真實的看一看這些特徵臉是什麼樣子的。同樣在這裡我們依然使用sklearn內部為我們提供的人臉識別數據集"The Labeled Faces in the Wild face recognition dataset"。

sklearn對於如果第一次加載數據集,則會從相應的服務器上下載數據集並保存到指定數據集文件夾中,如果非第一次訪問加載的話,會直接從指定數據集文件夾中加載。對於人臉識別數據集而言,如果沒有翻牆,雖然下載速度相對慢一點,但是還是能夠下載的。

sklearn的人臉識別數據集大約200MB,相對而言數據集還是比較大的。在sklearn中加載的faces也是一個字典。

如果以圖像的形式輸出,有三個維度:

  1. 第一個維度是樣本總數,也稱為樣本維度;
  2. 第二個維度是圖像的長;
  3. 第三個維度是圖像的寬;

上面打印輸出的(13233, 62, 47),表達的含義就是13233個(62, 47)的圖像像素矩陣。62 * 47 = 2914,2914相當於把矩陣按照行排列鋪平的方式變成一個2914維度的向量。

接下來通過可視化的方式繪製隨機的36張人臉,具體方式首先通過

random_indexes = np.random.permutation(len(faces.data))來獲取亂序後的索引值,將隨機的排列傳進data中,得到的X也就是亂序後的人臉數據集,從亂序後的人臉中取出前36張人臉。

如果對人臉數據集中人物是誰感興趣,可以通過下面屬性進行查看。

接下來就來看看什麼是特徵臉,加下來調用PCA對人臉進行降維即可,此時指定"svd_solver"參數為字符串"randomized",顧名思義就是使用隨機的方式求解PCA,這是因為我們現在的數據集比較大,使用隨機的方式求解相對會快一些,但是我們沒有指定n_components參數,此時想求出來的是所有的主成分,而不是像以前只求出前n_components個主成分。

所謂特徵臉就是把每一個主成分都當成一個樣本來看待,排的越靠前,這個特徵臉越反映整個人臉的特徵。此時把這些主成分當成樣本來看,取出前36張臉。

上面這些臉就被稱為特徵臉,對於這些特徵臉來說,排在前面的特徵臉相對來說比較籠統,比如排在第一個位置的特徵臉就是在告訴我們人臉大概的位置,只有人臉橢圓形的輪廓,越往後鼻子眼睛的信息慢慢的就清晰了起來。我們通過求出的特徵臉:

  1. 一方面可以直觀的看出來在人臉識別的過程中,我們是怎麼看到每一張人臉相應的特徵的;
  2. 另外一方面通過之前的式子也可以看出來,其實我們的每一張人臉都是這些特徵臉的相應的線性組合,而特徵臉依據重要程度順次的排在這裡。

這就是這一小節所介紹的PCA在人臉識別領域中的一個專門的應用特徵臉。不過對於我們的人臉數據集來說,一共有1萬多張人臉,相對應的有5000多個不同的人,平均下來其實每個人只有兩張臉,相對來說太少了,但是這個人臉數據集本身的分佈就是極不均衡的,有很多人可能就只有一張圖片,但是有另外的一些人,可能相對應的有幾十張圖片,而對於人臉來說幾十張圖片對於人臉來說就已經足夠了。如果想要獲得樣本數比較多的這些人相對應的人臉圖像,在拿到樣本庫的時候,調用"fetch_lfw_people"的時候,可以向裏面傳入一個參數,這個參數叫做"min_faces_per_person",比如此時給"min_faces_per_person = 60",就代表我們只從裏面取出來,對於這個人來說他至少需要有60張照片,這樣的數據提取出來。

此時得到的faces2中,一共有8個人,其中的每一個人在人臉數據集中所擁有的人臉圖像數大於等於60。使用這種人臉圖片足夠的數據集進行人臉識別相對來說就比較靠譜。

在下一章將解除另外一個非常重要的問題-多項式回歸,簡單來說多項式回歸就是使用線性回歸的思路來解決非線性回歸的問題,同時也會引入機器學習中非常重要的問題-模型的泛化。