天天看點

離線識别率高達99%的Python人臉識别系統,開源~

大家好,我是J哥。

以往的人臉識别主要是包括人臉圖像采集、人臉識别預處理、身份确認、身份查找等技術和系統。現在人臉識别已經慢慢延伸到了ADAS中的駕駛員檢測、行人跟蹤、甚至到了動态物體的跟蹤。

由此可以看出,人臉識别系統已經由簡單的圖像處理發展到了視訊實時處理。而且算法已經由以前的Adaboots、PCA等傳統的統計學方法轉變為CNN、RCNN等深度學習及其變形的方法。現在也有相當一部分人開始研究3維人臉識别識别,這種項目目前也受到了學術界、工業界和國家的支援。

首先看看現在的研究現狀。如上的發展趨勢可以知道,現在的主要研究方向是利用深度學習的方法解決視訊人臉識别。

主要的研究人員:

如下:中科院計算所的山世光教授、中科院生物識别研究所的李子青教授、清華大學的蘇光大教授、香港中文大學的湯曉鷗教授、Ross B. Girshick等等。

主要開源項目:

SeetaFace人臉識别引擎。該引擎由中科院計算所山世光研究員帶領的人臉識别研究組研發。代碼基于C++實作,且不依賴于任何第三方的庫函數,開源協定為BSD-2,可供學術界和工業界免費使用。

主要軟體API/SDK:

  • face++。Face++.com 是一個提供免費人臉檢測、人臉識别、人臉屬性分析等服務的雲端服務平台。Face++是北京曠視科技有限公司旗下的全新人臉技術雲平台,在黑馬大賽中,Face++獲得年度總冠軍,已獲得聯想之星投資。
  • skybiometry.。主要包含了face detection、face recognition、face grouping。

主要的人臉識别圖像庫:

目前公開的比較好的人臉圖像庫有LFW(Labelled Faces in the Wild)和YFW(Youtube Faces in the Wild)。現在的實驗資料集基本上是來源于LFW,而且目前的圖像人臉識别的精度已經達到99%,基本上現有的圖像資料庫已經被刷爆。下面是現有人臉圖像資料庫的總結:

離線識别率高達99%的Python人臉識别系統,開源~

現在在中國做人臉識别的公司已經越來越多,應用也非常的廣泛。其中市場占有率最高的是漢王科技。主要公司的研究方向和現狀如下:

  • 漢王科技:漢王科技主要是做人臉識别的身份驗證,主要用在門禁系統、考勤系統等等。
  • 科大訊飛:科大訊飛在香港中文大學湯曉鷗教授團隊支援下,開發出了一個基于高斯過程的人臉識别技術–Gussian face, 該技術在LFW上的識别率為98.52%,目前該公司的DEEPID2在LFW上的識别率已經達到了99.4%。
  • 川大智勝:目前該公司的研究亮點是三維人臉識别,并拓展到3維全臉照相機産業化等等。
  • 商湯科技:主要是一家緻力于引領人工智能核心“深度學習”技術突破,建構人工智能、大資料分析行業解決方案的公司,目前在人臉識别、文字識别、人體識别、車輛識别、物體識别、圖像處理等方向有很強的競争力。在人臉識别中有106個人臉關鍵點的識别。

人臉識别的過程

人臉識别主要分為四大塊:人臉定位(face detection)、 人臉校準(face alignment)、 人臉确認(face verification)、人臉鑒别(face identification)。

人臉定位(face detection):

對圖像中的人臉進行檢測,并将結果用矩形框框出來。在openCV中有直接能拿出來用的Harr分類器。

人臉校準(face alignment):

對檢測到的人臉進行姿态的校正,使其人臉盡可能的”正”,通過校正可以提高人臉識别的精度。校正的方法有2D校正、3D校正的方法,3D校正的方法可以使側臉得到較好的識别。在進行人臉校正的時候,會有檢測特征點的位置這一步,這些特征點位置主要是諸如鼻子左側,鼻孔下側,瞳孔位置,上嘴唇下側等等位置,知道了這些特征點的位置後,做一下位置驅動的變形,臉即可被校”正”了。如下圖所示:

離線識别率高達99%的Python人臉識别系統,開源~

