人臉識別技術是一種生物識別技術,能夠用來確認用戶身份。人臉識別技術相比於傳統的身份識別技術有很大的優點,主要體如今方便性上。傳統的身份認證方式諸如:密碼、PIN碼、射頻卡片、口令、指紋等,須要用戶記住複雜密碼或者攜帶身份認證鑰匙。而密碼、卡片均存在丟失泄露的風險,相比於人臉識別,交互性於安全性都不夠高。人臉識別可使用攝像頭遠距離非接觸識別,相比於指紋免去了將手指按在識別區域的操做,可由攝像頭自動識別。html
目前人臉識別技術已經普遍應用於安全、監控、通常身份識別、考勤、走失兒童搜救等領域,對於提高身份認證的效率起到了重要的做用。並且目前還有更深刻的人臉識別的研究正在進行,包括性別識別、年齡估計、心情估計等,更高水平和更高準確率的人臉識別技術對於城市安全和非接觸式身份認證有巨大的做用。 人臉識別問題宏觀上分爲兩類:人臉驗證和人臉識別。人臉驗證一般是作1對1的對比,判斷兩張圖片中是否爲同一人。人臉識別一般是1對多的對比,判斷照片中的人是否爲數據庫中的某一位。git
人臉識別受到多種因素影響,主要分爲基礎因素、內在因素和外在因素。基礎因素是人臉自己就類似,人的五官、輪廓大體相同;內在因素是人的內部屬性,如年齡變化、精神狀態、化妝等;外部因素是成像質量的問題,好比相片的清晰程度、有無眼鏡、口罩等遮擋。對於人類來講,認出一我的是很容易的事情,對於計算機而言,圖片是由多維數字矩陣表示的,識別任務難度大。github
最先的人臉識別是半自動人臉識別,由人工標註人臉特徵點,計算機根據特徵點相對位置進行人臉匹配。算法
在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%,基於深度學習的人臉識別的準確率已經高於人類自己,深度學習在人臉識別領域基本佔據了統治地位。bash
絕大多數人臉識別都包含以下幾個流程:人臉檢測(Face Detection)、人臉對齊(Face Alignment)、人臉表示(Face Representation)和人臉匹配(Face Matching)。 以下圖所示:網絡
從輸入的圖像中檢測到人臉區域,並返回人臉包圍框的座標。多線程
從人臉區域中檢測到人臉特徵點,並以特徵點爲依據對人臉進行歸一化操做,令人臉區域的尺度和角度一致,方便特徵提取與人臉匹配。人臉對齊的最終目的是在已知的人臉方框中定位人臉的精準形狀,主要分爲兩大類:基於優化的方法和基於迴歸的方法。這裏基於迴歸樹的人臉對齊算法是Vahid Kazemi 和 Josephine Sullivan於CVPR2014年發表的人臉特徵點識別方法,是一種基於迴歸樹的人臉對齊方法,這種方法經過創建一個級聯殘差迴歸樹(GBDT)來令人臉從當前形狀一點點回歸到真實形狀。
從歸一化的人臉區域中進行特徵提取,獲得特徵向量,好比有的深度神經網絡方法使用128個特徵表示人臉,最理想的狀況是不一樣的人的照片提取出的特徵向量不同,而同一人的不一樣照片中能夠提取出類似的特徵向量。
將兩幅圖片計算出的特徵向量進行對比,得到兩幅照片的類似得分。根據類似得分,得分高的可判斷爲同一人,得分低的判斷爲不一樣人。
深度學習識別人臉的主要思路是不一樣的人臉由不一樣的特徵組成。從簡單的說,特徵可有眼皮、鼻子、眼睛、膚色、髮色,如表格所示。則5個特徵能夠形容25種人臉,即(特徵1,特徵2,特徵3,特徵4,特徵5)可表示一種人臉,如(1,0,0,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/…)]
工程實際使用了Qt和一些主要依賴庫,但爲了工程管理方便,我直接在工程的libs.pri
中設置了對於外部庫的引用,主要使用了以下外部庫。
Dlib 19.17
opencv 3.4
flann 1.9.1
複製代碼
也就是說,若是你須要在個人代碼基礎上進行修改,則須要首先配置好這些庫,而後修改libs.pri
文件中對於這些庫的連接地址,而後才能夠順利編譯成功。
若是對於該程序設計還有更多的疑問,歡迎前往該工程的Issues板塊提問,我會盡快解答疑問。