1. 程式人生 > >人臉核身技術原理、架構與開發

人臉核身技術原理、架構與開發

1. 概述

  人臉核身指通過×××OCR等技術來構建包含使用者真實身份資訊的底庫,通過指定方式獲取使用者真實照片,利用人臉比對技術秒級確認使用者身份的技術。
  人臉核身技術可用於遠端身份認證、刷臉門禁考勤、安防監控等場景。圖 1的思維導圖簡單描述了人臉核身面臨的問題和包含的技術。
圖1

2. 涉及技術

2.1. 使用者身份採集

  採集真實使用者身份資訊與圖片構成人臉比對的底庫。使用使用者×××OCR技術實現使用者身份資訊的自動採集是目前較常用的方式。
  對於特定領域範圍內的應用(如企業內部的人臉門禁),可由可信機構使用人臉採集裝置進行離線採集。
  對於使用雲服務的第三方應用,可由第三方應用使用雲服務建立使用者資訊庫,由應用採集使用者資訊存入雲服務中。

2.2. 活體檢測

  人臉活體檢測技術在人臉識別過程中判斷操作使用者是否為真人,有效抵禦照片、視訊、模具等作弊***,保障業務安全。
  百度雲網站上[1]描述了下面幾種活體檢測方法:

  • 動作配合式活體檢測:SDK給出指定動作要求,使用者需配合完成,通過實時檢測使用者眼睛,嘴巴,頭部姿態的狀態,來判斷是否是活體。支援7種預設動作,可自定義哪些生效以及檢測順序。
  • 線上圖片活體檢測:基於圖片中人像的破綻(摩爾紋、成像畸形等)來判斷目標物件是否為活體,可有效防止螢幕二次翻拍等作弊***,可使用單張或多張判斷邏輯。
  • H5視訊活體檢測:使用者上傳一個現場錄製的視訊,錄製時讀出隨機分配的語音校驗碼。然後通過分析這個視訊的人臉資訊以及語音校驗碼是否匹配,完成活體檢測判斷。
  • 離線RGB活體檢測:線上圖片活體的離線版本,相對於線上介面方式,本地處理速度更快,無需擔心是否有網路,也無需考慮介面呼叫次數等消耗。
  • 離線近紅外活體檢測:利用近紅外成像原理,實現夜間或無自然光條件下的活體判斷。其成像特點(如螢幕無法成像,不同材質反射率不同等)可以實現高魯棒性的活體判斷。
  • 離線3D結構光活體檢測:基於3D結構光成像原理,通過人臉表面反射光線構建深度影象,判斷目標物件是否為活體,可強效防禦圖片、視訊、螢幕、模具等***。

    2.3. 人臉識別

      人臉識別是人臉檢測,人臉對齊,人臉特徵提取,人臉分析,人臉比對技術的綜合應用。
      使用機器學習(實際應用中使用的演算法可以不同)進行人臉識別的原理[2,3]簡單描述如下:

    1. 在影象中找出人臉部分:將影象轉換為黑白影象,使用方向梯度直方圖(Histogram of Oriented Gradients,簡稱 HOG)的方法:將畫素從明向暗變化的方向定義為梯度,將影象分割成一些 16×16 畫素的小方塊,通過計算每個小方塊中的梯度(以指向性最強的方向代替小方塊)將影象表示為HOG 形式,以捕獲影象的主要特徵。通過將目標影象的HOG與已訓練好的HOG進行相似度的比較,可以判斷出目標影象的人臉區域。
    2. 人臉對齊:臉上普遍存在的特定點被稱為特徵點(landmarks),一般被定義為68個(如圖 2所示)。可使用機器學習演算法找到人臉上的這68個特徵點,使用那些能夠保持圖片相對平行的基本影象變換,例如旋轉和縮放(稱為仿射變換)可使得即使目標人臉具有不同的姿態,都能將眼睛和嘴巴向中間挪動到大致相同的位置,為下一步的面部特徵提取做好準備。
    3. 人臉特徵提取:使用三元組(一張已知的人的面部訓練影象,同一個人的另一張照片,另外一個人的照片)訓練一個深度卷積神經網路,讓它為臉部生成 n 個測量值(同一人的測量值相近,而不同人的測量值有差異),這裡把每張臉的n個測量值稱為一個嵌入(embedding)。機器學習將一個複雜的影象轉換為一個數字向量(embedding)用於計算。
    4. 人臉比對:使用目標人臉在底庫中比對的過程可視為一個分類過程,需要訓練一個分類器(可使用一個簡單的線性 SVM 分類器),使用人臉測量值(embedding)作為輸入進行訓練,而輸出的每一個類別就代表底庫中的每一個人。
      圖2
        卷積神經網路近年來在人臉識別技術中被廣泛應用,如使用DeepID[4,5]這樣的學習模型將人臉圖片轉換為一個多維向量描述的面部特徵。
        圖 3顯示了DeepID的特徵提取流程。
      圖3
        DeepID將一張人臉圖片分為對應人臉10個區域的60個塊(face patchs)作為輸入,每個塊為39×31×k(RGB值時k為3,灰度值時k為1)的長方形或31×31×k的正方形。每個人臉塊作為一個卷積網路的輸入進行訓練,網路的最後一個隱藏層神經元做為所抽取的特徵,這些特徵被輸出為n(如10000)個身份類別。DeepID使用60個卷積網路進行訓練和預測,每個卷積網路對每個輸入塊抽取出兩個160維的向量,這樣對於一張人臉的特徵向量長度為19200維(160×2×60)。
        圖 4顯示了DeepID中的卷積網路架構。可以看到底層網路的特徵隨著層數的遞進而減少,第4層以後剩下的已經是高層次的人臉特徵了。
      圖4
        得到到特徵向量後,進行人臉的識別(比對)可以有多種方法。在論文[4]中除了介紹聯合貝葉斯(Joint Bayesian)分類方法外,還介紹了一種神經網路分類方法,如圖 5所示。
      圖5
        該神經網路的輸入層為使用DeepID抽取的特徵向量。將輸入向量分為60組,每個組中包含目標圖片和底庫圖片對應同一輸入塊的特徵向量(一張圖片的這個塊特徵向量為160×2維,兩張則為640維)。輸出只有一個神經元,即為這兩張圖片的相似度。

      3. 應用架構

        本文將人臉核身系統的架構分為三種:線上架構、離線架構、混合架構。

      3.1. 線上架構

        線上架構適合網路條件良好、人臉庫龐大(萬級別以上)、需要跨地域人臉庫同步等場景。常用於大規模級別的人臉識別業務。系統架構如圖 6所示。
      圖6
        線上架構的人臉核身流程通常為:前端裝置根據支援的活體檢測手段向後端提交視訊(如脣語驗證碼手段)或影象(靜態檢測),活體檢測通過後,後端將從提交的視訊或影象中檢測出的人臉影象與後端的身份資訊庫(底庫)中使用者人臉特徵進行1:1比對,比對結果超過設定閾值則認為核身通過。
        線上架構的一種變形模式是前端裝置向後端傳遞的不是原始的影象資料,而是使用人臉特徵提取模型計算得到人臉特徵資料,這種方式能降低通訊開銷和後端的運算負載,但要求前後端使用的計算模型相同,且需要保持模型的同步更新。

      3.2. 離線架構

        離線架構適合於網路條件不穩定、無網、資料安全性要求高、人臉庫較小(通常為1萬人以下)單臺裝置的人臉識別場景。常見於人證核驗機、人臉門禁/閘機、企業考勤機、自助櫃機等。
        離線架構中根據是否存貯底庫資料分為無底庫模式與有底庫模式。

      3.2.1. 無底庫模式

        無底庫模式適用於實時採集底庫人臉影象與目標人臉影象進行比對的場景,一個典型的用例是人證核驗一體機:該終端包含×××讀卡器,可實時讀取×××中的身份資訊與人臉圖片,幷包含攝像頭實時採集目標人臉影象,與讀卡器得到的×××人臉圖片進行比對完成認證合一驗證的功能。圖 7展示了一個人證核驗一體機。
      圖7

      3.2.2. 有底庫模式

        辦公樓宇/生活小區的人臉門禁/閘機可使用有底庫模式的離線架構。在人臉門禁中儲存一個允許通過的白名單底庫,底庫中儲存著白名單人員的身份資訊與人臉圖片(特徵)。當目標經過人臉門禁時,人臉門禁在本地的白名單底庫中實現1:N的人臉搜尋比對。通過離線人臉搜尋,完成通行者身份核驗,避免網路因素等干擾,確保業務穩定高效執行。

      3.3. 混合架構

        混合結構適合於網路條件較好,人臉庫較小(1萬以下)但變更頻繁的場景,如授權人員變更頻繁的商業樓宇人臉門禁,這時人臉門禁可由後端的人員庫更新通知,及時更新本地人臉門禁中儲存的白名單底庫。
        這裡把混合架構分為幾種模式。

      3.3.1. 前端1:N比對模式

        這種模式的架構如圖 8所示。
      圖8
        這種模式下,前端維護一個白名單底庫和系列人臉演算法模型,目標人臉的1:N比對在前端完成。後端主要提供演算法模型與身份資訊庫對前端的更新,當後端的演算法模型優化演進後,可由後端通知到前端,有前端進行更新;當後端的身份資訊庫發生更新時,也可以實時通知到前端進行更新,實現實時的人臉核證更新。

      3.3.2. 前端1:1比對模式

        這種模式的架構如圖 9所示。
      圖9
        這種模式下,前端不再維護白名單底庫,在需要進行比對時,實時從後端獲取目標影象對應使用者的身份資訊(人臉圖片、特徵)實現1:1比對。這種模式需要前端在向後端請求使用者身份資訊時攜帶使用者標識。

      4. 雲服務與開源

      4.1. 開源軟體

      4.1.1. opencv

        OpenCV(開源計算機視覺庫)是在BSD許可下發布的,因此對學術和商業使用都是免費的。它有c++、Python和Java介面,支援Windows、Linux、Mac OS、iOS和Android。OpenCV是為計算效率而設計的,並且非常注重實時應用。用優化的C/ c++編寫的庫可以利用多核處理。使用OpenCL,它可以利用底層異構計算平臺的硬體加速。
        從OpenCV2.4開始,加入了新的類FaceRecognizer,可以使用它便捷地進行人臉識別。
        其github地址為:https://github.com/opencv
        OpenCV目前最新的版本為4.0版本,圖 10顯示了OpenCV中與人臉有關的類:
      圖10
         為支援web應用,OpenCV.js利用Emscripten將OpenCV函式編譯成asm.js或WebAssembly目標,並提供可訪問的JS API。OpenCV.js是針對web平臺對OpenCV函式選定子集的JavaScript繫結。它使得web前端應用得益於OpenCV強大的多媒體處理功能。
        可以看看OpenCV.js能夠提供什麼功能[6]:

  • 讀取和顯示影象和視訊(使用WebRTC和canvas元素實現視訊的捕獲);
  • 提供豐富的影象處理功能,如:改變顏色,影象的幾何變換,影象閾值化,影象平滑化,形態變換,發現影象梯度,Canny邊緣檢測,影象金字塔,影象的傅立葉變換、餘弦變換, Hough轉換,影象分割、前景提取等;
  • 提供視訊處理功能,如:視訊中物件軌跡跟蹤(Meanshift和Camshift演算法),背景處理等;
  • 提供人臉檢測(使用預先學習好的模型,載入對應的xml檔案,可在視訊流中檢測)功能。

    4.1.2. Dlib

       Dlib是一個包含機器學習演算法和工具的現代c++工具包,用於在c++中建立複雜的軟體來解決現實世界中的問題。。
       其github地址為:https://github.com/davisking/dlib
       其文件地址為:http://dlib.net
       dlib可提供C++和python的呼叫,其提供的演算法庫中包括高質量的人臉識別[7]演算法。

    4.1.3. OpenFace

      OpenFace是一個使用python語言和Torch框架開發的基於深度神經網路的開源人臉識別系統。該系統的理論基礎基於谷歌的文章《FaceNet: A Unified Embedding for Face Recognition and Clustering》[8]。
      其github地址為:https://github.com/cmusatyalab/openface
      其文件地址為:http://cmusatyalab.github.io/openface/
      其工作流程如下:

    1. 用dlib或OpenCV的預先訓練好的模型來檢測人臉。
    2. 為神經網路的計算而變換人臉(對齊)。使用dlib的實時姿態估計和OpenCV的仿射變換,試圖使眼睛和下脣出現在每個影象的相同位置。
    3. 使用深度神經網路將人臉表示為128維超球面單元 (unit hypersphere)。這種表示具有一個特性:即兩個面部特徵向量之間的距離越大,就意味著這兩張臉可能不是同一個人的,該特性使得聚類、相似性檢測和分類任務更容易。
    4. 可將適用的聚類或分類技術應用到特徵向量上,完成識別任務。
        示意圖如圖 11所示。
      圖11
        OpenFace中主要的package如下表所示。
