1. 程式人生 > >蘋果部落格解讀iPhone上的人臉識別深度神經網路

蘋果部落格解讀iPhone上的人臉識別深度神經網路

蘋果首次將深度學習應用於人臉識別是在 iOS 10 上。通過 Vision 框架,開發者現在可以在 App 中將該技術與其他很多計算機視覺演算法進行整合。為了保護使用者隱私,保證有效執行,蘋果在開發這個框架的過程中克服了大量挑戰。本文旨在探討這些挑戰,並介紹人臉識別演算法。

簡介

通過 CIDetector 類,蘋果首先借助核心影象(Core Image)框架中的公共 API 公開了人臉識別技術。這個 API 同樣也用在蘋果 App 中,比如 Photos。最早版本的 CIDetector 使用了一種基於 Viola-Jones 檢測演算法的方法 [1]。我們基於 CIDetector 的後續改進推動了傳統計算機視覺的發展。

隨著深度學習的出現,及其在計算機視覺問題上的應用,當前最優的人臉識別精確度獲得巨大提升。我們不得不重新思考我們的方法,從而搭上這次正規化轉換的便車。相較於傳統計算機視覺,深度學習模型需要更大數量級的記憶體、硬碟和算力。當下典型的高階智慧手機並不是執行深度學習視覺模型的一個可行平臺。業界的絕大多數解決方案是深度學習雲端 API,在這些方案中,影象被髮送到雲端的伺服器,並藉助深度學習推理完成人臉的分析和檢測。雲服務通常使用記憶體巨大的桌面級 GPU。非常大型的模型及其整合能夠執行在雲伺服器端,從而客戶端(移動手機)也具備了在本地端不可能實現的深度學習能力。

蘋果的 iCloud Photo 庫是一個專為圖片和視訊儲存設計的雲解決方案。然而由於蘋果對使用者隱私的保護,我們無法使用 iCloud 伺服器進行計算機視覺計算。每個圖片和視訊加密之後,才會傳送到 iCloud Photo 進行儲存,並且只能通過已註冊 iCloud 賬戶的裝置解密。因此,為讓使用者體驗到基於深度學習的計算機視覺解決方案,我們選擇迎難而上,使深度學習演算法執行在 iPhone 上。

我們面臨著若干個挑戰,深度學習模型需要作為一部分封裝進手機作業系統,佔用寶貴的 NAND 儲存空間。它們同樣需要被載入進 RAM,並在 GPU 和/或 CPU 上消耗大量計算時間。與雲服務只能單獨專注地解決一個視覺問題不同,裝置內建計算的同時必須與其他執行的應用共享這些系統資源。最後,計算必須足夠高效才能在一個合理的短時間內處理一個大的 Photos 庫,並不帶有顯著的功耗或過熱問題。

余文討論了我們的演算法——一種基於深度學習的人臉識別方法,以及我們如何成功地克服挑戰取得了當前最佳的精確度。討論內容如下:

  • 我們如何(通過 BNNS 和 Metal)充分利用 GPU 和 CPU
  • 網路推理的記憶體優化、影象載入和快取
  • 我們如何以一種符合 iPhone 預期的、不會干擾其他多項同時任務的方式來實現網路

從 Viola-Jones 到深度學習

2014 年,當我們開始用深度學習檢測影象中的人臉之時,深度卷積網路(DCN)剛剛在物體識別任務中取得有希望的結果。其中最突出的一個方法是「OverFeat」[2],它的一些簡單想法證明 DCN 在掃描物體影象時相當有效,這使得 OverFeat 很流行。

OverFeat 描述了神經網路全連線層與卷積層之間的等價性,其與輸入具有相同空間維度的濾波器的有效卷積。該項工作表明,一個固定接受野(比如 32x32,自然步幅為 16 畫素)的二值分類網路可以有效應用於任意大小(比如 320x320)的影象,從而產出一個適當大小(20x20)的輸出對映。OverFeat 論文中同樣提出了通過有效減少網路步幅而產出更密集輸出對映的聰明方法。

我們在 OverFeat 論文的基礎上構建了最初架構,形成一個全卷積網路(見圖 1),其中包含以下多工目標:

  • 一個預測輸入中有或沒有人臉的二元分類,以及
  • 一個預測最優地定位輸入中人臉邊界框引數的迴歸。

