1. 程式人生 > >基於人臉識別的登陸認證方案及思路

基於人臉識別的登陸認證方案及思路

數據集 0ms 產品設計 登陸認證 || 怎麽 解決 align 三元組

本文主要討論基於人臉識別的登陸認證過程中的關鍵技術點,討論如何實現這些關鍵技術點並解決困難問題。

1.關鍵技術點及思路

(1)登陸認證在服務器端實現還是在客戶端實現?

換句話說,人臉識別的模型應該運行在服務器端還是客戶端。如果人臉識別模型運行在服務器端,那麽客戶端必須在聯網環境下才能通過服務端的認證並使用。某些場景下,例如音樂客戶端場景(用戶在無需聯網的情況下也需要進入APP聽音樂),人臉識別模型運行在服務器就無法滿足需求。如果人臉識別模型運行在客戶端,那麽需要模型足夠簡單,客戶端能夠提供運行模型所需要的計算資源,例如,將能夠運行在服務器的VGG16模型搬到客戶端,大多數手機客戶端的計算資源都無法滿足需求,為了獲得能在手機客戶端運行的模型,需要投入人力做技術預研。

登陸認證在服務器端還是在客戶端這個問題的整體思路:初期登錄認證在服務器端運行,在必須聯網才能使用客戶端的場景使用,同時進行手機客戶端做人臉識別的預研工作。手機客戶端的人臉識別技術成熟後,再將登陸認證能力以SDK方式封裝到客戶端先以”咪咕考勤”作為人臉登錄認證功能的試驗田,最終為” 咪咕考勤”、“咪咕家“、“咪咕咖啡”及”九大客戶端“以SDK方式提供人臉登陸認證能力。

(2)人臉檢測是服務器端還是在客戶端做?

在進行人臉識別的過程中,我們使用采集到圖片中的人臉區域,需要先檢測圖片中的人臉位置,然後將該位置的人臉裁剪為只包含人臉區域的小圖片。原始人臉圖片是在客戶端通過攝像頭采集的,那麽人臉檢測應該在服務器端做還是在客戶端做呢?

為了讓人臉識別模型獲取更大的人臉區域,從而使模型提取到更全面的人臉體征,使人臉識別更準確,需要在人臉檢測步驟獲得的人臉bounding box基礎擴大人臉圖片區域,因此,人臉識別模型在哪裏運行,人臉檢測就在哪裏做。

(3)為什麽VGG、RESNET等網絡模型不能直接用於人臉識別?

VGG、RESNET等網絡模型因資源消耗多不適合運行在手機客戶端,即便是可以在手機客戶端運行的MobileNET,也無法直接應用到我們的人臉識別場景,原因是:這些典型的網絡無法對陌生人臉進行劃分,例如,分類器可以識別3個人的人臉,當第4個人要識別時,他就會被誤識別為這3個人中的其中一個。

(4)MobileNet模型不能直接用於手機端人臉識別,那該怎麽辦?

解決對陌生類別劃分的問題,目前主要是通過Siamese網絡和Triplet網絡思路來解決,例如,DLIB中的人臉識別就是通過訓練基於RESNET的Triplet網絡實現。下面簡單介紹Siamese網絡和Triplet網絡的原理。

Siamese 網絡的主要思想是通過一個函數將輸入映射到目標空間,在目標空間使用簡單的距離(歐式距離等)進行對比相似度。在訓練階段去最小化來自相同類別的一對樣本的損失函數值,最大化來自不同類別的一堆樣本的損失函數值。

根據Siamese網絡的主要思想,有人發明了Triplet 網絡。triplet是一個三元組,這個三元組是這樣構成的:從訓練數據集中隨機選一個樣本,該樣本稱為Anchor,然後再隨機選取一個和Anchor (記為x_a)屬於同一類的樣本和不同類的樣本,這兩個樣本對應的稱為Positive(記為x_p)和Negative (記為x_n),由此構成一個(Anchor,Positive,Negative)三元組。針對三元組中的每個元素(樣本),訓練一個參數共享或者不共享的網絡,得到三個元素的特征表達,分別記為:f(xia),f (xip),f (xin)。triplet loss的目的就是通過學習,讓x_a和x_p特征表達之間的距離盡可能小,而x_a和x_n的特征表達之間的距離盡可能大,並且要讓x_a與x_n之間的距離和x_a與x_p之間的距離之間有一個最小的間隔t。公式化表示就是:||f (xia)-f (xip)||+t<||f(xia)-f (xin)||,損失函數就是L={ ||f (xia)-f (xip)||-||f (xia)-f (xin)||+t }+。這裏距離用歐式距離度量,+表示{ }內的值大於零的時候,取該值為損失,小於零的時候,損失為零。

