摘要: 本文主要是展現FaceID解鎖機器的基本工做機制,採用的方法是基於人臉映射和孿生卷積神經網絡,Github上附詳細代碼。算法
對於果粉們來講,對新出的iPhone X討論最多的是其解鎖方式,TouchID的繼承者——FaceID。對於新一代無邊框造型手機而言,各大手機廠商不得不開發新的手機解鎖方法以保持其無邊框造型。一些蘋果手機的競爭對手們繼續使用傳統的指紋識別傳感器,只不過是將其放在其它不影響造型的位置上。而蘋果公司這一次又走在了科技潮流的前沿,對其進行了創新,發明了一種更加簡便快捷的方法——用戶只須要看着手機便可完成解鎖過程。因爲先進的前攝深度相機,iPhone X可以建立用戶人臉的立體圖像,此外,使用紅外相機捕捉用戶面部的圖像,這是爲了使得系統對環境光線、顏色等變化更具備魯棒性。以後,經過深度學習,智能手機可以很好地學習用戶的面部細節,所以使得用戶每次看手機的時候,手機都可以自動識別身份並進行解鎖。有些人會對這種方法的準確率產生質疑,畢竟人的指紋是不會變的,而人臉的特徵會隨着是否留鬍鬚、是否帶眼鏡、化妝等隨之變化。然而使人驚訝的是,蘋果公司宣傳FaceID比TouchID方法更加安全,並且其錯誤率僅爲1:1,000,000。數組
整個系統過程看着很簡單,無非是獲取用戶人臉圖像後,使用深度學習的方法對其進行人臉識別。我好奇的是整個過程是如何應用深度學習方法和如何對每一步驟進行優化,以獲得這麼高的識別正確率。本文將告訴你們我是如何使用Kears實現一個相似於FaceID算法的。安全
「神經網絡給FaceID提供的能力不只僅是執行簡單的分類過程」網絡
第一步是仔細分析FaceID是如何在iPhone X上工做的。他們的白皮書能夠幫助咱們瞭解FaceID的工做機制。機器學習
使用TouchID時,用戶必須先登記本身的指紋,須要在指紋傳感器上按壓幾回,通過大約十幾種不一樣方位的採集後,智能手機完成整個登記過程。同理,FaceID也須要用戶首先登記本身的人臉信息,這個過程更加簡單,用戶只須要看着手機,而後沿着圓圈慢慢轉動頭部便可,這樣使得可以登記來自不一樣角度的人臉信息。這種極快的登記方法涵蓋了不少底層的學習算法,下面將一一介紹。性能
對於神經網絡而言,執行分類過程意味着學習預測智能手機所看到的人臉是否爲其登記的人臉。所以,應該使用一些訓練數據來學習到辨別「真」或「假」的能力。但從原理上來說,這與許多深度學習案例不同,傳統的一些深度學習方法是使用大量訓練數據集來訓練模型,這將須要花費大量的時間、精力等。此外,對於蘋果公司而言,先訓練一個更復雜的離線「網絡模型」,訓練好後將其遷移到手機上,這樣的一種方法是不會被採用的。我相信FaceID是基於相似於孿生卷積神經網絡(Siamese CNN)實現的,而且經過離線訓練。將人臉映射成一個低維的潛在空間,使得不一樣人臉之間的距離最大化,使用對比損失(contrastive loss)衡量模型的性能。學習
孿生神經網絡基本上由兩個相同的神經網絡組成,它們之間共享全部的權重。這種體系結構能夠學習計算特定數據類型之間的距離,好比圖像。個人想法是經過孿生神經網絡,將用戶圖像映射到一個低維的特徵空間,相似於一個n維數組,以後訓練網絡進行映射,以便儘量地從不一樣類別中提取數據點,而來自同一類別的數據點儘量地接近。歸根到底,網絡將學習從數據中提取最有意義的特徵,並將其壓縮成數組,以後建立有意義的映射。孿生神經網絡可以作到這一點,自動編碼器一樣也能作到。優化
使用這種技術,人們可使用大量的人臉來訓練這樣的網絡模型以識別哪個面孔與用戶者最類似。就像蘋果公司所作的那樣,人們可使用更難的圖像數據來加強網絡對雙胞胎、敵對攻擊(掩碼)等的魯棒性,使其擁有正確的預測和計算能力。使用這種方法的一個最大優勢是得到了一個即插即用模型,它能夠識別不一樣的用戶,只須要簡單地將初始設置時拍攝的圖像映射到潛在空間中,而不須要任何進一步的訓練。此外,FaceID可以適應你各方面的變化:忽然變化(如眼鏡、帽子、化妝等)和緩慢變化(鬍鬚等)。這些是經過在映射特徵空間中添加參考向量,根據新的外觀計算出來的。編碼
對於全部的機器學習項目而言,首先須要的就是數據。建立本身的數據集須要花費不少時間和精力。所以,本文經過瀏覽網頁得到一個RGB-D人臉數據集。這些RGB-D圖像數據是由一系列面向不一樣方向以及不一樣面部表情的人臉組成,這和iPhone X使用的數據同樣。人工智能
爲了看到最終的實現效果,你能夠看看我我的的GitHub主頁,在裏面能夠發現有一個Jupyter Notebook。此外,我使用Colab Notebook完成本文實驗。
本文建立了一個基於SqueezeNet的卷積神經網絡模型,該網絡模型將RGBD人臉圖像做爲網絡的輸入,其輸出是兩個映射之間的距離。模型訓練時使用的對比損失,最終實現最大限度地減小屬於同一我的的照片之間的距離,最大化不一樣人物照片之間的距離。
通過一些訓練後,網絡可以將人臉映射爲128維數組,這將致使同一我的的照片被分到一塊兒,而和其餘人的照片儘量的遠。這意味着爲了解鎖手機設備,網絡模型只須要計算在解鎖過程當中所拍攝的圖片與以前登記階段儲存圖片之間的距離。若是距離低於某一閾值(該值越小越安全),設備才解鎖。
我使用T-SNE算法將128維中的兩維特徵進行可視化,每種顏色都對應着一個不一樣的人。正如圖中所示,網絡模型已經學會對這些圖片進行分組。此外,使用PCA降維算法時,其獲得的可視化圖像也頗有趣。
實驗模擬仿真整個FaceID的流程:首先,對用戶面部登記;而後,在解鎖階段,模型經過計算解鎖時檢測到的人臉與以前登記人臉之間的距離,並肯定它是否在設定的閾值如下,最終判斷是否應該解鎖手機。
如今讓咱們從登記用戶開始:從數據集中獲取同一我的的一系列照片,並模擬登記過程。設備計算出這些圖片的特徵映射,並將其存儲在本地內存中。
如今看看若是是同一個用戶試圖解鎖設備會發生什麼狀況。同一用戶的不一樣姿式和麪部表情都會得到一個較低的距離,大約平均爲0.30左右。
下面看看若是是不一樣用戶嘗試解鎖設備會發生什麼狀況。不一樣用戶的人臉圖像計算獲得的距離平均爲1.10。
所以,使用一個0.40左右的閾值就應該足夠防止陌生人解鎖您的手機設備。
本文主要是展現FaceID解鎖機器的基本工做機制,採用的方法是基於人臉映射和孿生卷積神經網絡。本文的Python代碼能夠在這裏得到,但願本文對你有所幫助。
做者信息
Norman Di palo,羅馬大學學生,專一於人工智能、機器人。
文章原標題《How I implemented iPhone X’s FaceID using Deep Learning in Python》,做者:Norman Di palo
文章爲簡譯,更爲詳細的內容,請查看原文