我們嘗試了若干個方法訓練該網路。比如,一個簡單的訓練步驟是建立一個固定大小的大型影象塊資料集,該影象塊對應於網路的最小有效輸入,使得每個塊產生來自網路的單個輸出。這一訓練資料集達到了理想的平衡,因此,一半的影象塊包含人臉(正類),一半不包含人臉(負類)。對於每個正塊,我們提供該人臉的實際位置(x, y, w, h)。我們訓練這個網路優化上述的多工目標。一旦訓練完成,網路就能夠預測一個塊是否含有人臉,如果是,它還提供該圖塊中人臉的座標和比例。

37831face-detection-dcn.png

圖 1. 一個用於人臉識別的改進版 DCN

由於網路是全卷積的,它可以有效處理一個任意大小的影象,併產出一個 2D 輸出對映。對映上的每個點對應於輸入影象上的一個塊,並含有來自網路的預測,比如該塊中是否有人臉,它在該輸入塊中的位置和比例(參見圖 1 中 DCN 的輸入和輸出)。

通過這一網路,我們接著構建一個相當標準的處理通道以執行人臉檢測,該通道包含一個多尺度影象金字塔、人臉檢測器網路和一個後處理模組。我們需要一個多尺度金字塔處理不同大小的人臉。接著我們把這一網路應用於金字塔的每個層,並從每層中收集候選的檢測(見圖 2)。後處理模組接著整合這些候選檢測,產出對應於網路影象人臉最後預測的一系列邊界框。

56688face-detection-workflow.png

圖 2. 人臉檢測的工作流程

這種策略使我們能用裝置內建的深度卷積網路更徹底地掃描影象。但網路複雜度和尺度仍然是制約效能的主要瓶頸。要克服這種困難意味著不僅要將網路限制為簡單的拓撲結構,而且還要限制網路的層數、每一層的通道數和卷積濾波器的核的大小。這些限制導致了一個關鍵的問題:我們的網路在達到可接受的準確率的同時必須是簡單的,至多隻能有 20 多個層,且由幾個 network-in-network[3] 模組組成。在我們之前描述的影象掃描框架中使用這樣的網路是完全不可能的,不僅效能不足且能耗很大。實際上,我們甚至無法將把網路載入到記憶體上。然後,問題變成了如何訓練一個簡單和緊緻的網路以模仿準確率高但非常複雜的網路的行為。

我們決定提出一種方法,非正式地稱為「老師—學生」訓練 [4]。這個方法提供了一種機制以訓練另外一個窄而深的網路(「學生」),並以此儘可能匹配(之前描述的)已經訓練過的大型複雜網路(「老師」)的輸出。學生網路由簡單而重複的 3x3 卷積和池化層組成,其架構經過了深度定製,以使我們的神經網路推理引擎達到最佳效能。(見圖 1)

最後,我們現在已經開發了一種適用於裝置內建執行的人臉檢測的深度神經網路演算法。經過多次迭代訓練我們獲得了在指定的應用中有足夠準確率的網路模型。雖然網路已經足夠準確和靈活,但要在實際中部署到幾百萬使用者的裝置中的話,還需要做大量的工作。

優化影象通道

對深度學習的切實考慮使我們決定為開發者設計一種易用的框架,稱為 Vision。我們很快就意識到,優秀的演算法不足以構建優秀的框架。我們需要一個高度優化的影象通道。

我們不希望開發者把精力花費在考慮縮放、顏色轉換或影象來源上。人臉檢測應該在無論是實時攝像頭捕捉流、視訊處理還是光碟或網頁影象處理上都能工作得很好,不管使用何種影象表示和格式。

我們考慮了能耗和記憶體佔用的問題,特別是在流媒體和影象捕捉上。尤其是 64M 畫素全景圖,其記憶體佔用特別大。為了解決這些問題,我們在大型影象(甚至包括非典型的長寬比)的計算機視覺任務中使用了部分子取樣解碼(partial subsampled decoding)和自動平鋪(automatic tiling)技術。

另一項挑戰是色彩空間匹配。蘋果有一系列廣泛的色彩空間 API,但我們不希望開發者徒增色彩匹配任務的負擔。Vision 框架可以處理色彩匹配,從而降低了將計算機視覺應用到 app 中的門檻。

Vision 還通過高效的處理過程和對中間影象的複用進行了優化。人臉檢測、人臉基準檢測和幾種其它計算機視覺任務都是在相同比例的中間影象上工作的。通過為演算法提取介面,和為影象或快取分配處理的座標,Vision 可以建立影象並把影象放入快取記憶體,以提升多種計算機視覺任務的效能,而不需要開發者做任何額外工作。

