Python新玩法!如何本身動手實現FaceID功能

做者 | Norman Di Palo
譯者 | 大愚若智
編輯 | Emily
AI 前線導讀:本文探討了 Face ID 功能是如何在設備本地,僅經過少許訓練就能實現極高識別率的,並介紹了基於面容嵌入和連體卷積網絡,使用 Python 代碼實現相似機制的方法。

更多幹貨內容請關注微信公衆號「AI 前線」,(ID:ai-front)

對 iPhone X 的全新解鎖機制進行逆向工程。python

本文涉及到的全部 Python 代碼能夠在這裏獲取。git

https://github.com/normandipalo/faceID_betagithub

圍繞新款 iPhone X 最熱議的話題之一就是用於取代觸控 ID 的全新解鎖機制: Face ID。算法

爲了順利打造出無邊框的全面屏手機,Apple 必須開發一種能快速簡單地解鎖手機的全新方法。雖然不少競品依然在全面屏手機上使用指紋傳感器,但必須將傳感器放置在其餘位置,而 Apple 決定經過創新爲手機開發一種革命性的全新解鎖方式:注視一眼就夠了。藉助先進(而且體積很是小巧)的 前置原深感攝像頭,iPhone X 能夠爲用戶的面孔建立 3D 面譜,此外還會使用紅外鏡頭捕獲用戶面孔照片,這樣即可更好地適應環境光線與色彩的變化。藉助 深度學習 技術,這款手機能夠學習用戶面容的細節變化,確保用戶每次拿起本身的手機後都能快速解鎖。使人驚訝的是,Apple 宣稱這種方法甚至 比觸控 ID 更安全,錯誤率可低至 1:1,000,000。安全

我對 Apple 實現 Face ID 所用的技術很好奇,尤爲是考慮到這個功能徹底是在設備本地實現的,只須要經過用戶面容進行少許訓練,就能夠在用戶每次拿起手機後很是流暢天然地完成識別。因而我研究瞭如何使用深度學習技術實現這一過程,並對每一個步驟進行優化。本文我將介紹如何使用 Keras 實現相似於 Face ID 的算法。我會介紹在選擇最終架構時的考慮因素,以及經過 Kinect 這一流行的 RGB 和景深攝像頭(能得到與 iPhone X 的前置攝像頭很是相似的輸出結果,但體積略大)進行實驗的過程。找個溫馨的姿式坐下來,端起茶杯,開始進行 Apple 創新功能的逆向工程吧。微信


理解 Face ID

「…驅動 Face ID 的神經網絡並不只僅是執行分類操做那麼簡單。」網絡

Face ID 的配置過程架構

首先須要細緻分析一下 iPhone X 中 Face ID 的工做原理。Apple 提供的白皮書能夠幫助咱們理解有關 Face ID 的基礎機制。在使用觸控 ID 時,用戶首先要觸碰傳感器屢次,以註冊本身的指紋。在進行過大約 15–20 次觸碰後,便可完成註冊過程,隨後就可使用了。相似的,使用 Face ID 時,用戶也要註冊本身的面孔信息。整個過程很是簡單:按照正常使用時的操做注視本身的手機,隨後緩慢旋轉頭部畫圈,經過不一樣姿態註冊本身的面孔便可。就這麼簡單,隨後就能夠用本身的面孔解鎖手機。這個極爲快速的註冊過程可讓咱們深度瞭解該技術底層的學習算法。例如,驅動 Face ID 的神經網絡並不只僅是執行分類操做那麼簡單,下文會介紹具體緣由。app

Apple Keynote 演示文稿中展現的 iPhone X 和Face IDiphone

對於神經網絡來講,執行分類操做意味着須要學着預測本身看到的面孔是否就是用戶本人的面孔。所以基本上,神經網絡須要經過一些訓練數據來預測「真」或「假」,可是與不少其餘深度學習用例不一樣的地方在於,此時使用這種方法是不可行的。首先,網絡須要經過從用戶面孔新得到的數據,從頭開始從新進行訓練,這將須要花費大量時間並消耗大量電力,而不一樣面孔會產生數量多到不切實際的訓練數據,這也會產生消極的影響(就算使用遷移學習或對已訓練網絡進一步優化,效果也不會有太大改善)。此外,這種方法將沒法讓 Apple 以「脫機」方式訓練更復雜的網絡,例如在實驗室中訓練網絡,而後將訓練好的網絡包含在產品中交付給用戶使用。所以我認爲,Face ID 是由一種連體(Siamese-like)卷積神經網絡驅動的,該網絡由 Apple「脫機」訓練而來,可將面孔映射爲低維隱空間(Low-dimensional latent space),並經過形狀調整,使用對比損失(Contrastive loss)的方式得到不一樣用戶面孔間的最大距離。藉此打造的架構只須要經過一張照片便可學習,這一點在發佈會的演講上也有提到。我知道,這其中涉及的某些技術可能對不少讀者而言還顯得挺陌生,下文將按部就班地進行介紹。

Face ID 彷佛會成爲繼觸控 ID 以後的新標準,Apple 是否會讓之後的全部設備都支持它?

使用神經網絡實現從面容到數據的轉換

