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

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

參與 | 林椿眄git

編輯 | 費棋github


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

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

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

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

▌理解 FaceID 工做原理

FaceID 的設置過程▲​架構

首先,咱們須要分析 FaceID 的工做原理,瞭解它是如何在 iPhone X 上運做的。但在這以前,咱們仍是說一下 TouchID 一些基本操做:當用戶使用 TouchID 時,必須按壓幾回傳感器進行初始化,而且記錄指紋,大約通過 15-20 次不一樣角度的觸摸以後,指紋信息將在手機上完成註冊,這樣 TouchID 也就準備就緒了。app

一樣地,使用 FaceID 也須要用戶註冊他\她的臉,這個過程很是簡單:用戶只需以一種天然的方式看手機屏幕,而後慢慢將頭部轉一圈,以不一樣姿式記錄臉部信息。如此,用戶就可使用手機的人臉解鎖功能了。框架

這樣快速的註冊過程能夠告訴咱們一些 FaceID 背後深度學習算法的相關信息。例如,支持 FaceID 的神經網絡不只僅是執行分類這麼簡單。

Apple Keynote 推出 iPhone X 和 FaceID 新功能▲​

對神經網絡而言,一個目標分類任務意味着模型須要去推測一張臉是否與該用戶匹配。一般狀況下,解決這類問題要使用一些數據來訓練模型,讓模型學習如何辨別真(Ture)假(False)。不過,這種方法卻不能應用到 FaceID 的模型訓練中,它不一樣於其餘深度學習案例。

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

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

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

▌暹羅神經網絡及其優點

通常而言,它由兩種相同神經網絡組成,這兩種神經網絡共享全部權重。該網絡結構能夠計算特定類型的數據(如圖像)之間的距離。經過暹羅網絡傳遞數據,或者簡單地經過兩個不一樣步驟向同一網絡傳遞數據,網絡會將其映射到一個低維特徵空間,比如一個 n 維數組。而後,你須要訓練網絡產生特徵映射,從而獲取儘量多的不一樣類別的數據點,而同一類別的數據點儘量是接近的。

咱們所但願的是,該網絡可以從數據中提取並學習到最有意義的特徵,並將其壓縮成一個數組,來建立一個有意義的映射。

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


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

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

蘋果的這種方法的優點在哪裏?

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

FaceID 能自動適應臉部變化▲​

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

▌用 Keras 實現 FaceID

對於全部的機器學習項目而言,首先須要的是數據。建立咱們本身的人臉數據集須要大量時間和人工成本,這將是個極具挑戰性的任務。我在網上看到一個 RGB-D 人臉數據集,發現它很是合適做爲咱們的人臉數據集。該數據集由一系列面向不一樣方向,並帶不一樣人臉表情的 RGB-D 圖片組成,就像 iPhone X 中 FaceID 所需的人臉數據同樣。

而後,我構建了一個基於 SqueezeNet 架構的卷積神經網絡。該網絡以耦合人臉的 RGBD 圖像做爲輸入,所以輸入圖像的維度是 4 通道,輸出則是兩個嵌入值之間的距離。該網絡訓練時會產生一種對比損失,能夠最大限度減小圖片中類似的人之間的距離,並使圖片中不一樣的人之間的距離最大化。對比損失函數的數學表達式以下:

對比損失函數表達式▲​

通過模型訓練後,該網絡可以將人臉映射成 128 維數組,並將圖片中相同的人分在同一組,與圖片中其餘人的距離儘量遠。這意味着,要解鎖你的手機,該網絡只需計算在解鎖過程當中拍攝的人臉照片與註冊時所存儲的人臉照片之間的距離。 若是這個距離低於某個閾值,則會解鎖手機,閾值設置得越小,你的手機將越安全。

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

使用 t-SNE 算法在嵌入空間生成不一樣的人臉簇。每一種顏色表明不一樣人臉(這裏部分顏色被重複使用)▲​

使用 PCA 算法在嵌入空間生成不一樣人臉簇。每種顏色表明不一樣人臉(這裏部分顏色被重複使用)▲​

▌實驗!

如今,咱們將模擬一個通用的 FaceID 解鎖過程,看看其中的模型是如何進行運做的。首先,註冊一個用戶的臉部信息;在解鎖階段,其餘用戶在正常狀況下都不可以成功解鎖設備。如前所述,神經網絡會在解鎖階段計算當前人臉與所註冊人臉圖片之間的距離,而且會查看該距離是否小於某個閾值。

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

一個新用戶在 FaceID 上的註冊過程▲​

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

如今來看,當同一用戶試圖解鎖設備時會發生什麼?咱們能夠看到,來自同一用戶的不一樣姿式和麪部表情都有着較低的距離,平均距離約爲 0.30。

嵌入空間中來自同一用戶的人臉距離計算▲​

而不一樣的人的 RGBD 人臉圖像,計算獲得的距離值爲 1.1。

嵌入空間中來自不一樣用戶的人臉距離計算▲​

所以,將距離閾值設置爲 0.4 就足以防止陌生人解鎖你的手機。

▌結論

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

全部相關 Python 代碼都在這裏,收好不謝!


原做者 | Norman Di Palo

原文連接

相關文章
相關標籤/搜索