1. 程式人生 > >iPhone X的新解鎖技術:用Python編寫Face ID

iPhone X的新解鎖技術:用Python編寫Face ID

base 嘗試 OS 實現 閾值 BE 自動 並不是 不同類

創建了無邊框手機後,蘋果不得不找出新方法簡單快捷地解鎖手機。雖然一些競爭對手繼續使用放在不同位置的指紋傳感器,但蘋果決定對解鎖手機的方式進行創新和變革:只需看一眼,FaceID就能安全地解鎖iPhone X。借助一款先進(而且非常小巧)的前置深度相機,iPhone X可以建立用戶臉部的3D模型。此外,iPhone X通過紅外攝像頭識別人臉,可以避免環境光和顏色對人臉識別的影響。通過深度學習,手機可以捕捉到用戶臉部的很多細節,因此在用戶拿著手機的時候,手機可以識別出它的主人。比較令人驚訝的是,蘋果表示這種方法比TouchID更安全,出錯率為百萬分之一。

  我對蘋果的FaceID的實現技術非常感興趣,特別是它完全運行在設備上,而且只需利用用戶的面部進行一點點訓練,就可以在每次拿起手機的時候順利地進行識別。我研究了如何使用深度學習來實現此過程,以及如何優化每個步驟。在這篇文章中,我將展示如何使用Keras實現一個類似FaceID的算法。我會介紹采用的各種架構,並展示一些在Kinect(一種非常流行的RGB-D相機,擁有與iPhone X前置攝像頭非常相似的輸出,但設備本身更大)上的最終實驗。倒杯咖啡,讓我們開始逆向工程蘋果的新技術。

  對FaceID的初步了解

  “……賦予FaceID力量的神經網絡不是簡單的分類。”

技術分享圖片

FaceID註冊的過程

  第一步我們來仔細分析FaceID在iPhone X上的工作原理。我們可以通過蘋果的白皮書理解FaceID的基本機制。使用TouchID的時候,用戶必須多次按傳感器來註冊自己的指紋。大約需要15-20次不同的觸摸,iPhone才能完成註冊,並準備好TouchID。同樣地,FaceID也需要用戶進行臉部註冊。過程非常簡單:用戶只需像往常一樣看著手機,然後慢慢地轉動頭部一圈,從不同的角度註冊臉部。如此,註冊過程就完成了,手機已經準備好解鎖了。這個超快的註冊過程可以告訴我們很多關於底層學習算法的信息。比如,FaceID背後的神經網絡並不是簡單的分類。我會在後面進行詳細的解釋。

技術分享圖片

Apple Keynote推出iPhone X和FaceID

  對於神經網絡來說,分類的意思是學習如何預測看到的臉是不是用戶的臉。所以,它需要一些訓練數據來預測“是”或“否”,但與很多其他深度學習的應用場景不同,所以這種方式在這裏並不適用。首先,神經網絡需要使用從用戶臉上捕捉到的數據重新進行訓練。而這需要消耗大量的時間和電量,還需要大量的不同面孔作為訓練數據以獲得負面的樣本,這也是不現實的。即使是試圖遷移並微調已經訓練好的神經網絡,這些條件也幾乎不會變化。而且,蘋果也不可能在實驗室等地方“線下”訓練復雜的神經網絡,然後再將訓練好的神經網絡搭載在手機中。相反,我認為FaceID是由孿生卷積神經網絡實現的(siamese-like convolutional neural network),該網絡由蘋果公司進行“線下”培訓,將臉部映射到一個低維潛在空間(latent space),並通過對比損失函數(contrastive loss)最大化不同人臉之間的距離。通過本文,你可以了解Keynote中提到的體系結構。我知道,很多讀者對上述名詞很陌生,但是沒關系,我會逐步的進行詳細的解釋。

技術分享圖片

FaceID看起來會是TouchID之後的新標準。蘋果是否會把它帶到所有的新設備上?

  從人臉到神經網絡的數字

  孿生神經網絡基本上由兩個完全相同的神經網絡組成,它們所有的權重也都相同。這種結構可以計算特定類型的數據(如圖像)之間的距離。基本思路是,將兩組數據傳遞給孿生網絡(或簡單地將兩組數據分兩次傳遞給同一個神經網絡),而這個網絡會將數據映射到一個低維特征空間(就像一個n維數組),然後訓練神經網絡將不同類別下的數據點映射到盡可能遠的地方,同時保證同一類的數據點又盡可能接近。從長遠來看,這個網絡將學習如何從數據中提取最有意義的特征,並將其壓縮成一個數組,從而創建一個有意義的映射。為了對此有一個直觀的理解,想象一下你如何使用小型矢量來描述狗狗的品種,並保證類似的狗狗具有最接近的矢量值。你可能會用一個數字來表示狗狗的毛色,另一個用來表示狗狗的大小,還有一個用於記錄毛的長度,等等。通過這種方法,彼此相似的狗狗就可以擁有相似的矢量值。這個方法是不是很聰明?那麽,孿生神經網絡也可以做到這一點,類似於一個自動編碼器。

