以往的人臉識別主要是包括人臉圖像采集、人臉識別預(yù)處理、身份確認、身份查找等技術(shù)和系統(tǒng)。現(xiàn)在人臉識別已經(jīng)慢慢延伸到了ADAS中的駕駛員檢測、行人跟蹤、甚至到了動態(tài)物體的跟蹤。由此可以看出,人臉識別系統(tǒng)已經(jīng)由簡單的圖像處理發(fā)展到了視頻實時處理。而且算法已經(jīng)由以前的Adaboots、PCA等傳統(tǒng)的統(tǒng)計學(xué)方法轉(zhuǎn)變?yōu)镃NN、RCNN等深度學(xué)習(xí)及其變形的方法。現(xiàn)在也有相當一部分人開始研究3維人臉識別識別,這種項目目前也受到了學(xué)術(shù)界、工業(yè)界和國家的支持。
首先看看現(xiàn)在的研究現(xiàn)狀。如上的發(fā)展趨勢可以知道,現(xiàn)在的主要研究方向是利用深度學(xué)習(xí)的方法解決視頻人臉識別。
主要的研究人員:
如下:中科院計算所的山世光教授、中科院生物識別研究所的李子青教授、清華大學(xué)的蘇光大教授、香港中文大學(xué)的湯曉鷗教授、Ross B. Girshick等等。
主要開源項目:
SeetaFace人臉識別引擎。該引擎由中科院計算所山世光研究員帶領(lǐng)的人臉識別研究組研發(fā)。代碼基于C++實現(xiàn),且不依賴于任何第三方的庫函數(shù),開源協(xié)議為BSD-2,可供學(xué)術(shù)界和工業(yè)界免費使用。github鏈接:
https://github.com/seetaface/SeetaFaceEngine
主要軟件API/SDK:
face++。Face++.com 是一個提供免費人臉檢測、人臉識別、人臉屬性分析等服務(wù)的云端服務(wù)平臺。Face++是北京曠視科技有限公司旗下的全新人臉技術(shù)云平臺,在黑馬大賽中,F(xiàn)ace++獲得年度總冠軍,已獲得聯(lián)想之星投資。
skybiometry.。主要包含了face detection、face recognition、face grouping。
主要的人臉識別圖像庫:
目前公開的比較好的人臉圖像庫有LFW(Labelled Faces in the Wild)和YFW(Youtube Faces in the Wild)。現(xiàn)在的實驗數(shù)據(jù)集基本上是來源于LFW,而且目前的圖像人臉識別的精度已經(jīng)達到99%,基本上現(xiàn)有的圖像數(shù)據(jù)庫已經(jīng)被刷爆。下面是現(xiàn)有人臉圖像數(shù)據(jù)庫的總結(jié):
現(xiàn)在在中國做人臉識別的公司已經(jīng)越來越多,應(yīng)用也非常的廣泛。其中市場占有率最高的是漢王科技。主要公司的研究方向和現(xiàn)狀如下:
漢王科技:漢王科技主要是做人臉識別的身份驗證,主要用在門禁系統(tǒng)、考勤系統(tǒng)等等。
科大訊飛:科大訊飛在香港中文大學(xué)湯曉鷗教授團隊支持下,開發(fā)出了一個基于高斯過程的人臉識別技術(shù)–Gussian face, 該技術(shù)在LFW上的識別率為98.52%,目前該公司的DEEPID2在LFW上的識別率已經(jīng)達到了99.4%。
川大智勝:目前該公司的研究亮點是三維人臉識別,并拓展到3維全臉照相機產(chǎn)業(yè)化等等。
商湯科技:主要是一家致力于引領(lǐng)人工智能核心“深度學(xué)習(xí)”技術(shù)突破,構(gòu)建人工智能、大數(shù)據(jù)分析行業(yè)解決方案的公司,目前在人臉識別、文字識別、人體識別、車輛識別、物體識別、圖像處理等方向有很強的競爭力。在人臉識別中有106個人臉關(guān)鍵點的識別。
人臉識別的過程
人臉識別主要分為四大塊:人臉定位(face detection)、 人臉校準(face alignment)、 人臉確認(face verification)、人臉鑒別(face identification)。
人臉定位(face detection):
對圖像中的人臉進行檢測,并將結(jié)果用矩形框框出來。在openCV中有直接能拿出來用的Harr分類器。
人臉校準(face alignment):
對檢測到的人臉進行姿態(tài)的校正,使其人臉盡可能的”正”,通過校正可以提高人臉識別的精度。校正的方法有2D校正、3D校正的方法,3D校正的方法可以使側(cè)臉得到較好的識別。 在進行人臉校正的時候,會有檢測特征點的位置這一步,這些特征點位置主要是諸如鼻子左側(cè),鼻孔下側(cè),瞳孔位置,上嘴唇下側(cè)等等位置,知道了這些特征點的位置后,做一下位置驅(qū)動的變形,臉即可被校”正”了。如下圖所示:
這里介紹一種MSRA在14年的技術(shù):Joint Cascade Face Detection and Alignment(ECCV14)。這篇文章直接在30ms的時間里把detection和alignment都給做了。
人臉確認(face verification):
Face verification,人臉校驗是基于pair matching的方式,所以它得到的答案是“是”或者“不是”。在具體操作的時候,給定一張測試圖片,然后挨個進行pair matching,matching上了則說明測試圖像與該張匹配上的人臉為同一個人的人臉。一般在小型辦公室人臉刷臉打卡系統(tǒng)中采用的(應(yīng)該)是這種方法,具體操作方法大致是這樣一個流程:離線逐個錄入員工的人臉照片(一個員工錄入的人臉一般不止一張),員工在刷臉打卡的時候相機捕獲到圖像后,通過前面所講的先進行人臉檢測,然后進行人臉校正,再進行人臉校驗,一旦match結(jié)果為“是”,說明該名刷臉的人員是屬于本辦公室的,人臉校驗到這一步就完成了。在離線錄入員工人臉的時候,我們可以將人臉與人名對應(yīng),這樣一旦在人臉校驗成功后,就可以知道這個人是誰了。上面所說的這樣一種系統(tǒng)優(yōu)點是開發(fā)費用低廉,適合小型辦公場所,缺點是在捕獲時不能有遮擋,而且還要求人臉姿態(tài)比較正(這種系統(tǒng)我們所有,不過沒體驗過)。下圖給出了示意說明:
人臉識別(face identification/recognition):
Face identification或Face recognition,人臉識別正如下圖所示的,它要回答的是“我是誰?”,相比于人臉校驗采用的pair matching,它在識別階段更多的是采用分類的手段。它實際上是對進行了前面兩步即人臉檢測、人臉校正后做的圖像(人臉)分類。
根據(jù)上面四個概念的介紹,我們可以了解到人臉識別主要包括三個大的、獨立性強的模塊:
我們將上面的步驟進行詳細的拆分,得到下面的過程圖:
人臉識別分類
現(xiàn)在隨著人臉識別技術(shù)的發(fā)展,人臉識別技術(shù)主要分為了三類:一是基于圖像的識別方法、二是基于視頻的識別方法、三是三維人臉識別方法。
基于圖像的識別方法:
這個過程是一個靜態(tài)的圖像識別過程,主要利用圖像處理。主要的算法有PCA、EP、kernel method、 Bayesian Framwork、SVM 、HMM、Adaboot等等算法。但在2014年,人臉識別利用Deep learning 技術(shù)取得了重大突破,為代表的有deepface的97.25%、face++的97.27%,但是deep face的訓(xùn)練集是400w集的,而同時香港中文大學(xué)湯曉鷗的Gussian face的訓(xùn)練集為2w。
基于視頻的實時識別方法:
這個過程可以看出人臉識別的追蹤過程,不僅僅要求在視頻中找到人臉的位置和大小,還需要確定幀間不同人臉的對應(yīng)關(guān)系。
DeepFace
參考論文(資料):
1. DeepFace論文。DeepFace:Closing the Gap to Human-level Performance in Face Verificaion
2. 卷積神經(jīng)網(wǎng)絡(luò)了解博客。http://blog.csdn.net/zouxy09/article/details/8781543
3. 卷積神經(jīng)網(wǎng)絡(luò)的推導(dǎo)博客。http://blog.csdn.net/zouxy09/article/details/9993371/
4.Note on convolution Neural Network.
5.Neural Network for Recognition of Handwritten Digits
6. DeepFace博文:http://blog.csdn.net/Hao_Zhang_Vision/article/details/52831399?locationNum=2&fps=1
DeepFace是FaceBook提出來的,后續(xù)有DeepID和FaceNet出現(xiàn)。而且在DeepID和FaceNet中都能體現(xiàn)DeepFace的身影,所以DeepFace可以謂之CNN在人臉識別的奠基之作,目前深度學(xué)習(xí)在人臉識別中也取得了非常好的效果。所以這里我們先從DeepFace開始學(xué)習(xí)。
在DeepFace的學(xué)習(xí)過程中,不僅將DeepFace所用的方法進行介紹,也會介紹當前該步驟的其它主要算法,對現(xiàn)有的圖像人臉識別技術(shù)做一個簡單、全面的敘述。
1.DeepFace的基本框架
1.1 人臉識別的基本流程
face detection -> face alignment -> face verification -> face identification
1.2 人臉檢測(face detection)
1.2.1 現(xiàn)有技術(shù):
haar分類器:
人臉檢測(detection)在opencv中早就有直接能拿來用的haar分類器,基于Viola-Jones算法。
Adaboost算法(級聯(lián)分類器):
1.參考論文:Robust Real-Time face detection。
2. 參考中文博客:http://blog.csdn.net/cyh_24/article/details/39755661
3. 博客:http://blog.sina.com.cn/s/blog_7769660f01019ep0.html
1.2.2 文章中所用方法
本文中采用了基于檢測點的人臉檢測方法(fiducial Point Detector)。
先選擇6個基準點,2只眼睛中心、 1個鼻子點、3個嘴上的點。
通過LBP特征用SVR來學(xué)習(xí)得到基準點。
效果如下:
1.3 人臉校準(face alignment)
2D alignment:
對Detection后的圖片進行二維裁剪, scale, rotate and translate the image into six anchor locations。 將人臉部分裁剪出來。
3D alignment:
找到一個3D 模型,用這個3D模型把二維人臉crop成3D人臉。67個基點,然后Delaunay三角化,在輪廓處添加三角形來避免不連續(xù)。
將三角化后的人臉轉(zhuǎn)換成3D形狀
三角化后的人臉變?yōu)橛猩疃鹊?D三角網(wǎng)
將三角網(wǎng)做偏轉(zhuǎn),使人臉的正面朝前
最后放正的人臉
效果如下:
上面的2D alignment對應(yīng)(b)圖,3D alignment依次對應(yīng)(c) ~ (h)。
1.4 人臉表示(face verification)
1.4.1 現(xiàn)有技術(shù)
LBP && joint Beyesian:
通過高維LBP跟Joint Bayesian這兩個方法結(jié)合。
論文:Bayesian Face Revisited: A Joint Formulation
DeepID系列:
將七個聯(lián)合貝葉斯模型使用SVM進行融合,精度達到99.15%
論文:Deep Learning Face Representation by Joint Identification-Verification
1.4.2 文章中的方法
論文中通過一個多類人臉識別任務(wù)來訓(xùn)練深度神經(jīng)網(wǎng)絡(luò)(DNN)。網(wǎng)絡(luò)結(jié)構(gòu)如上圖所示。
結(jié)構(gòu)參數(shù):
經(jīng)過3D對齊以后,形成的圖像都是152×152的圖像,輸入到上述網(wǎng)絡(luò)結(jié)構(gòu)中,該結(jié)構(gòu)的參數(shù)如下:
Conv:32個11×11×3的卷積核
max-pooling: 3×3, stride=2
Conv: 16個9×9的卷積核
Local-Conv: 16個9×9的卷積核,Local的意思是卷積核的參數(shù)不共享
Local-Conv: 16個7×7的卷積核,參數(shù)不共享
Local-Conv: 16個5×5的卷積核,參數(shù)不共享
Fully-connected: 4096維
Softmax: 4030維
提取低水平特征:
過程如下所示:
預(yù)處理階段:輸入3通道的人臉,并進行3D校正,再歸一化到152*152像素大小——152*152*3.
通過卷積層C1:C1包含32個11*11*3的濾波器(即卷積核),得到32張?zhí)卣鲌D——32*142*142*3。
通過max-polling層M2:M2的滑窗大小為3*3,滑動步長為2,3個通道上分別獨立polling。
通過另一個卷積層C3:C3包含16個9*9*16的3維卷積核。
上述3層網(wǎng)絡(luò)是為了提取到低水平的特征,如簡單的邊緣特征和紋理特征。Max-polling層使得卷積網(wǎng)絡(luò)對局部的變換更加魯棒。如果輸入是校正后的人臉,就能使網(wǎng)絡(luò)對小的標記誤差更加魯棒。然而這樣的polling層會使網(wǎng)絡(luò)在面部的細節(jié)結(jié)構(gòu)和微小紋理的精準位置上丟失一些信息。因此,文中只在第一個卷積層后面接了Max-polling層。這些前面的層稱之為前端自適應(yīng)的預(yù)處理層級。然而對于許多計算來講,這是很必要的,這些層的參數(shù)其實很少。它們僅僅是把輸入圖像擴充成一個簡單的局部特征集。
后續(xù)層:
L4,L5,L6都是局部連接層,就像卷積層使用濾波器一樣,在特征圖像的每一個位置都訓(xùn)練學(xué)習(xí)一組不同的濾波器。由于校正后不同區(qū)域的有不同的統(tǒng)計特性,卷積網(wǎng)絡(luò)在空間上的穩(wěn)定性的假設(shè)不能成立。比如說,相比于鼻子和嘴巴之間的區(qū)域,眼睛和眉毛之間的區(qū)域展現(xiàn)出非常不同的表觀并且有很高的區(qū)分度。換句話說,通過利用輸入的校正后的圖像,定制了DNN的結(jié)構(gòu)。
使用局部連接層并沒有影響特征提取時的運算負擔,但是影響了訓(xùn)練的參數(shù)數(shù)量。僅僅是由于有如此大的標記人臉庫,我們可以承受三個大型的局部連接層。局部連接層的輸出單元受到一個大型的輸入圖塊的影響,可以據(jù)此調(diào)整局部連接層的使用(參數(shù))(不共享權(quán)重)
比如說,L6層的輸出受到一個74*74*3的輸入圖塊的影響,在校正后的人臉中,這種大的圖塊之間很難有任何統(tǒng)計上的參數(shù)共享。
頂層:
最后,網(wǎng)絡(luò)頂端的兩層(F7,F(xiàn)8)是全連接的:每一個輸出單元都連接到所有的輸入。這兩層可以捕捉到人臉圖像中距離較遠的區(qū)域的特征之間的關(guān)聯(lián)性。比如,眼睛的位置和形狀,與嘴巴的位置和形狀之間的關(guān)聯(lián)性(這部分也含有信息)可以由這兩層得到。第一個全連接層F7的輸出就是我們原始的人臉特征表達向量。
在特征表達方面,這個特征向量與傳統(tǒng)的基于LBP的特征描述有很大區(qū)別。傳統(tǒng)方法通常使用局部的特征描述(計算直方圖)并用作分類器的輸入。
最后一個全連接層F8的輸出進入了一個K-way的softmax(K是類別個數(shù)),即可產(chǎn)生類別標號的概率分布。用Ok表示一個輸入圖像經(jīng)過網(wǎng)絡(luò)后的第k個輸出,即可用下式表達輸出類標號k的概率:
訓(xùn)練的目標是最大化正確輸出類別(face 的id)的概率。通過最小化每個訓(xùn)練樣本的叉熵損失實現(xiàn)這一點。用k表示給定輸入的正確類別的標號,則叉熵損失是:
通過計算叉熵損失L對參數(shù)的梯度以及使用隨機梯度遞減的方法來最小化叉熵損失。
梯度是通過誤差的標準反向傳播來計算的。非常有趣的是,本網(wǎng)絡(luò)產(chǎn)生的特征非常稀疏。超過75%的頂層特征元素是0。這主要是由于使用了ReLU激活函數(shù)導(dǎo)致的。這種軟閾值非線性函數(shù)在所有的卷積層,局部連接層和全連接層(除了最后一層F8)都使用了,從而導(dǎo)致整體級聯(lián)之后產(chǎn)生高度非線性和稀疏的特征。稀疏性也與使用使用dropout正則化有關(guān),即在訓(xùn)練中將隨機的特征元素設(shè)置為0。我們只在F7全連接層使用了dropout.由于訓(xùn)練集合很大,在訓(xùn)練過程中我們沒有發(fā)現(xiàn)重大的過擬合。
給出圖像I,則其特征表達G(I)通過前饋網(wǎng)絡(luò)計算出來,每一個L層的前饋網(wǎng)絡(luò),可以看作是一系列函數(shù):
歸一化:
在最后一級,我們把特征的元素歸一化成0到1,以此降低特征對光照變化的敏感度。特征向量中的每一個元素都被訓(xùn)練集中對應(yīng)的最大值除。然后進行L2歸一化。由于我們采用了ReLU激活函數(shù),我們的系統(tǒng)對圖像的尺度不變性減弱。
對于輸出的4096-d向量:
先每一維進行歸一化,即對于結(jié)果向量中的每一維,都要除以該維度在整個訓(xùn)練集上的最大值。
每個向量進行L2歸一化。
2. 驗證
2.1 卡方距離
該系統(tǒng)中,歸一化后的DeepFace特征向量與傳統(tǒng)的基于直方圖的特征(如LBP)有一下相同之處:
所有值均為負
非常稀疏
特征元素的值都在區(qū)間 [0, 1]之間
卡方距離計算公式如下:
2.2 Siamese network
文章中也提到了端到端的度量學(xué)習(xí)方法,一旦學(xué)習(xí)(訓(xùn)練)完成,人臉識別網(wǎng)絡(luò)(截止到F7)在輸入的兩張圖片上重復(fù)使用,將得到的2個特征向量直接用來預(yù)測判斷這兩個輸入圖片是否屬于同一個人。這分為以下步驟:
a. 計算兩個特征之間的絕對差別;
b,一個全連接層,映射到一個單個的邏輯單元(輸出相同/不同)。
3. 實驗評估
3.1 數(shù)據(jù)集
Social Face Classification Dataset(SFC): 4.4M張人臉/4030人
LFW: 13323張人臉/5749人
restricted: 只有是/不是的標記
unrestricted:其他的訓(xùn)練對也可以拿到
unsupervised:不在LFW上訓(xùn)練
Youtube Face(YTF): 3425videos/1595人
result on LFW:
result on YTF:
DeepFace與之后的方法的最大的不同點在于,DeepFace在訓(xùn)練神經(jīng)網(wǎng)絡(luò)前,使用了對齊方法。論文認為神經(jīng)網(wǎng)絡(luò)能夠work的原因在于一旦人臉經(jīng)過對齊后,人臉區(qū)域的特征就固定在某些像素上了,此時,可以用卷積神經(jīng)網(wǎng)絡(luò)來學(xué)習(xí)特征。
本文的模型使用了C++工具箱dlib基于深度學(xué)習(xí)的最新人臉識別方法,基于戶外臉部數(shù)據(jù)測試庫Labeled Faces in the Wild 的基準水平來說,達到了99.38%的準確率。
更多算法
http://www.gycc.com/trends/face%20recognition/overview/
dlib:http://dlib.net/
數(shù)據(jù)測試庫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)
捕捉臉部特征有很重要的用途,當然也可以用來進行圖片的數(shù)字美顏digital make-up(例如美圖秀秀)
digital make-up//github.com/ageitgey/face_recognition/blob/master/examples/digital_makeup.py
識別圖片中的人臉
識別誰出現(xiàn)在照片里
安裝步驟
本方法支持Python3/python2,我們只在macOS和Linux中測試過,還不知是否適用于Windows。
使用pypi的pip3安裝此模塊(或是Python 2的pip2)
重要提示:在編譯dlib時可能會出問題,你可以通過安裝來自源(而不是pip)的dlib來修復(fù)錯誤,請見安裝手冊How to install dlib from source
https://gist.github.com/ageitgey/629d75c1baac34dfa5ca2a1928a7aeaf
通過手動安裝dlib,運行pip3 install face_recognition來完成安裝。
使用方法命令行界面
當你安裝face_recognition,你能得到一個簡潔的叫做face_recognition的命令行程序,它能幫你識別一張照片或是一個照片文件夾中的所有人臉。
首先,你需要提供一個包含一張照片的文件夾,并且你已經(jīng)知道照片中的人是誰,每個人都要有一張照片文件,且文件名需要以該人的姓名命名;
然后你需要準備另外一個文件夾,里面裝有你想要識別人臉照片;
接下來你只用運行face_recognition命令,程序能夠通過已知人臉的文件夾識別出未知人臉照片中的人是誰;
針對每個人臉都要一行輸出,數(shù)據(jù)是文件名加上識別到的人名,以逗號分隔。
如果你只是想要知道每個照片中的人名而不要文件名,可以進行如下操作:
-
人臉識別
+關(guān)注
關(guān)注
76文章
4012瀏覽量
81975 -
人臉檢測
+關(guān)注
關(guān)注
0文章
80瀏覽量
16469
發(fā)布評論請先 登錄
相關(guān)推薦
評論