如何用Python實現iPhone X的人臉解鎖功能?

AI科技大本營發表於2018-03-15

640?wx_fmt=png&wxfrom=5&wx_lazy=1


翻譯 | AI科技大本營(公眾號ID:rgznai100)

參與 | 林椿眄

編輯 | 費棋


FaceID 是新款 iPhone X 最受歡迎的功能之一,它取代 TouchID 成為了最前沿的解鎖方式。


一些蘋果的競爭對手們還在繼續沿用著傳統的指紋解鎖方式,FaceID 解鎖方式顯然是革命性的:掃你一眼,手機自動解鎖。


為了實現 FaceID 技術,蘋果採用了先進而小巧的前置深度相機,這使得 iPhone X 能建立使用者臉部的 3D 對映。此外,它還引入了紅外相機來捕捉使用者臉部圖片,它拍攝到的圖片對外界環境的光線和顏色變化具有更強的魯棒性。通過深度學習,智慧手機能夠非常詳細瞭解使用者臉部資訊。所以當使用者接電話時,手機就會自動識別並解鎖。但更令人吃驚的或許是它的安全性,蘋果公司技術人員表示,相比於 TouchID ,FaceID 的出錯率只有 1:1000000。


我對蘋果 FaceID 及其背後的深度學習技術非常感興趣,想知道如何使用深度學習來實現及優化這項技術的每個步驟。在本文中,我將介紹如何使用深度學習框架 Keras 實現一個類似 FaceID 的演算法,解釋我所採取的各種架構決策,並使用 Kinect 展示一些最終實驗結果。Kinect 是一種非常流行的 RGB 深度相機,它會產生與 iPhone X 前置攝像頭類似的結果。


640?wx_fmt=gif


理解 FaceID 工作原理

      

640?wx_fmt=gif

FaceID 的設定過程


首先,我們需要分析 FaceID 的工作原理,瞭解它是如何在 iPhone X 上運作的。但在這之前,我們還是說一下 TouchID 一些基本操作:當使用者使用 TouchID 時,必須按壓幾次感測器進行初始化,並且記錄指紋,大約經過 15-20 次不同角度的觸控之後,指紋資訊將在手機上完成註冊,這樣 TouchID 也就準備就緒了。


同樣地,使用 FaceID 也需要使用者註冊他\她的臉,這個過程非常簡單:使用者只需以一種自然的方式看手機螢幕,然後慢慢將頭部轉一圈,以不同姿勢記錄臉部資訊。如此,使用者就可以使用手機的人臉解鎖功能了。


這樣快速的註冊過程可以告訴我們一些 FaceID 背後深度學習演算法的相關資訊。例如,支援 FaceID 的神經網路不僅僅是執行分類這麼簡單。


640?wx_fmt=png

Apple Keynote 推出 iPhone X 和 FaceID 新功能


對神經網路而言,一個目標分類任務意味著模型需要去推測一張臉是否與該使用者匹配。通常情況下,解決這類問題要使用一些資料來訓練模型,讓模型學習如何辨別真(Ture)假(False)。不過,這種方法卻不能應用到 FaceID 的模型訓練中,它不同於其他深度學習案例。


首先,神經網路需要重新使用從使用者臉上獲得的新資料進行訓練,而這需要大量時間、能耗和龐雜的人臉訓練資料,這種方法不切實際。當然,你也可以用遷移學習,對預訓練好的網路進行微調,情況可能會有所好轉,但也無法從根本上解決問題。此外,這種方法也無法利用蘋果實驗室中離線訓練好的複雜網路,這樣也就不能將更先進的網路模型部署到手機上了。


那 FaceID 的模型訓練究竟如何呢?


實際上,FaceID 使用的是類似暹羅式卷積神經網路(siamese-like convolutional neural network)來驅動。這種網路模型是由蘋果離線訓練好的,能將臉部資訊對映到低維潛在空間,通過使用對比損失(contrastive loss)來最大化不同人臉之間的差異。如此,你就得到了一個準確的、適用於少樣本學習(one-shot learning)的模型結構,而這種模型在只有少量訓練樣本的情況下,也能夠學習樣本特徵並進行推測分類。


640?wx_fmt=png


暹羅神經網路及其優勢


一般而言,它由兩種相同神經網路組成,這兩種神經網路共享所有權重。該網路結構可以計算特定型別的資料(如影像)之間的距離。通過暹羅網路傳遞資料,或者簡單地通過兩個不同步驟向同一網路傳遞資料,網路會將其對映到一個低維特徵空間,好比一個 n 維陣列。然後,你需要訓練網路產生特徵對映,從而獲取儘可能多的不同類別的資料點,而同一類別的資料點儘可能是接近的。


我們所希望的是,該網路能夠從資料中提取並學習到最有意義的特徵,並將其壓縮成一個陣列,來建立一個有意義的對映。


為了能更直觀地理解這一過程,想象一下如何使用 small vector 來描述狗的品種,使得相似的狗具有更接近的向量。你可能會用一個數字來編碼狗的毛色、狗的大小、毛的長度等等。這樣,相似的狗就會具有相似的特徵向量。同樣地,一個暹羅神經網路可以幫你完成這件事,用不同編碼來表示目標的不同特徵,就像是一個自動編碼器。


640?wx_fmt=png


上圖自 Hadsell,Chopra 和 LeCun 發表的論文“Dimensionality Reduction by Learning an Invariant Mapping”。注意,模型是如何學習數字之間的相似性,並在二維空間中自動地將它們分組的。FaceID 就採用了與這類似的技術。