這裡介紹一種MSRA在14年的技術:Joint Cascade Face Detection and Alignment(ECCV14)。這篇文章直接在30ms的時間裡把detection和alignment都給做了。

人臉确認(face verification):

Face verification,人臉校驗是基于pair matching的方式,是以它得到的答案是“是”或者“不是”。在具體操作的時候,給定一張測試圖檔,然後挨個進行pair matching,matching上了則說明測試圖像與該張比對上的人臉為同一個人的人臉。

一般在小型辦公室人臉刷臉打卡系統中采用的(應該)是這種方法,具體操作方法大緻是這樣一個流程:離線逐個錄入員工的人臉照片(一個員工錄入的人臉一般不止一張),員工在刷臉打卡的時候相機捕獲到圖像後,通過前面所講的先進行人臉檢測,然後進行人臉校正,再進行人臉校驗,一旦match結果為“是”,說明該名刷臉的人員是屬于本辦公室的,人臉校驗到這一步就完成了。

在離線錄入員勞工臉的時候,我們可以将人臉與人名對應,這樣一旦在人臉校驗成功後,就可以知道這個人是誰了。上面所說的這樣一種系統優點是開發費用低廉,适合小型辦公場所,缺點是在捕獲時不能有遮擋,而且還要求人臉姿态比較正(這種系統我們所有,不過沒體驗過)。下圖給出了示意說明:

離線識别率高達99%的Python人臉識别系統,開源~

人臉識别(face identification/recognition):

Face identification或Face recognition,人臉識别正如下圖所示的,它要回答的是“我是誰?”,相比于人臉校驗采用的pair matching,它在識别階段更多的是采用分類的手段。它實際上是對進行了前面兩步即人臉檢測、人臉校正後做的圖像(人臉)分類。

離線識别率高達99%的Python人臉識别系統,開源~

根據上面四個概念的介紹,我們可以了解到人臉識别主要包括三個大的、獨立性強的子產品:

離線識别率高達99%的Python人臉識别系統,開源~

我們将上面的步驟進行詳細的拆分,得到下面的過程圖:

離線識别率高達99%的Python人臉識别系統,開源~

人臉識别分類

現在随着人臉識别技術的發展,人臉識别技術主要分為了三類:一是基于圖像的識别方法、二是基于視訊的識别方法、三是三維人臉識别方法。

基于圖像的識别方法:

這個過程是一個靜态的圖像識别過程,主要利用圖像處理。主要的算法有PCA、EP、kernel method、 Bayesian Framwork、SVM 、HMM、Adaboot等等算法。但在2014年,人臉識别利用Deep learning 技術取得了重大突破,為代表的有deepface的97.25%、face++的97.27%,但是deep face的訓練集是400w集的,而同時香港中文大學湯曉鷗的Gussian face的訓練集為2w。

基于視訊的實時識别方法:

這個過程可以看出人臉識别的追蹤過程,不僅僅要求在視訊中找到人臉的位置和大小,還需要确定幀間不同人臉的對應關系。

DeepFace

參考論文(資料):

1. DeepFace論文。DeepFace:Closing the Gap to Human-level Performance in Face Verificaion

4. Note on convolution Neural Network. 

5. Neural Network for Recognition of Handwritten Digits 

DeepFace是FaceBook提出來的,後續有DeepID和FaceNet出現。而且在DeepID和FaceNet中都能展現DeepFace的身影,是以DeepFace可以謂之CNN在人臉識别的奠基之作,目前深度學習在人臉識别中也取得了非常好的效果。是以這裡我們先從DeepFace開始學習。

在DeepFace的學習過程中,不僅将DeepFace所用的方法進行介紹,也會介紹目前該步驟的其它主要算法,對現有的圖像人臉識别技術做一個簡單、全面的叙述。

DeepFace的基本架構

1. 人臉識别的基本流程

face detection -> face alignment -> face verification -> face identification

2.人臉檢測(face detection)

2.1 現有技術:

haar分類器:

人臉檢測(detection)在opencv中早就有直接能拿來用的haar分類器,基于Viola-Jones算法。

Adaboost算法(級聯分類器):

1.參考論文:Robust Real-Time face detection 。 

3. 部落格:http://blog.sina.com.cn/s/blog_7769660f01019ep0.html

2.2 文章中所用方法

