1. 程式人生 > 程式設計 >人臉識別技術概要 (利用 Dlib 實現人臉識別)

人臉識別技術概要 (利用 Dlib 實現人臉識別)

簡介

人臉識別技術是一種生物識別技術,可以用來確認使用者身份。人臉識別技術相比於傳統的身份識別技術有很大的優勢,主要體現在方便性上。傳統的身份認證方式諸如:密碼、PIN碼、射頻卡片、口令、指紋等,需要使用者記住複雜密碼或者攜帶身份認證鑰匙。而密碼、卡片均存在丟失洩露的風險,相比於人臉識別,互動性於安全性都不夠高。人臉識別可以使用攝像頭遠距離非接觸識別,相比於指紋免去了將手指按在識別區域的操作,可由攝像頭自動識別。

目前人臉識別技術已經廣泛應用於安全、監控、一般身份識別、考勤、走失兒童搜救等領域,對於提升身份認證的效率起到了重要的作用。而且目前還有更深入的人臉識別的研究正在進行,包括性別識別、年齡估計、心情估計等,更高水平和更高準確率的人臉識別技術對於城市安全和非接觸式身份認證有巨大的作用。 人臉識別問題巨集觀上分為兩類:人臉驗證和人臉識別。人臉驗證通常是做1對1的對比,判斷兩張圖片中是否為同一人。人臉識別通常是1對多的對比,判斷照片中的人是否為資料庫中的某一位。

人臉識別受到多種因素影響,主要分為基礎因素、內在因素和外在因素。基礎因素是人臉本身就相似,人的五官、輪廓大致相同;內在因素是人的內部屬性,如年齡變化、精神狀態、化妝等;外部因素是成像質量的問題,比如相片的清晰程度、有無眼鏡、口罩等遮擋。對於人類來說,認出一個人是很容易的事情,對於計算機而言,圖片是由多維數字矩陣表示的,識別任務難度大。

最早的人臉識別是半自動人臉識別,由人工標註人臉特徵點,計算機根據特徵點相對位置進行人臉匹配。

在1965-1990年間的人臉識別研究主要基於人臉幾何結構特徵和模版匹配的方法,利用幾何特徵提取人眼、口、鼻等重要特徵點的位置,以及眼睛等重要器官的幾何直觀形狀作為分類特徵,並據此計算特徵點之間相互位置和距離,用來衡量兩幅人臉影象的相似程度。

1991-1997年,基於整體的方法較多,包括主成分分析(PCA)方法、線性鑑別分析(LDA)方法等。這些方法通過尋找一組投影向量,將人臉降維,再將低維特徵送入類似SVM等機器學習分類器中進行人臉分類。

1998年至2013年間,很多借助深度相機、結構光、紅外相機等裝置輔助人臉識別的方法出現,使得人臉識別的精度大大提高。同時還有早期的基於特徵的分類方法,在人臉不同位置提取區域性特徵,得到的結果往往比整體方法更加具有魯棒性。類似的有從影象塊中提取HOG、LBP、SIFI、SURF特徵,將各模組區域性特徵的向量串聯,作為人臉的表示。 亦有綜合方法,先使用基於特徵的方法獲得區域性特徵,再使用子空間法(比如PCA、LDA)獲得低維特徵,將基於整體與基於區域性特徵的方法。這類方法中,GaussianFace在LFW上獲得了最好的精度98.52%,幾乎匹敵很多後來出現的深度學習方法。

2006年後,深度學習開始得到研究人員重視,在國際期刊發表的數目越來越多。而後深度學習廣泛應用於各種目標檢測領域,2015年,Google團隊的FaceNet在LFW資料集上得平均準確率達到了99.63%,基於深度學習的人臉識別的準確率已經高於人類本身,深度學習在人臉識別領域基本佔據了統治地位。

人臉識別常見流程

絕大多數人臉識別都包含如下幾個流程:人臉檢測(Face Detection)、人臉對齊(Face Alignment)、人臉表示(Face Representation)和人臉匹配(Face Matching)。 如下圖所示:

在這裡插入圖片描述

  1. 人臉檢測 Face Detection

從輸入的影象中檢測到人臉區域,並返回人臉包圍框的座標。

  1. 人臉對齊(人臉配準)Face Alignment

從人臉區域中檢測到人臉特徵點,並以特徵點為依據對人臉進行歸一化操作,使人臉區域的尺度和角度一致,方便特徵提取與人臉匹配。人臉對齊的最終目的是在已知的人臉方框中定位人臉的精準形狀,主要分為兩大類:基於優化的方法和基於迴歸的方法。這裡基於迴歸樹的人臉對齊演演算法是Vahid Kazemi 和 Josephine Sullivan於CVPR2014年發表的人臉特徵點識別方法,是一種基於迴歸樹的人臉對齊方法,這種方法通過建立一個級聯殘差迴歸樹(GBDT)來使人臉從當前形狀一點點回歸到真實形狀。

  1. 人臉表示Face Representation

從歸一化的人臉區域中進行特徵提取,得到特徵向量,比如有的深度神經網路方法使用128個特徵表示人臉,最理想的情況是不同的人的照片提取出的特徵向量不一樣,而同一人的不同照片中可以提取出相似的特徵向量。

  1. 人臉匹配 Face Mataching

將兩幅圖片計算出的特徵向量進行對比,獲得兩幅照片的相似得分。根據相似得分,得分高的可判斷為同一人,得分低的判斷為不同人。