技術分享圖片

Hadsell,Chopra和LeCun發表的論文“Dimensionality Reduction by Learning an Invariant Mapping”。請註意此架構是如何學習數字之間的相似性,並自動將它們分組在二維中。類似的技術也可以應用於面部識別。

  通過這種技術,只需使用大量面部數據來訓練一個這種網絡,就可以識別哪些面部最相似。如果擁有足夠的預算和計算能力(就像蘋果一樣),我們甚至可以使用越來越難的例子(比如雙胞胎)來強化這個神經網絡,以便應對面具等惡意攻擊。那麽使用這種方法有什麽優勢呢?那就是我們終於有了現成的模型,只需要簡單計算出用戶的面部數據在潛在映射(latent map)中的位置,就可以識別出不同的用戶,而無需額外訓練。(就像前面說過的,我們記錄下新的狗狗品種的矢量值,然後保存起來。)此外,FaceID還可以適應臉部的變化,包括突發性變化(比如眼鏡、帽子、化妝等)以及緩慢變化(毛發等)。這基本上是通過向映射中增加參考矢量,並根據新外觀進行計算而實現的。

技術分享圖片

FaceID可以適應外觀的變化

  接下來,讓我們看看如何利用Python和Keras實現。

  使用Keras實現FaceID

  就像所有的機器學習項目一樣,我們首先需要的是數據。創建自己的數據集需要花費大量時間和許多人的配合,這項工作本身可能非常具有挑戰性。因此,我搜索了網絡上RGB-D的人臉數據集,找到了一個非常合適的數據集(http://www.vap.aau.dk/rgb-d-face-database/)。這個數據集是根據人臉面向不同的方向以及不同的表情制作出的RGB-D圖像集,正好類似於iPhone X的情況。

  最終的實現可以參考我的GitHub代碼庫(https://github.com/normandipalo/faceID_beta hbs90.cn),裏面有個Jupyter Notebook。我還進一步嘗試了使用Colab Notebook,你也可以試試看。

  我創建了一個基於SqueezeNet架構的卷積網絡。這個神經網絡以兩組RGBD的面部圖像(即4通道圖像)作為輸入,並輸出兩組數據之間的距離。該網絡用對比損失函數(constrastive loss)訓練,可以最大程度地減少同一人的照片之間的距離,同時最大程度地提高不同人的照片之間的距離。

技術分享圖片

對比損失函數

  經過一段時間的訓練後,這個神經網絡可以將人臉映射到128維數組中,並將同一個人的照片分在一組,與其他人的照片分離。這意味著,該神經網絡只需計算解鎖過程中拍攝的照片與註冊階段存儲的照片之間的距離,就可以實現解鎖設備。如果距離低於某個閾值,則設備解鎖(閾值越小,設備越安全)。

  我使用t-SNE算法在二維空間中顯示了128維的嵌入空間。每種顏色都對應不同的人,可以看出,網絡已經學會了將這些圖片分組並緊密排列。當使用t-SNE算法時,簇之間的距離沒有意義。使用PCA降維算法時也會看到一個有趣的圖。

技術分享圖片

使用t-SNE創建嵌入空間中的人臉的簇,每種顏色代表不同的面孔(但顏色被重復使用)

技術分享圖片

使用PCA創建嵌入空間中的人臉的簇,每種顏色都是不同的面孔(但顏色被重復使用)

  實驗!

  現在我們可以試試個模型,模擬一個常見的FaceID的流程:首先,註冊用戶的面部;然後在解鎖階段,需要驗證兩個方面——主人可以解鎖,而其他人不可以。 如前所述,區別在於神經網絡會計算解鎖手機時和註冊時的臉部的距離,然後判斷是否在某個閾值以下。

  下面我們來註冊:我從數據集中采集了同一人的一系列照片,並模擬了註冊階段。現在該設備將計算每個姿勢的嵌入,並保存在本地。

技術分享圖片

新用戶註冊階段,模仿FaceID的過程

技術分享圖片

在深度相機中觀察到的註冊階段

技術分享圖片

嵌入空間中同一個用戶的面部距離

技術分享圖片

嵌入空間中不同用戶的面部距離

  因此,我們可以將閾值設置為大約0.4,就可以阻止陌生人解鎖設備了。

  結論

  在這篇文章中,我展示了如何利用面部嵌入和孿生卷積神經網絡,實現FaceID解鎖機制的原型。希望對你能有所幫助。

iPhone X的新解鎖技術:用Python編寫Face ID