通過這種技術,人們可以使用大量人臉資料來訓練這樣的模型結構,最終目標是讓模型自動識別哪些人臉是最相似的。此外,我們不僅需要對模型的計算成本有準確預算,還要讓模型能夠適應越來越難的人臉案例,譬如使神經網路對識別諸如雙胞胎、對抗性攻擊(掩模)等事物時也具有強魯棒性。


蘋果的這種方法的優勢在哪裡?


我們最終擁有的是一個現用模型,只需在初始設定過程中拍攝一些人臉照片後,計算人臉位於所在的臉部對映空間中的位置即可,而不需要再進一步訓練或優化模型以識別不同使用者。正如前面狗的品種分類問題一樣,它為一隻新品種的狗編碼其特徵向量,並將其儲存到特徵空間。此外,FaceID 能夠自適應使用者的面部變化,如一些突兀的變化(眼鏡、帽子和化妝)和一些輕微的變化(面部毛髮)。這些特徵變化通常只需通過在臉部特徵空間新增一些參考面向量即可,之後再根據這些向量進行新的面部特徵計算。


640?wx_fmt=gif

FaceID 能自動適應臉部變化


下面,我將介紹如何在 Python 中用 Keras 框架來實現上述過程。


用 Keras 實現 FaceID


對於所有的機器學習專案而言,首先需要的是資料。建立我們自己的人臉資料集需要大量時間和人工成本,這將是個極具挑戰性的任務。我在網上看到一個 RGB-D 人臉資料集,發現它非常合適作為我們的人臉資料集。該資料集由一系列面向不同方向,並帶不同人臉表情的 RGB-D 圖片組成,就像 iPhone X 中 FaceID 所需的人臉資料一樣。


然後,我構建了一個基於 SqueezeNet 架構的卷積神經網路。該網路以耦合人臉的 RGBD 影像作為輸入,因此輸入影像的維度是 4 通道,輸出則是兩個嵌入值之間的距離。該網路訓練時會產生一種對比損失,可以最大限度減少圖片中相似的人之間的距離,並使圖片中不同的人之間的距離最大化。對比損失函式的數學表示式如下:


640?wx_fmt=png

對比損失函式表示式


經過模型訓練後,該網路能夠將人臉對映成 128 維陣列,並將圖片中相同的人分在同一組,與圖片中其他人的距離儘可能遠。這意味著,要解鎖你的手機,該網路只需計算在解鎖過程中拍攝的人臉照片與註冊時所儲存的人臉照片之間的距離。 如果這個距離低於某個閾值,則會解鎖手機,閾值設定得越小,你的手機將越安全。


此外,我使用了 t-SNE 演算法在 2 維空間上視覺化 128 維的嵌入空間,用每種顏色對應不同的人:正如下面你所看到的,該網路已經學會如何將這些人臉進行準確分組。值得注意的是,使用 t-SNE 演算法進行視覺化時,簇(cluster)與簇之間的距離沒有意義。此外,當你使用 PCA 降維演算法進行視覺化時也會看到一些有趣的現象。


640?wx_fmt=png

使用 t-SNE 演算法在嵌入空間生成不同的人臉簇。每一種顏色代表不同人臉(這裡部分顏色被重複使用)


640?wx_fmt=png

使用 PCA 演算法在嵌入空間生成不同人臉簇。每種顏色代表不同人臉(這裡部分顏色被重複使用)


實驗!


現在,我們將模擬一個通用的 FaceID 解鎖過程,看看其中的模型是如何進行運作的。首先,註冊一個使用者的臉部資訊;在解鎖階段,其他使用者在正常情況下都不能夠成功解鎖裝置。如前所述,神經網路會在解鎖階段計算當前人臉與所註冊人臉圖片之間的距離,並且會檢視該距離是否小於某個閾值。


我們從註冊階段開始,在資料集中採集同一個人的人臉照片,並模擬整個註冊階段。 隨後該裝置將計算當前每個人臉姿勢的嵌入,並將其儲存在本地。


640?wx_fmt=gif

一個新使用者在 FaceID 上的註冊過程


640?wx_fmt=gif

來自深度相機所看到的註冊過程


現在來看,當同一使用者試圖解鎖裝置時會發生什麼?我們可以看到,來自同一使用者的不同姿勢和麵部表情都有著較低的距離,平均距離約為 0.30。


640?wx_fmt=png

嵌入空間中來自同一使用者的人臉距離計算


而不同的人的 RGBD 人臉影像,計算得到的距離值為 1.1。


640?wx_fmt=png

嵌入空間中來自不同使用者的人臉距離計算


因此,將距離閾值設定為 0.4 就足以防止陌生人解鎖你的手機。


結論


在這篇文章中,從概念到實驗驗證,展示瞭如何基於人臉嵌入和暹羅卷積神經網路來實現FaceID 的解鎖機制。


所有相關 Python 程式碼都在這裡,收好不謝!


https://github.com/normandipalo/faceID_beta


原作者 | Norman Di Palo 

原文連結

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



推薦

CSDN出品的AI工程師實訓營成立啦!4個月的實訓,系統性學習,成為AI工程師沒那麼難,歡迎掃碼聯絡!


640?wx_fmt=jpeg


AI科技大本營讀者群(計算機視覺、機器學習、深度學習、NLP、Python、AI硬體、AI+金融、AI+PM方向)正在招募中,關注AI科技大本營微信公眾號,後臺回覆:讀者群,聯絡營長,新增營長請備註姓名,研究方向。

☟☟☟點選 | 閱讀原文 | 檢視更多課程內容

相關文章