人臉表示的基本思路

深度學習識別人臉的主要思路是不同的人臉由不同的特徵組成。從簡單的說,特徵可有眼皮、鼻子、眼睛、膚色、髮色,如表格所示。則5個特徵可以形容25種人臉,即(特徵1,特徵2,特徵3,特徵4,特徵5)可表示一種人臉,如(1,1,0)可表示一位雙眼皮、低鼻樑、黑眼球、黃膚色、黑髮色的人。

序號 特徵 0 1
1 眼皮 單眼皮 雙眼皮
2 鼻子 低鼻樑 高鼻樑
3 瞳色 黑色 棕色
4 膚色 黃色 白色
5 髮色 黑色 金黃色

對於表格的物種特徵每個特徵有兩種表現來說,一共可以表示的32種外貌用來做人臉識別是不夠的,因此可以增加特徵的數量,比如用更多的特徵表示人臉,增加特徵6臉型、特徵7嘴脣等;同時可以增加某一特徵的具體表現數量,如特徵3,用0表示黑色、0.1表示黑色帶點藍色、0.2表示黃色、0.25表示棕色等等。因此當實際應用中特徵數量達到1024或更高的數量級,特徵值取連續的小數。擴充後,一張人臉可能表示為(0.3,2,1.5,1.75,…… ),基本可以表示無數張人臉。

在實際中,這些特徵並非由人工設定的,而是由深度神經網路在訓練過程中學習而來的,儲存在了深度神經網路中的各節點的引數中,一個深度神經網路模型即為網路的結構和各節點的引陣列成。

在這裡插入圖片描述

如圖所示是一個128維度特徵提取網路,三張山下智久的照片經過神經網路提取後的特徵在128維空間中非常接近,而石原里美的照片經過神經網路處理結果就與山下智久的結果相距較遠。即同一人的不同照片提取的特徵在特徵空間裡距離相近,而不同人臉的照片在特徵空間中距離較遠。

工程實現樣例

參照上述思路,我實現了一個簡易的人臉識別程式,地址在face_identification,效果如下圖所示。 本工程基本照搬了 dlib.net/dnn_face_re…,僅有些小小的改變,dlib的方法中使用了ResNet34用作人臉識別網路,該殘差網路的詳細內容參照何凱明等人的工作Deep Residual Network at 2015

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-BzBS4asX-1573562657071)(github.com/mcoder2014/…)]

設計思路

  1. 介面:本軟體使用Qt作為介面軟體設計,為了快速編碼,使用了Qt Example中的Camera樣例工程,將人臉識別內嵌在其中。重寫了畫布,可以按照想要的時間間隔呼叫人臉識別程式碼。
  2. 多執行緒:根據相機解析度的不同,一次人臉識別流程耗時在0.2-0.4s不等,如果使用單執行緒開發,會導致識別人臉的時候相機畫面卡住。因此使用了Qt的多執行緒支援,將人臉識別流程放在了其他執行緒,UI執行緒與人臉識別執行緒中採用Qt的訊號與槽機制通訊。
  3. 人臉檢測:使用dlib中的frontal_face_detector正面人臉檢測器,檢測畫面中的人臉區域。
  4. 人臉Landmark標記:使用dlib的shape_predictor_5_face_landmarks.dat五個特徵點檢測模型,檢測眼睛鼻子嘴角共五個特徵點,用於調整影象尺寸、人臉角度,歸一化為 150x150解析度,供特徵提取網路使用。
  5. 特徵提取:使用ResNet34網路稍作調整,網路輸入150x150影象,輸出128個特徵值。
  6. 識別-建立資料庫:利用csv檔案存貯已知人物身份列表(包括一張身份圖片),先將作為原始資料的影象經過特徵提取,生成尺寸為[影象數量,128]的矩陣。利用FLANN為該資料建立索引數。
  7. 識別-查詢資料庫:相機識別到的人臉經過特徵提取後得到的128個特徵向量在FLANN索引中尋找最近點,並計算與最近點之間的距離,如果距離在閾值範圍內,則判定為同一使用者。

環境依賴

工程實際使用了Qt和一些主要依賴庫,但為了工程管理方便,我直接在工程的libs.pri中設定了對於外部庫的引用,主要使用瞭如下外部庫。

Dlib 19.17
opencv 3.4
flann 1.9.1
複製程式碼

也就是說,如果你需要在我的程式碼基礎上進行修改,則需要首先配置好這些庫,然後修改libs.pri檔案中對於這些庫的連結地址,然後才可以順利編譯成功。

更多

如果對於該程式設計還有更多的疑問,歡迎前往該工程的Issues板塊提問,我會盡快解答疑問。

Reference

  1. face_identification
  2. Dlib 19.17
  3. opencv 3.4.5
  4. Qt 5.12 Mingw 730 x64
  5. qtcsv 1.5.0
  6. FLANN 1.9.1
  7. Kazemi V,Sullivan J . One Millisecond Face Alignment with an Ensemble of Regression Trees[C]// 2014 IEEE Conference on Computer Vision and Pattern Recognition (CVPR). IEEE Computer Society,2014.
  8. Schroff F,Kalenichenko D,Philbin J . FaceNet: A Unified Embedding for Face Recognition and Clustering[J]. 2015.
  9. He K,Zhang X,Ren S,et al. Deep residual learning for image recognition[C]//Proceedings of the IEEE conference on computer vision and pattern recognition. 2016: 770-778.