本文中采用了基于檢測點的人臉檢測方法(fiducial Point Detector)。

  • 先選擇6個基準點,2隻眼睛中心、 1個鼻子點、3個嘴上的點。
  • 通過LBP特征用SVR來學習得到基準點。

效果如下:

離線識别率高達99%的Python人臉識别系統,開源~

3. 人臉校準(face alignment)

2D alignment:

  • 對Detection後的圖檔進行二維裁剪, scale, rotate and translate the image into six anchor locations。将人臉部分裁剪出來。

3D alignment:

  • 找到一個3D 模型,用這個3D模型把二維人臉crop成3D人臉。67個基點,然後Delaunay三角化,在輪廓處添加三角形來避免不連續。
  • 将三角化後的人臉轉換成3D形狀
  • 三角化後的人臉變為有深度的3D三角網
  • 将三角網做偏轉,使人臉的正面朝前
  • 最後放正的人臉

效果如下:

離線識别率高達99%的Python人臉識别系統,開源~

上面的2D alignment對應(b)圖,3D alignment依次對應(c) ~ (h)。

4 人臉表示(face verification)

4.1 現有技術

LBP && joint Beyesian:

通過高維LBP跟Joint Bayesian這兩個方法結合。

  • 論文:Bayesian Face Revisited: A Joint Formulation

DeepID系列:

将七個聯合貝葉斯模型使用SVM進行融合,精度達到99.15%

  • 論文:Deep Learning Face Representation by Joint Identification-Verification

4.2 文章中的方法

離線識别率高達99%的Python人臉識别系統,開源~

論文中通過一個多類人臉識别任務來訓練深度神經網絡(DNN)。網絡結構如上圖所示。

結構參數:

經過3D對齊以後,形成的圖像都是152×152的圖像,輸入到上述網絡結構中,該結構的參數如下:

  • Conv:32個11×11×3的卷積核
  • max-pooling: 3×3, stride=2
  • Conv: 16個9×9的卷積核
  • Local-Conv: 16個9×9的卷積核,Local的意思是卷積核的參數不共享
  • Local-Conv: 16個7×7的卷積核,參數不共享
  • Local-Conv: 16個5×5的卷積核,參數不共享
  • Fully-connected: 4096維
  • Softmax: 4030維

提取低水準特征:

過程如下所示:

  • 預處理階段:輸入3通道的人臉,并進行3D校正,再歸一化到152*152像素大小——152*152*3.
  • 通過卷積層C1:C1包含32個11*11*3的濾波器(即卷積核),得到32張特征圖——32*142*142*3。
  • 通過max-polling層M2:M2的滑窗大小為3*3,滑動步長為2,3個通道上分别獨立polling。
  • 通過另一個卷積層C3:C3包含16個9*9*16的3維卷積核。

上述3層網絡是為了提取到低水準的特征,如簡單的邊緣特征和紋理特征。Max-polling層使得卷積網絡對局部的變換更加魯棒。如果輸入是校正後的人臉,就能使網絡對小的标記誤差更加魯棒。

然而這樣的polling層會使網絡在面部的細節結構和微小紋理的精準位置上丢失一些資訊。是以,文中隻在第一個卷積層後面接了Max-polling層。這些前面的層稱之為前端自适應的預處理層級。然而對于許多計算來講,這是很必要的,這些層的參數其實很少。它們僅僅是把輸入圖像擴充成一個簡單的局部特征集。

後續層:

L4,L5,L6都是局部連接配接層,就像卷積層使用濾波器一樣,在特征圖像的每一個位置都訓練學習一組不同的濾波器。由于校正後不同區域的有不同的統計特性,卷積網絡在空間上的穩定性的假設不能成立。比如說,相比于鼻子和嘴巴之間的區域,眼睛和眉毛之間的區域展現出非常不同的表觀并且有很高的區分度。換句話說,通過利用輸入的校正後的圖像,定制了DNN的結構。

使用局部連接配接層并沒有影響特征提取時的運算負擔,但是影響了訓練的參數數量。僅僅是由于有如此大的标記人臉庫,我們可以承受三個大型的局部連接配接層。局部連接配接層的輸出單元受到一個大型的輸入圖塊的影響,可以據此調整局部連接配接層的使用(參數)(不共享權重)

