我是如何在 Python 內使用深度學習實現 iPhone X的FaceID 的
雷鋒網按:本文為 AI 研習社編譯的技術博客,原標題 How I implemented iPhone X"s FaceID using Deep Learning in Python,作者為 SHIVAM BANSAL。
翻譯 | 陶玉龍 餘杭 校對 | Lamaric 整理 | MY
在最近推出的 iPhone X 中,它被討論最多的特點之一是它採用了新的解鎖方法,即 TouchID:FaceID。
在研發出無邊框手機後,蘋果公司想開發一種新的方法來快捷地對手機進行解鎖。雖然一些競爭對手依舊在繼續使用指紋感測器,把它放置在手機的不同位置上,但蘋果公司決定進行創新,採用革命性的方式來進行手機解鎖:用戶只需要簡單地看它就可以。藉助於先進的(非常小)前置相機,iPhone X 能夠對用戶的臉創建一個 3D 地圖。此外,這項技術使用紅外攝像機捕獲用戶面部的照片,對環境的光和顏色變化具有更好的魯棒性。使用深度學習技術,智能手機能夠很好地了解用戶的臉部,當他每次拿起電話時都能準確認出他。令人驚訝的是,蘋果公司稱這種方法比 TouchID 技術更安全,錯誤率僅為 1:1,000,000。
我對蘋果公司使用的 FaceID 技術非常感興趣,主要是因為這一切都是在移動設備上進行的,這項技術只利用了用戶的臉進行了少量的初始訓練,然後在每次拿起電話時都流暢地運行。我專註於如何使用深度學習來實現這一過程,以及如何對每一步進行優化。在本文中,我將演示如何使用 keras 實現 FaceID 這一類演算法。我會解釋我所採取的各種架構決定,並展示一些我最終完成的實驗,這些實驗是我使用 Kinect 來完成,一個非常受歡迎的 RGB 深度相機,它與 iPhone X 前置相機有著非常相似的輸出(但在一個更大的設備上)。坐好,然後美美的喝一杯咖啡,讓我們開始逆向搭建蘋果這一改變遊戲規則的功能。
理解 FaceID
「用於 FaceID 的神經網路並不是簡單地執行分類」。
FaceID 的安裝過程
第一步是仔細分析 FaceID 是如何在 iPhone X 上工作的。蘋果公司官方布的白皮書可以幫助我們理解 FaceID 的基本機制。為了使用 TouchID,用戶必須先按幾次感測器來錄入他的指紋。在大約 15 到 20 次不同的觸摸之後,智能手機就完成了指紋的錄入,TouchID 也準備好了。同樣,使用 FaceID,用戶必須錄入他的臉部照片。這個過程非常簡單:用戶只需像平常那樣看著手機,然後慢慢地旋轉一個圓圈,把不同的姿勢的臉部錄入手機中。就這樣,我們完成了這個過程,你的手機已經準備好解鎖了。這種快速的錄入過程可以告訴我們很多有關底層學習的演算法。例如,神經網路的 FaceID 不僅僅是執行分類,我會在下文解釋原因。
蘋果公司主頁揭曉 iPhone X 和 FaceID 的示例圖
對於神經網路而言,執行分類操作意味著他需要通過學習來預測它所看到的面孔是否屬於之前看過的那個用戶。因此,一般來說它應該使用一些訓練數據來預測真或假,但與許多其他的深層學習案例不同,在這裡,這種方法是行不通的。首先,網路應該使用從用戶的面部獲得的新數據進行重新訓練。這將需要大量的時間、會造成很多能量消耗以及會有很多不同面孔產生的負樣本訓練數據(在傳輸學習和已訓練的網路的精細調整方面幾乎沒有變化)。此外,這種方法幾乎沒有會被利用的可能性,對於蘋果公司而言,他們會在離線情況下訓練一個更複雜的網路,通常是在他們的實驗室,然後把這些已經訓練好的網路裝載到手機中進行應用。我相信 FaceID 是由一個孿生卷積神經網路支持的,它被蘋果公司訓練成「離線」狀態,將臉部映射成一個低維的潛在空間,用對比損失表示方法來最大化不同人臉之間的距離。用這種方法,你得到了一個單階段學習的體系結構,就像他們在要點中提到的一樣。我知道,這裡可能有一些名詞讀者並不是很熟悉:繼續閱讀,我會逐步解釋我想表達的意思。
現在看起來,FaceID 會成為 TouchID 之後的新標準。蘋果公司會把這項技術帶到他們研製的所有新設備中嗎?
從人臉到數字的神經網路
一個孿生神經網路是由兩個基本相同的神經網路組成,它們共享所有的權重。這種架構可以計算特定類型的數據之間的距離,例如圖像。這個思路是通過孿生神經網路傳遞數據(或者簡單地通過兩個不同的步驟通過同一個網路傳遞數據),網路將它映射到一個低維特徵空間中,比如一個 n 維數組,然後訓練網路進行映射的搭建,以便儘可能地使用來自不同類的數據點,而讓來自同一類的數據點儘可能接近。從長遠來看,網路將學會從數據中提取最有意義的特徵,並將其壓縮為數組,從而創建有意義的映射。要想直觀地理解這一點,想像一下你是如何使用小矢量來描述狗品種的,讓相似的狗有更接近的矢量。您可能會使用一個數字對狗的毛色進行標記,一個數字用於表示狗的大小,另一個數字用於表示毛髮的長度,依此類推。用這種方式,彼此相似的狗將具有彼此相似的矢量。著看上去是一個很聰明的方法,對吧?類似於什麼一個自動編碼器,孿生神經網路可以為你學會如何去實現這一個過程。
這張圖來自 Hadsell、Chopra 和 LeCun 發表的論文「Dimensionality Reduction by Learning an Invariant Mapping」。注意該結構是如何學習數字之間的相似性並自動將它們分組為二維的。類似的技術被應用於 Iphone X 的面部識別技術中。
運用這項技術,人們可以使用大量的臉部圖像對這個架構進行訓練,從而識別出哪些臉部最為相似。在擁有合適的預算和計算能力時(正如 Apple 公司那樣),人們也可以使用更難的例子來使網路更具魯棒性,諸如雙胞胎,對抗性攻擊(掩碼)等。那麼使用這種方法的最大優勢是什麼呢?你最終會擁有一個即插即用模型,在無需進一步訓練的前提下可以識別出不同用戶,只需在初始設置過程中拍攝一些照片,計算用戶臉部在隱藏圖中的位置。(想像一下,正如前文所述,我們為新的狗品種寫下它的矢量,然後將其存放在某處)。此外,FaceID 能夠適應臉部的一些變化:突然變化(例如眼鏡,帽子,化妝)和減慢變化(面部毛髮)。這是通過在此圖中基本添加參考面向量來完成的,這些參數可以根據您的新外表進行計算。
當您的外觀發生變化時,FaceID 會自動適配。
現在,讓我們看看如何使用 Keras 在 Python 中實現它。
在 Keras 中實現 FaceID
對於所有機器學習項目來說,我們首先數據集。創建我們自己的數據集需要時間同時離不開和其他許多人的合作,這可能非常具有挑戰性。因此,我瀏覽了網頁上的 RGB-D 人臉數據集,我找到了一個看起來非常合適的例子。它由由一系列從不同方向拍攝、有不同面部表情的 RGB-D 圖片組成,就像在 iPhone X 用例中一樣。
如果想查看最終實現過程,你可以查看我的 GitHub 庫,在裡面可以找到一個 Jupyter Notebook 文件。此外,我利用 Colab Notebook 進行實驗,你也可以試一試。
我創建了一個基於 SqueezeNet 架構的卷積網路。網路將一系列人臉的四通道 RGBD 圖像作為輸入,輸出兩個嵌入之間的距離。網路訓練有一個恆定的損失,最小化同一個人的圖片之間的距離,並最大化不同人的圖片之間的距離。
對比損失
訓練過後,神經網路已經能夠把臉部映射成一個 128 維矩陣,同一個人的照片組合在一起,與其他人的照片相距很遠。這意味著,為了解鎖你的設備,神經網路只需要計算在註冊階段解鎖設備時存儲的相片與它所使用的相片之間的距離。如果這個距離低於某個特定的閾值,(閾值越小,安全性越高)那麼設備即可解鎖。
我使用 t-SNE 演算法在二維空間中可視化 128 維嵌入空間。每個顏色對應於一個不同的人:正如你所看到的,神經網路已經學會把這些相片緊緊地組合在一起。(使用 t-SNE 演算法時,簇之間的距離是毫無意義的)。使用 PCA 降維演算法時會生成一個非常有趣的圖片。
採用 t-SNE 創建的嵌入空間面的簇。每種顏色是不同的面貌(但顏色重複使用)。
使用 PCA 在嵌入空間中生成臉部數據簇。每個顏色代表一個不同的臉部(顏色是重複使用的)
驗證!
......
想要繼續閱讀,請移步至我們的AI研習社社區:http://www.gair.link/page/TextTranslation/766
更多精彩內容盡在 AI 研習社。
不同領域包括計算機視覺,語音語義,區塊鏈,自動駕駛,數據挖掘,智能控制,編程語言等每日更新。
雷鋒網雷鋒網(公眾號:雷鋒網


※SMP 2018 首日,前沿技術講習班四大主題報告一覽
※科大訊飛Hi!MORFEI智能家居開發大賽火熱招募中,500萬獎金等你拿!
TAG:雷鋒網 |