簡單地說,連體神經網絡實際上由兩個徹底相同的神經網絡組成,這兩個網絡會共享全部權重。這種架構能夠學着計算特定類型的數據,例如圖片間的距離。而其主要目的在於,向連體網絡傳遞一對數據(或向同一個網絡傳遞處於兩個不一樣階段的數據),網絡會將其映射至一個低維特徵空間,例如 n 維陣列,隨後訓練網絡實現所需映射關係,讓來自不一樣類的數據點可以儘量遠離,同時讓來自同一個類的數據點可以儘量接近。經過長時間運行,網絡便可學習從數據中提取最有意義的特徵,並用這些特徵產生陣列,建立出有意義的映射。爲了更直觀地理解這一過程,能夠假設你本身使用小向量描述狗的種類的方法,越是相似的狗,它們就會有越接近的向量。你可能會使用某個數字表明狗毛顏色,用另外一個數字表明狗的大小,並用其餘數字表明狗毛長度,以此類推。經過這種方式,類似的狗將得到類似的向量。很聰明對吧!而連體神經網絡能夠經過學習幫助咱們作到這一點,這也有些相似 autoencoder 的功能。

Hadsell、Chopra 和 LeCun 撰寫的論文《Dimensionality Reduction by Learning an Invariant Mapping》中提供的插圖。請留意該架構學習不一樣數字之間類似性,並將其自動分組爲兩個維度的方法。相似的方法也能夠用於處理面容信息。

經過這種技術,咱們可使用大量面容照片訓練相似的架構來識別哪些面孔是類似的。只要(像 Apple 那樣)有足夠的預算和運算能力,任何人均可以使用難度愈來愈大的樣本改善網絡的健壯性,成功應對雙胞胎、對抗性攻擊(面具)等場景。使用這種方式的最終優點是什麼?咱們終於能夠經過一個即插即用模型直接識別不一樣用戶,而無需任何進一步的訓練,只要在初始配置時拍攝一些照片,隨後計算用戶的面孔與面孔的隱映射(Latent map)之間的距離就好了。(按照上文所述,這個過程能夠類比爲:對新出現的狗記錄下品種的相關向量,隨後將其存儲在某個地方。)此外 Face ID 還能夠適應用戶面容的變化,例如突發的變化(眼鏡、帽子、化妝等)以及緩慢的變化(面部毛髮)。這其實是經過在映射中添加基於新外貌計算出的參考性質的面容向量實現的。

Face ID 能夠適應用戶外表的變化

最後,讓咱們一塊兒來看看如何使用 Python 在 Keras 中實現這一切。

在 Keras 中實現Face ID

對於全部機器學習項目,首先咱們須要有數據。自行建立數據集須要花費大量時間,還須要不少人配合,這可能不太好實現。所以我在網上搜索現成的 RGB-D 面容數據集,而且還真找到了一個很是適合的。其中包含一系列 RGB-D 形式的人臉圖片,圖片採用不一樣角度和表情拍攝,徹底符合 iPhone X 的實際用例。

爲了直接看到最終效果,能夠訪問個人 GitHub 代碼庫,我在這裏提供了一個 Jupyter Notebook。此外我還試驗過使用 Colab Notebook,你本身也能夠試試。

隨後我建立了一個基於 SqueezeNet 架構的卷積網絡。該網絡能夠接受 RGBD 格式的四通道人臉圖片做爲輸入,並輸出兩個圖片之間的距離。該網絡使用對比損失的方式訓練,藉此在同一我的的不一樣照片之間得到最小距離,並在不一樣人的照片之間得到最大距離。

對比損失

訓練以後,該網絡可將面容映射爲 128 維度的陣列,同一我的的不一樣照片可分組在一塊兒,並會拉開不一樣人的照片之間的距離。這意味着若是要解鎖你的設備,網絡只須要計算解鎖時所拍攝的照片以及註冊階段所存儲的照片間的距離便可。若是距離低於某個閾值(閾值越小,安全性越高),設備便可順利解鎖。

我使用 t-SNE 算法對 128 維度的嵌入空間進行二維可視化,並用每一個顏色對應一我的員。如你所見,網絡已經能夠學着將圖片進行儘量緊密的分組。(使用 t-SNE 算法時,聚類間的距離已再也不重要)。在使用 PCA 降維算法時還出現了一種有趣的分佈。

使用 t-SNE 在嵌入空間中建立的面容聚類。每一個顏色表明一個不一樣的人臉(不過顏色有重複使用)

使用 PCA 在嵌入空間中建立的面容聚類。每一個顏色表明一個不一樣的人臉(不過顏色有重複使用)

開始實驗!

接着能夠試試這個模型的效果了,咱們將模擬 Face ID 的操做過程:首先註冊用戶面容,隨後分別使用用戶本人(應該能成功)以及他人的面容(應該會失敗)試着解鎖。正如上文所述,兩種狀況的差別在於,網絡對解鎖時以及註冊時拍攝的面容計算出的距離,以及這個距離究竟是低於仍是高於某個閾值。

首先註冊:從數據集中挑選同一我的的不一樣照片,而後模擬註冊過程。隨後設備會開始計算不一樣姿式的嵌入,並將其存儲在本地。

模擬 Face ID 的新用戶註冊環節

景深攝像頭在註冊階段看到的內容

接着看看用戶本人解鎖設備時會發生什麼。同一我的的不一樣姿式和麪部表情產生的距離很小,平均僅爲大約 0.30。

同一用戶在嵌入空間中的面容距離。

然而不一樣用戶的 RGBD 照片的平均距離高達 1.1。

不一樣用戶在嵌入空間中的面容距離。

所以將閾值設置爲 0.4 左右就足以防止陌生人解鎖你的設備。

結論

本文介紹了基於面容嵌入和連體卷積網絡,從概念證明的角度實現 Face ID 解鎖機制的方法。但願本文對你有所幫助。本文涉及到的 Python 代碼可在這裏獲取。

閱讀英文原文:

https://towardsdatascience.com/how-i-implemented-iphone-xs-faceid-using-deep-learning-in-python-d5dbaa128e1d


更多幹貨內容請關注微信公衆號「AI 前線」,(ID:ai-front)

相關文章
相關標籤/搜索