(5)DLIB提供的人臉識別滿足我們的需要嗎?

前面提到過DLIB人臉識別是基於RESNET的Triplet網絡,限制了它在手機端的應用,但是當人臉識別模型運行在服務器端時,可以方便地利用DLIB提供的人臉識別功能

除了人臉識別外,人臉登錄認證過程中需要對人臉的真實性做判斷(例如進行活體檢測),DLIB不能滿足這些需要,需要投入人力預研。由於我們目前的場景並不涉及類似支付的高度敏感場景的認證,所以可以將活體檢測預研的優先級排低一些。

(6)人臉識別模型在客戶端運行有哪些難點需要解決?

如何選擇能在手機端運行的深度學習框架。用什麽框架(tensorflow、pytorch、caffe)訓練的模型,能同時在IOS、Android是上運行?工程上如何實現對這些模型的調用?

手機端如何實現人臉識別。怎樣對現有模型(如MobileNET)進行改造,才能達到既滿足運行效率(例如<100ms)的要求,又有足夠的識別準確度 (如99%)的要求。

手機端如何實現人臉檢測。OpenCV DNN人臉檢測性能和效果都比較好,但是集成OpenCV會導致安裝包過大,裁剪OpenCV代價會比較大。

2.核心業務流程(不含產品設計)

(1)人臉識別在服務器端

人臉註冊階段,客戶端負責采集各個角度(中、左、右、上、下)的人臉照片,上傳服務端請求註冊,服務端接收到註冊請求後,從人臉照片中識別人臉,並提取人臉特征並保存在數據庫中,待人臉識別階段與新上傳照片的特征進行比較。

技術分享圖片

認證階段,客戶端負責采集人臉圖片,並上傳服務器端請求認證,服務器端收到請求後進行人臉檢測、人臉特征提取,並與註冊階段生成的人臉特征比較,如果特征距離低於某閥值(如DLIB設置為0.6)則認證通過。另外,服務器端可以采集認證的效果數據,用戶模型的調優和評估。

技術分享圖片

(2)人臉識別在客戶端

當人臉識別在客戶端進行時,所有服務端的工作都將按順序發生在客戶端。人臉註冊過程中,客戶端可以將註冊人臉過程中產生的特征值在聯網狀態下發送給服務器端做保存備份。

3.參考文獻

https://github.com/opencv/opencv/blob/master/samples/dnn/js_face_recognition.html

https://github.com/yeziyang1992/Python-Tensorflow-Face-v2.0

https://blog.keras.io/building-powerful-image-classification-models-using-very-little-data.html

https://towardsdatascience.com/one-shot-learning-face-recognition-using-siamese-neural-network-a13dcf739e

https://www.pytorchtutorial.com/pytorch-one-shot-learning/

https://hackernoon.com/facial-similarity-with-siamese-networks-in-pytorch-9642aa9db2f7

https://github.com/zdavidli/siamese-facial-recognition

https://github.com/harveyslash/Facial-Similarity-with-Siamese-Networks-in-Pytorch

http://blog.dlib.net/2017/02/high-quality-face-recognition-with-deep.html

https://github.com/davisking/dlib/blob/master/python_examples/face_recognition.py

http://krasserm.github.io/2018/02/07/deep-face-recognition/

https://www.pyimagesearch.com/2018/06/18/face-recognition-with-opencv-python-and-deep-learning/

https://www.cnblogs.com/punkcure/p/9082626.html

https://zhuanlan.zhihu.com/p/44904820

基於人臉識別的登陸認證方案及思路