類名 功能
openface.AlignDlib 使用dlib的特徵點估計來對齊人臉,面向神經網路輸入進行預處理。人臉被調整到相同的大小(如96x96),並進行轉換,使特徵點(如眼睛和鼻子)出現在每張影象的相同位置。
openface.TorchNeuralNet 使用Torch子流程進行特徵提取。
openface.data module 物件包含影象元資料的物件。
openface.helper module 幫助模組。

4.1.4. SeetaFaceEngine

  SeetaFace Engine是一個開源的人臉識別引擎,由中科院計算所山世光研究員帶領的人臉識別研究組研發,使用C++實現,包含了人臉相關的一整套過程,包括:人臉檢測、人臉對齊、人臉識別。
  其github地址為:https://github.com/seetaface/SeetaFaceEngine
  其開原始碼可被編譯為3個動態庫(FaceDetection.dll,FaceAlignment.dll,Identification.dll)進行呼叫。

4.2. 雲服務

4.2.1. 曠世科技

  曠世科技提供人臉識別的雲服務[9]介面,其API定義如圖 12所示:
圖12
  可以看到提供的服務介面能夠實現人臉檢測、人臉比對、識別功能,也提供雲端人臉庫的構建功能。

4.2.2. 騰訊雲

  騰訊雲提供人臉識別的雲服務[10]介面,其API定義如圖 13所示:
