翻譯 | AI科技大本營(公眾號ID:rgznai100) 參與 | 林椿眄 編輯 | 費棋 FaceID 是新款 iPhone X 最受歡迎的功能之一,它取代 TouchID 成為了最前沿的解鎖方式。 一些蘋果的競爭對手們還在繼續(xù)沿用著傳統(tǒng)的指紋解鎖方式,F(xiàn)aceID 解鎖方式顯然是革命性的:掃你一眼,手機自動解鎖。 為了實現(xiàn) FaceID 技術(shù),蘋果采用了先進(jìn)而小巧的前置深度相機,這使得 iPhone X 能創(chuàng)建用戶臉部的 3D 映射。此外,它還引入了紅外相機來捕捉用戶臉部圖片,它拍攝到的圖片對外界環(huán)境的光線和顏色變化具有更強的魯棒性。通過深度學(xué)習(xí),智能手機能夠非常詳細(xì)了解用戶臉部信息。所以當(dāng)用戶接電話時,手機就會自動識別并解鎖。但更令人吃驚的或許是它的安全性,蘋果公司技術(shù)人員表示,相比于 TouchID ,F(xiàn)aceID 的出錯率只有 1:1000000。 我對蘋果 FaceID 及其背后的深度學(xué)習(xí)技術(shù)非常感興趣,想知道如何使用深度學(xué)習(xí)來實現(xiàn)及優(yōu)化這項技術(shù)的每個步驟。在本文中,我將介紹如何使用深度學(xué)習(xí)框架 Keras 實現(xiàn)一個類似 FaceID 的算法,解釋我所采取的各種架構(gòu)決策,并使用 Kinect 展示一些最終實驗結(jié)果。Kinect 是一種非常流行的 RGB 深度相機,它會產(chǎn)生與 iPhone X 前置攝像頭類似的結(jié)果。 ▌理解 FaceID 工作原理 FaceID 的設(shè)置過程 首先,我們需要分析 FaceID 的工作原理,了解它是如何在 iPhone X 上運作的。但在這之前,我們還是說一下 TouchID 一些基本操作:當(dāng)用戶使用 TouchID 時,必須按壓幾次傳感器進(jìn)行初始化,并且記錄指紋,大約經(jīng)過 15-20 次不同角度的觸摸之后,指紋信息將在手機上完成注冊,這樣 TouchID 也就準(zhǔn)備就緒了。 同樣地,使用 FaceID 也需要用戶注冊他\她的臉,這個過程非常簡單:用戶只需以一種自然的方式看手機屏幕,然后慢慢將頭部轉(zhuǎn)一圈,以不同姿勢記錄臉部信息。如此,用戶就可以使用手機的人臉解鎖功能了。 這樣快速的注冊過程可以告訴我們一些 FaceID 背后深度學(xué)習(xí)算法的相關(guān)信息。例如,支持 FaceID 的神經(jīng)網(wǎng)絡(luò)不僅僅是執(zhí)行分類這么簡單。 Apple Keynote 推出 iPhone X 和 FaceID 新功能 對神經(jīng)網(wǎng)絡(luò)而言,一個目標(biāo)分類任務(wù)意味著模型需要去推測一張臉是否與該用戶匹配。通常情況下,解決這類問題要使用一些數(shù)據(jù)來訓(xùn)練模型,讓模型學(xué)習(xí)如何辨別真(Ture)假(False)。不過,這種方法卻不能應(yīng)用到 FaceID 的模型訓(xùn)練中,它不同于其他深度學(xué)習(xí)案例。 首先,神經(jīng)網(wǎng)絡(luò)需要重新使用從用戶臉上獲得的新數(shù)據(jù)進(jìn)行訓(xùn)練,而這需要大量時間、能耗和龐雜的人臉訓(xùn)練數(shù)據(jù),這種方法不切實際。當(dāng)然,你也可以用遷移學(xué)習(xí),對預(yù)訓(xùn)練好的網(wǎng)絡(luò)進(jìn)行微調(diào),情況可能會有所好轉(zhuǎn),但也無法從根本上解決問題。此外,這種方法也無法利用蘋果實驗室中離線訓(xùn)練好的復(fù)雜網(wǎng)絡(luò),這樣也就不能將更先進(jìn)的網(wǎng)絡(luò)模型部署到手機上了。 那 FaceID 的模型訓(xùn)練究竟如何呢? 實際上,F(xiàn)aceID 使用的是類似暹羅式卷積神經(jīng)網(wǎng)絡(luò)(siamese-like convolutional neural network)來驅(qū)動。這種網(wǎng)絡(luò)模型是由蘋果離線訓(xùn)練好的,能將臉部信息映射到低維潛在空間,通過使用對比損失(contrastive loss)來最大化不同人臉之間的差異。如此,你就得到了一個準(zhǔn)確的、適用于少樣本學(xué)習(xí)(one-shot learning)的模型結(jié)構(gòu),而這種模型在只有少量訓(xùn)練樣本的情況下,也能夠?qū)W習(xí)樣本特征并進(jìn)行推測分類。 ▌暹羅神經(jīng)網(wǎng)絡(luò)及其優(yōu)勢 一般而言,它由兩種相同神經(jīng)網(wǎng)絡(luò)組成,這兩種神經(jīng)網(wǎng)絡(luò)共享所有權(quán)重。該網(wǎng)絡(luò)結(jié)構(gòu)可以計算特定類型的數(shù)據(jù)(如圖像)之間的距離。通過暹羅網(wǎng)絡(luò)傳遞數(shù)據(jù),或者簡單地通過兩個不同步驟向同一網(wǎng)絡(luò)傳遞數(shù)據(jù),網(wǎng)絡(luò)會將其映射到一個低維特征空間,好比一個 n 維數(shù)組。然后,你需要訓(xùn)練網(wǎng)絡(luò)產(chǎn)生特征映射,從而獲取盡可能多的不同類別的數(shù)據(jù)點,而同一類別的數(shù)據(jù)點盡可能是接近的。 我們所希望的是,該網(wǎng)絡(luò)能夠從數(shù)據(jù)中提取并學(xué)習(xí)到最有意義的特征,并將其壓縮成一個數(shù)組,來創(chuàng)建一個有意義的映射。 為了能更直觀地理解這一過程,想象一下如何使用 small vector 來描述狗的品種,使得相似的狗具有更接近的向量。你可能會用一個數(shù)字來編碼狗的毛色、狗的大小、毛的長度等等。這樣,相似的狗就會具有相似的特征向量。同樣地,一個暹羅神經(jīng)網(wǎng)絡(luò)可以幫你完成這件事,用不同編碼來表示目標(biāo)的不同特征,就像是一個自動編碼器。 上圖來自 Hadsell,Chopra 和 LeCun 發(fā)表的論文“Dimensionality Reduction by Learning an Invariant Mapping”。注意,模型是如何學(xué)習(xí)數(shù)字之間的相似性,并在二維空間中自動地將它們分組的。FaceID 就采用了與這類似的技術(shù)。 通過這種技術(shù),人們可以使用大量人臉數(shù)據(jù)來訓(xùn)練這樣的模型結(jié)構(gòu),最終目標(biāo)是讓模型自動識別哪些人臉是最相似的。此外,我們不僅需要對模型的計算成本有準(zhǔn)確預(yù)算,還要讓模型能夠適應(yīng)越來越難的人臉案例,譬如使神經(jīng)網(wǎng)絡(luò)對識別諸如雙胞胎、對抗性攻擊(掩模)等事物時也具有強魯棒性。 蘋果的這種方法的優(yōu)勢在哪里? 我們最終擁有的是一個現(xiàn)用模型,只需在初始設(shè)置過程中拍攝一些人臉照片后,計算人臉位于所在的臉部映射空間中的位置即可,而不需要再進(jìn)一步訓(xùn)練或優(yōu)化模型以識別不同用戶。正如前面狗的品種分類問題一樣,它為一只新品種的狗編碼其特征向量,并將其存儲到特征空間。此外,F(xiàn)aceID 能夠自適應(yīng)用戶的面部變化,如一些突兀的變化(眼鏡、帽子和化妝)和一些輕微的變化(面部毛發(fā))。這些特征變化通常只需通過在臉部特征空間添加一些參考面向量即可,之后再根據(jù)這些向量進(jìn)行新的面部特征計算。 FaceID 能自動適應(yīng)臉部變化 下面,我將介紹如何在 Python 中用 Keras 框架來實現(xiàn)上述過程。 ▌用 Keras 實現(xiàn) FaceID 對于所有的機器學(xué)習(xí)項目而言,首先需要的是數(shù)據(jù)。創(chuàng)建我們自己的人臉數(shù)據(jù)集需要大量時間和人工成本,這將是個極具挑戰(zhàn)性的任務(wù)。我在網(wǎng)上看到一個 RGB-D 人臉數(shù)據(jù)集,發(fā)現(xiàn)它非常合適作為我們的人臉數(shù)據(jù)集。該數(shù)據(jù)集由一系列面向不同方向,并帶不同人臉表情的 RGB-D 圖片組成,就像 iPhone X 中 FaceID 所需的人臉數(shù)據(jù)一樣。 然后,我構(gòu)建了一個基于 SqueezeNet 架構(gòu)的卷積神經(jīng)網(wǎng)絡(luò)。該網(wǎng)絡(luò)以耦合人臉的 RGBD 圖像作為輸入,因此輸入圖像的維度是 4 通道,輸出則是兩個嵌入值之間的距離。該網(wǎng)絡(luò)訓(xùn)練時會產(chǎn)生一種對比損失,可以最大限度減少圖片中相似的人之間的距離,并使圖片中不同的人之間的距離最大化。對比損失函數(shù)的數(shù)學(xué)表達(dá)式如下: 對比損失函數(shù)表達(dá)式 經(jīng)過模型訓(xùn)練后,該網(wǎng)絡(luò)能夠?qū)⑷四樣成涑?128 維數(shù)組,并將圖片中相同的人分在同一組,與圖片中其他人的距離盡可能遠(yuǎn)。這意味著,要解鎖你的手機,該網(wǎng)絡(luò)只需計算在解鎖過程中拍攝的人臉照片與注冊時所存儲的人臉照片之間的距離。 如果這個距離低于某個閾值,則會解鎖手機,閾值設(shè)置得越小,你的手機將越安全。 此外,我使用了 t-SNE 算法在 2 維空間上可視化 128 維的嵌入空間,用每種顏色對應(yīng)不同的人:正如下面你所看到的,該網(wǎng)絡(luò)已經(jīng)學(xué)會如何將這些人臉進(jìn)行準(zhǔn)確分組。值得注意的是,使用 t-SNE 算法進(jìn)行可視化時,簇(cluster)與簇之間的距離沒有意義。此外,當(dāng)你使用 PCA 降維算法進(jìn)行可視化時也會看到一些有趣的現(xiàn)象。 使用 t-SNE 算法在嵌入空間生成不同的人臉簇。每一種顏色代表不同人臉(這里部分顏色被重復(fù)使用) 使用 PCA 算法在嵌入空間生成不同人臉簇。每種顏色代表不同人臉(這里部分顏色被重復(fù)使用) ▌實驗! 現(xiàn)在,我們將模擬一個通用的 FaceID 解鎖過程,看看其中的模型是如何進(jìn)行運作的。首先,注冊一個用戶的臉部信息;在解鎖階段,其他用戶在正常情況下都不能夠成功解鎖設(shè)備。如前所述,神經(jīng)網(wǎng)絡(luò)會在解鎖階段計算當(dāng)前人臉與所注冊人臉圖片之間的距離,并且會查看該距離是否小于某個閾值。 我們從注冊階段開始,在數(shù)據(jù)集中采集同一個人的人臉照片,并模擬整個注冊階段。 隨后該設(shè)備將計算當(dāng)前每個人臉姿勢的嵌入,并將其存儲在本地。 一個新用戶在 FaceID 上的注冊過程 來自深度相機所看到的注冊過程 現(xiàn)在來看,當(dāng)同一用戶試圖解鎖設(shè)備時會發(fā)生什么?我們可以看到,來自同一用戶的不同姿勢和面部表情都有著較低的距離,平均距離約為 0.30。 嵌入空間中來自同一用戶的人臉距離計算 而不同的人的 RGBD 人臉圖像,計算得到的距離值為 1.1。 嵌入空間中來自不同用戶的人臉距離計算 因此,將距離閾值設(shè)置為 0.4 就足以防止陌生人解鎖你的手機。 ▌結(jié)論 在這篇文章中,從概念到實驗驗證,展示了如何基于人臉嵌入和暹羅卷積神經(jīng)網(wǎng)絡(luò)來實現(xiàn)FaceID 的解鎖機制。 所有相關(guān) Python 代碼都在這里,收好不謝! https://github.com/normandipalo/faceID_beta 原作者 | Norman Di Palo 原文鏈接 https:///how-i-implemented-iphone-xs-faceid-using-deep-learning-in-python-d5dbaa128e1d |
|