另一方面也是如此。從中心介面(central interface)的角度看,我們可以把開發方向引導至更好地複用或共享中間影象。Vision 能執行多種不同且獨立的計算機視覺演算法。為了使不同的演算法能同時順利執行,實現中使用的輸入解析度和色彩空間將盡可能在所有的演算法中共享。

優化裝置內建的效能

如果我們的人臉檢測 API 不能應用到實時 App 和後臺系統處理中,其易用性也沒有什麼意義。使用者們希望人臉檢測能在處理他們的照片庫進行面部識別的時候,或在拍攝照片後立即進行分析的時候,能夠平滑地執行。他們不希望這個應用太耗電或拖慢系統執行的速度。蘋果的移動裝置都是多工處理裝置。因此,後臺計算機視覺處理不應該顯著影響系統的其餘部分的功能。

我們實現了幾種策略以最小化記憶體佔用和 GPU 的使用。為了減少記憶體佔用,我們通過分析計算圖分配神經網路的中間層。這允許我們在相同的快取中應用多種層結構。雖然記憶體佔用是完全確定的,但這項技術能在不影響效能和不出現記憶體碎片的前提下降低記憶體佔用,且可以在 CPU 和 GPU 上使用。

Vision 的檢測器同時執行 5 個網路(如圖 2 所示,每一個網路應用於一個影象金字塔,image pyramid scale)。這 5 個網路共享相同的權重和引數,但有不同形狀的輸入、輸出和中間層。為了進一步減少記憶體佔用,我們在由那 5 個網路組成的聯合圖(joint graph)上運行了以活躍度為基礎(liveness-based)的記憶體優化演算法,從而顯著降低了記憶體佔用。而且,多個網路複用相同的權重和引數快取,從而降低了記憶體需求。

為了獲得更好的效能,我們利用了網路的全卷積本質:所有的尺度都會動態地改變大小以匹配輸入影象的解析度。與擬合矩形網路視網膜(通過空白帶填充)上的影象相比,將網路擬合影象的尺寸使我們能大幅度地降低總運算次數。由於運算的拓撲不隨重塑尺寸改變,和分配器的剩餘高效能,動態重塑不會因為分配而造成效能開銷。

為了保證當深度神經網路在後臺執行的時候的 UI 的靈敏度和流暢度,我們分離 GPU 工作項,併為網路的每一層分配,直到每一層的時間消耗小於 1 毫秒,使得驅動程式能及時轉換到更高優先順序的任務中,比如 UI 動畫,從而減少甚至消除掉幀現象。綜上所述,所有這些策略保證了使用者可以享受本地的、低延遲的、個人深度學習推理,而沒有任何效能降低的體驗。

如何使用 Vision 框架

我們達成了開發一個性能優異、易於上手的人臉識別 API 的目標了嗎?使用這一視覺框架之後,你自然會明白。下面是該框架的上手方法:

  • 觀看 WWDC 2017 大會相關演示:https://developer.apple.com/videos/play/wwdc2017/506/
  • 閱讀該框架的參考說明:https://developer.apple.com/documentation/vision
  • 嘗試 Core ML 和該框架:iOS 11 機器學習教程 [5]

參考文獻

[1] Viola, P. and Jones, M.J. Robust Real-time Object Detection Using a Boosted Cascade of Simple Features. In Proceedings of the Computer Vision and Pattern Recognition Conference, 2001.

[2] Sermanet, Pierre, David Eigen, Xiang Zhang, Michael Mathieu, Rob Fergus, and Yann LeCun. OverFeat: Integrated Recognition, Localization and Detection Using Convolutional Networks. arXiv:1312.6229 [Cs], December, 2013.

[3] Lin, Min, Qiang Chen, and Shuicheng Yan. Network In Network. arXiv:1312.4400[Cs], December, 2013.

[4] Romero, Adriana, Nicolas Ballas, Samira Ebrahimi Kahou, Antoine Chassang, Carlo Gatta, and Yoshua Bengio. FitNets: Hints for Thin Deep Nets. arXiv:1412.6550 [Cs], December, 2014.

[5] Tam, A. Core ML and Vision: Machine learning in iOS Tutorial. Retrieved from https://www.raywenderlich.com, September, 2017.