用Python及深度學(xué)習(xí)實現(xiàn)iPhone X的FaceID功能
對于果粉們來說,對新出的iPhone X討論最多的是其解鎖方式,TouchID的繼承者——FaceID。對于新一代無邊框造型手機而言,各大手機廠商不得不開發(fā)新的手機解鎖方法以保持其無邊框造型。一些蘋果手機的競爭對手們繼續(xù)使用傳統(tǒng)的指紋識別傳感器,只不過是將其放在其它不影響造型的位置上。而蘋果公司這一次又走在了科技潮流的前沿,對其進(jìn)行了創(chuàng)新,發(fā)明了一種更加簡便快捷的方法——用戶只需要看著手機即可完成解鎖過程。
由于先進(jìn)的前攝深度相機,iPhone X能夠創(chuàng)建用戶人臉的立體圖像,此外,使用紅外相機捕捉用戶面部的圖像,這是為了使得系統(tǒng)對環(huán)境光線、顏色等變化更具有魯棒性。之后,通過深度學(xué)習(xí),智能手機能夠很好地學(xué)習(xí)用戶的面部細(xì)節(jié),因此使得用戶每次看手機的時候,手機都能夠自動識別身份并進(jìn)行解鎖。有些人會對這種方法的準(zhǔn)確率產(chǎn)生質(zhì)疑,畢竟人的指紋是不會變的,而人臉的特征會隨著是否留胡須、是否帶眼鏡、化妝等隨之變化。然而令人驚訝的是,蘋果公司宣傳FaceID比TouchID方法更加安全,而且其錯誤率僅為1:1,000,000。
整個系統(tǒng)過程看著很簡單,無非是獲取用戶人臉圖像后,使用深度學(xué)習(xí)的方法對其進(jìn)行人臉識別。我好奇的是整個過程是如何應(yīng)用深度學(xué)習(xí)方法和如何對每一步驟進(jìn)行優(yōu)化,以得到這么高的識別正確率。本文將告訴大家我是如何使用Kears實現(xiàn)一個類似于FaceID算法的。
了解FaceID
“神經(jīng)網(wǎng)絡(luò)給FaceID提供的能力不僅僅是執(zhí)行簡單的分類過程”
第一步是仔細(xì)分析FaceID是如何在iPhone X上工作的。他們的白皮書可以幫助我們了解FaceID的工作機制。
使用TouchID時,用戶必須先登記自己的指紋,需要在指紋傳感器上按壓幾次,經(jīng)過大約十幾種不同方位的采集后,智能手機完成整個登記過程。同理,F(xiàn)aceID也需要用戶首先登記自己的人臉信息,這個過程更加簡單,用戶只需要看著手機,然后沿著圓圈慢慢轉(zhuǎn)動頭部即可,這樣使得能夠登記來自不同角度的人臉信息。這種極快的登記方法涵蓋了很多底層的學(xué)習(xí)算法,下面將一一介紹。
對于神經(jīng)網(wǎng)絡(luò)而言,執(zhí)行分類過程意味著學(xué)習(xí)預(yù)測智能手機所看到的人臉是否為其登記的人臉。因此,應(yīng)該使用一些訓(xùn)練數(shù)據(jù)來學(xué)習(xí)到辨別“真”或“假”的能力。但從原理上來講,這與許多深度學(xué)習(xí)案例不一樣,傳統(tǒng)的一些深度學(xué)習(xí)方法是使用大量訓(xùn)練數(shù)據(jù)集來訓(xùn)練模型,這將需要花費大量的時間、精力等。此外,對于蘋果公司而言,先訓(xùn)練一個更復(fù)雜的離線“網(wǎng)絡(luò)模型”,訓(xùn)練好后將其遷移到手機上,這樣的一種方法是不會被采用的。我相信FaceID是基于類似于孿生卷積神經(jīng)網(wǎng)絡(luò)(Siamese CNN)實現(xiàn)的,并且通過離線訓(xùn)練。將人臉映射成一個低維的潛在空間,使得不同人臉之間的距離最大化,使用對比損失(contrastive loss)衡量模型的性能。
從人臉到神經(jīng)網(wǎng)絡(luò)
孿生神經(jīng)網(wǎng)絡(luò)基本上由兩個相同的神經(jīng)網(wǎng)絡(luò)組成,它們之間共享所有的權(quán)重。這種體系結(jié)構(gòu)可以學(xué)習(xí)計算特定數(shù)據(jù)類型之間的距離,比如圖像。我的想法是通過孿生神經(jīng)網(wǎng)絡(luò),將用戶圖像映射到一個低維的特征空間,類似于一個n維數(shù)組,之后訓(xùn)練網(wǎng)絡(luò)進(jìn)行映射,以便盡可能地從不同類別中提取數(shù)據(jù)點,而來自同一類別的數(shù)據(jù)點盡可能地接近。歸根到底,網(wǎng)絡(luò)將學(xué)習(xí)從數(shù)據(jù)中提取最有意義的特征,并將其壓縮成數(shù)組,之后創(chuàng)建有意義的映射。孿生神經(jīng)網(wǎng)絡(luò)能夠做到這一點,自動編碼器同樣也能做到。
使用這種技術(shù),人們可以使用大量的人臉來訓(xùn)練這樣的網(wǎng)絡(luò)模型以識別哪一個面孔與用戶者最相似。就像蘋果公司所做的那樣,人們可以使用更難的圖像數(shù)據(jù)來增強網(wǎng)絡(luò)對雙胞胎、敵對攻擊(掩碼)等的魯棒性,使其擁有正確的預(yù)測和計算能力。使用這種方法的一個最大優(yōu)點是獲得了一個即插即用模型,它可以識別不同的用戶,只需要簡單地將初始設(shè)置時拍攝的圖像映射到潛在空間中,而不需要任何進(jìn)一步的訓(xùn)練。此外,F(xiàn)aceID能夠適應(yīng)你各方面的變化:突然變化(如眼鏡、帽子、化妝等)和緩慢變化(胡須等)。這些是通過在映射特征空間中添加參考向量,根據(jù)新的外觀計算出來的。
用Kears實現(xiàn)FaceID
對于所有的機器學(xué)習(xí)項目而言,首先需要的就是數(shù)據(jù)。創(chuàng)建自己的數(shù)據(jù)集需要花費很多時間和精力。因此,本文通過瀏覽網(wǎng)頁獲得一個RGB-D人臉數(shù)據(jù)集。這些RGB-D圖像數(shù)據(jù)是由一系列面向不同方向以及不同面部表情的人臉組成,這和iPhone X使用的數(shù)據(jù)一樣。
為了看到最終的實現(xiàn)效果,你可以看看我個人的GitHub主頁,在里面可以發(fā)現(xiàn)有一個Jupyter Notebook。此外,我使用Colab Notebook完成本文實驗。
本文創(chuàng)建了一個基于SqueezeNet的卷積神經(jīng)網(wǎng)絡(luò)模型,該網(wǎng)絡(luò)模型將RGBD人臉圖像作為網(wǎng)絡(luò)的輸入,其輸出是兩個映射之間的距離。模型訓(xùn)練時使用的對比損失,最終實現(xiàn)最大限度地減少屬于同一個人的照片之間的距離,最大化不同人物照片之間的距離。
經(jīng)過一些訓(xùn)練后,網(wǎng)絡(luò)能夠?qū)⑷四樣成錇?28維數(shù)組,這將導(dǎo)致同一個人的照片被分到一起,而和其他人的照片盡可能的遠(yuǎn)。這意味著為了解鎖手機設(shè)備,網(wǎng)絡(luò)模型只需要計算在解鎖過程中所拍攝的圖片與之前登記階段儲存圖片之間的距離。如果距離低于某一閾值(該值越小越安全),設(shè)備才解鎖。
我使用T-SNE算法將128維中的兩維特征進(jìn)行可視化,每種顏色都對應(yīng)著一個不同的人。正如圖中所示,網(wǎng)絡(luò)模型已經(jīng)學(xué)會對這些圖片進(jìn)行分組。此外,使用PCA降維算法時,其得到的可視化圖像也很有趣。
實驗
實驗?zāi)M仿真整個FaceID的流程:首先,對用戶面部登記;然后,在解鎖階段,模型通過計算解鎖時檢測到的人臉與之前登記人臉之間的距離,并確定它是否在設(shè)定的閾值以下,最終判斷是否應(yīng)該解鎖手機。
現(xiàn)在讓我們從登記用戶開始:從數(shù)據(jù)集中獲取同一個人的一系列照片,并模擬登記過程。設(shè)備計算出這些圖片的特征映射,并將其存儲在本地內(nèi)存中。
現(xiàn)在看看如果是同一個用戶試圖解鎖設(shè)備會發(fā)生什么情況。同一用戶的不同姿勢和面部表情都會獲得一個較低的距離,大約平均為0.30左右。
下面看看如果是不同用戶嘗試解鎖設(shè)備會發(fā)生什么情況。不同用戶的人臉圖像計算得到的距離平均為1.10。
因此,使用一個0.40左右的閾值就應(yīng)該足夠防止陌生人解鎖您的手機設(shè)備。
結(jié)論
本文主要是展示FaceID解鎖機器的基本工作機制,采用的方法是基于人臉映射和孿生卷積神經(jīng)網(wǎng)絡(luò)。本文的Python代碼可以在這里獲得,希望本文對你有所幫助。
作者信息
Norman Di palo,羅馬大學(xué)學(xué)生,專注于人工智能、機器人。