比如說,L6層的輸出受到一個74*74*3的輸入圖塊的影響,在校正後的人臉中,這種大的圖塊之間很難有任何統計上的參數共享。

頂層:

最後,網絡頂端的兩層(F7,F8)是全連接配接的:每一個輸出單元都連接配接到所有的輸入。這兩層可以捕捉到人臉圖像中距離較遠的區域的特征之間的關聯性。比如,眼睛的位置和形狀,與嘴巴的位置和形狀之間的關聯性(這部分也含有資訊)可以由這兩層得到。第一個全連接配接層F7的輸出就是我們原始的人臉特征表達向量。

在特征表達方面,這個特征向量與傳統的基于LBP的特征描述有很大差別。傳統方法通常使用局部的特征描述(計算直方圖)并用作分類器的輸入。

最後一個全連接配接層F8的輸出進入了一個K-way的softmax(K是類别個數),即可産生類别标号的機率分布。用Ok表示一個輸入圖像經過網絡後的第k個輸出,即可用下式表達輸出類标号k的機率:

離線識别率高達99%的Python人臉識别系統,開源~

訓練的目标是最大化正确輸出類别(face 的id)的機率。通過最小化每個訓練樣本的叉熵損失實作這一點。用k表示給定輸入的正确類别的标号,則叉熵損失是:

離線識别率高達99%的Python人臉識别系統,開源~

通過計算叉熵損失L對參數的梯度以及使用随機梯度遞減的方法來最小化叉熵損失。

梯度是通過誤差的标準反向傳播來計算的。非常有趣的是,本網絡産生的特征非常稀疏。超過75%的頂層特征元素是0。這主要是由于使用了ReLU激活函數導緻的。這種軟門檻值非線性函數在所有的卷積層,局部連接配接層和全連接配接層(除了最後一層F8)都使用了,進而導緻整體級聯之後産生高度非線性和稀疏的特征。稀疏性也與使用使用dropout正則化有關,即在訓練中将随機的特征元素設定為0。我們隻在F7全連接配接層使用了dropout.由于訓練集合很大,在訓練過程中我們沒有發現重大的過拟合。

給出圖像I,則其特征表達G(I)通過前饋網絡計算出來,每一個L層的前饋網絡,可以看作是一系列函數:

離線識别率高達99%的Python人臉識别系統,開源~

歸一化:

在最後一級,我們把特征的元素歸一化成0到1,以此降低特征對光照變化的敏感度。特征向量中的每一個元素都被訓練集中對應的最大值除。然後進行L2歸一化。由于我們采用了ReLU激活函數,我們的系統對圖像的尺度不變性減弱。

對于輸出的4096-d向量:

  • 先每一維進行歸一化,即對于結果向量中的每一維,都要除以該次元在整個訓練集上的最大值。
  • 每個向量進行L2歸一化。

2. 驗證

2.1 卡方距離

該系統中,歸一化後的DeepFace特征向量與傳統的基于直方圖的特征(如LBP)有一下相同之處:

  • 所有值均為負
  • 非常稀疏
  • 特征元素的值都在區間 [0, 1]之間

卡方距離計算公式如下:

離線識别率高達99%的Python人臉識别系統,開源~

2.2 Siamese network

文章中也提到了端到端的度量學習方法,一旦學習(訓練)完成,人臉識别網絡(截止到F7)在輸入的兩張圖檔上重複使用,将得到的2個特征向量直接用來預測判斷這兩個輸入圖檔是否屬于同一個人。這分為以下步驟:

a. 計算兩個特征之間的絕對差别;

b,一個全連接配接層,映射到一個單個的邏輯單元(輸出相同/不同)。

3. 實驗評估

3.1 資料集

  • Social Face Classification Dataset(SFC): 4.4M張人臉/4030人
  • LFW: 13323張人臉/5749人
  • restricted: 隻有是/不是的标記
  • unrestricted:其他的訓練對也可以拿到
  • unsupervised:不在LFW上訓練
  • Youtube Face(YTF): 3425videos/1595人

result on LFW:

離線識别率高達99%的Python人臉識别系統,開源~

result on YTF:

離線識别率高達99%的Python人臉識别系統,開源~

DeepFace與之後的方法的最大的不同點在于,DeepFace在訓練神經網絡前,使用了對齊方法。論文認為神經網絡能夠work的原因在于一旦人臉經過對齊後,人臉區域的特征就固定在某些像素上了,此時,可以用卷積神經網絡來學習特征。