圖13
  可以看到提供的服務介面能夠實現人臉檢測、人臉對比、驗證功能,也提供雲端個體資訊管理(底庫管理)功能。

4.2.3. 阿里雲

  阿里雲提供人臉識別的雲服務[11]介面,其API定義如圖 13所示:
圖13
  可以看到阿里雲提供的服務介面能夠實現人臉檢測、人臉比對功能。

4.2.4. 百度雲

  百度雲提供豐富的人臉識別服務介面[12],如圖 15所示。
圖15

5. 參考文獻

  1. https://cloud.baidu.com/product/face
  2. Joint Face Detection and Alignment using Multi-task Cascaded Convolutional Networks,https://kpzhang93.github.io/MTCNN_face_detection_alignment/index.html
  3. Machine Learning is Fun! Part 4: Modern Face Recognition with Deep Learning, https://www.colabug.com/3548846.html
  4. Sun Y, Wang X, Tang X. Deep learning face representation from predicting 10,000 classes[C]//Computer Vision and Pattern Recognition (CVPR), 2014 IEEE Conference on. IEEE, 2014: 1891-1898.
  5. DeepID人臉識別演算法之三代,https://www.cnblogs.com/mfrbuaa/p/5394742.html
  6. https://docs.opencv.org/4.0.0/d5/d10/tutorial_js_root.html
  7. http://dlib.net/dnn_face_recognition_ex.cpp.html
  8. FaceNet: A Unified Embedding for Face Recognition and Clustering ,http://www.cv-foundation.org/openaccess/content_cvpr_2015/app/1A_089.pdf
  9. https://console.faceplusplus.com.cn/documents/4888373
  10. https://cloud.tencent.com/document/product/867
  11. https://help.aliyun.com/product/53257.html
  12. http://ai.baidu.com/docs#/Face-Detect-V3/top