本文的模型使用了C++工具箱dlib基于深度學習的最新人臉識别方法,基于戶外臉部資料測試庫Labeled Faces in the Wild 的基準水準來說,達到了99.38%的準确率。

更多算法

​​http://www.gycc.com/trends/face%20recognition/overview/​​

dlib:http://dlib.net/資料測試庫Labeled Faces in the Wild:http://vis-www.cs.umass.edu/lfw/

模型提供了一個簡單的 face_recognition 指令行工具讓使用者通過指令就能直接使用圖檔檔案夾進行人臉識别操作。

在圖檔中捕捉人臉特征

在一張圖檔中捕捉到所有的人臉

找到并處理圖檔中人臉的特征

找到每個人眼睛、鼻子、嘴巴和下巴的位置和輪廓。

import face_recognition

image = face_recognition.load_image_file("your_file.jpg")

face_locations = face_recognition.face_locations(image)

捕捉臉部特征有很重要的用途,當然也可以用來進行圖檔的數字美顔digital make-up(例如美圖秀秀)

digital make-up:https://github.com/ageitgey/face_recognition/blob/master/examples/digital_makeup.py

識别圖檔中的人臉

識别誰出現在照片裡

離線識别率高達99%的Python人臉識别系統,開源~

安裝步驟

本方法支援Python3/python2,我們隻在macOS和Linux中測試過,還不知是否适用于Windows。

使用pypi的pip3 安裝此子產品(或是Python 2的pip2)

重要提示:在編譯dlib時可能會出問題,你可以通過安裝來自源(而不是pip)的dlib來修複錯誤,請見安裝手冊How to install dlib from source

​​https://gist.github.com/ageitgey/629d75c1baac34dfa5ca2a1928a7aeaf​​

通過手動安裝dlib,運作pip3 install face_recognition來完成安裝。

使用方法指令行界面

當你安裝face_recognition,你能得到一個簡潔的叫做face_recognition的指令行程式,它能幫你識别一張照片或是一個照片檔案夾中的所有人臉。

首先,你需要提供一個包含一張照片的檔案夾,并且你已經知道照片中的人是誰,每個人都要有一張照片檔案,且檔案名需要以該人的姓名命名;

然後你需要準備另外一個檔案夾,裡面裝有你想要識别人臉照片;

接下來你隻用運作face_recognition指令,程式能夠通過已知人臉的檔案夾識别出未知人臉照片中的人是誰;

離線識别率高達99%的Python人臉識别系統,開源~

針對每個人臉都要一行輸出,資料是檔案名加上識别到的人名,以逗号分隔。

如果你隻是想要知道每個照片中的人名而不要檔案名,可以進行如下操作:

離線識别率高達99%的Python人臉識别系統,開源~

Python子產品

你可以通過引入face_recognition就能完成人臉識别操作:

API 文檔: https://face-recognition.readthedocs.io.

在圖檔中自動識别所有人臉

請參照此案例this example: https://github.com/ageitgey/face_recognition/blob/master/examples/find_faces_in_picture.py

識别圖檔中的人臉并告知姓名

請參照此案例this example: https://github.com/ageitgey/face_recognition/blob/master/examples/recognize_faces_in_pictures.py

Python代碼案例

所有例子在此 here.

​​https://github.com/ageitgey/face_recognition/tree/master/examples​​

·找到照片中的人臉Find faces in a photograph

https://github.com/ageitgey/face_recognition/blob/master/examples/find_faces_in_picture.py
· 識别照片中的面部特征Identify specific facial features in a photograph
https://github.com/ageitgey/face_recognition/blob/master/examples/find_facial_features_in_picture.py
· 使用數字美顔Apply (horribly ugly) digital make-up
https://github.com/ageitgey/face_recognition/blob/master/examples/digital_makeup.py
·基于已知人名找到并識别出照片中的未知人臉Find and recognize unknown faces in a photograph based on photographs of known people
https://github.com/ageitgey/face_recognition/blob/master/examples/recognize_faces_in_pictures.pypython人臉      

好了,今天的分享就到這裡~

本文僅做學術分享,如有侵權,請聯系删文。

—THE END—