◆梁晶 史記征
基于Python庫的人臉識別方法研究
◆梁晶 史記征
(重慶安全技術職業學院 重慶 404020)
人臉識別技術經過幾十年的發展,已成為計算機視覺領域的一個研究熱點。隨著人臉識別算法的趨于成熟,人臉識別技術已經在公安、支付、身份驗證、美顏相機等領域得到了非常廣泛的應用。本文利用Python語言的第三方庫,通過機器深度學習實現人臉識別,該方法具有編程簡單、易于實現、準確率高等優勢。
人臉識別;Python語言;dlib庫
人臉是一個人在社會交往中最重要的特征,是確定一個人身份的最重要的方法,研究人臉識別具有重要的理論價值和應用價值。人臉識別是通過生物特征對人的身份進行辨認,是計算機視覺領域的一個研究方向。人臉識別研究起源于20世紀60年代,由Bledsoe和Chen最先提出。
通過對一個人面部的觀察可以獲得很多信息,比如:性別、心情、年齡、健康狀況等。人臉檢測是一個特別復雜的過程,根據所選檢測系統的不同,使用到的檢測算法、原理以及編程語言等也會相對應的不相同,但歸納起來大致都可以分為以下幾個流程:
(1)人臉檢測:這個流程主要完成的工作是從所給圖像信息中檢測出人臉,同時將關鍵點的位置范圍進行反饋。
(2)人臉規范化:由于人臉在不同的圖像像素和光照強度等問題下顯像程度是不一樣的,所以需要在上一步的基礎上對此進行校正。
(3)人臉特征提取:完成校正后,對識別到的較清晰的人臉進行特征提取。
(4)人臉識別:這一步是人臉檢測的最后一步,就是把前面提取出來的人臉特征與數據庫中已有的人臉特征進行匹配,進行人臉識別。具體識別過程如圖1所示。
本文所使用的Python第三方庫dlib是基于深度學習進行人臉識別的。

圖1 人臉識別過程
dlib庫一個機器學習的開源庫,解決包含機器學習算法以及開發復雜軟件的現實問題,它被廣泛應用在工業和學術研究領域,包括機器人、嵌入式設備、移動手機以及大規模高性能計算環境中。它的主要特點有:文檔說明全、代碼質量高,包含機器學習算法、科學計算算法、圖模型推理算法、圖像處理、網絡編程、圖形用戶接口、數據壓縮與整合算法等。
Python第三方庫最常用的安裝方式是通過pip命令。作為Python的內置命令,pip需要通過命令行執行。dlib庫的安裝命令是:pip install dlib。
本研究共涉及4種不同類型的文件:人臉關鍵點檢測器文件1.dat,人臉識別模型文件2.dat;候選人臉文件girl1.jpg、girl2.jpg、girl3.jpg、girl4.jpg、girl5.jpg、girl6.jpg;需要識別的人臉圖像文件test1.jpg、test2.jpg、test3.jpg、test4.jpg;Python腳本文件girl-face-rec.py。1.dat、2.dat可以從http://dlib.net/files/下載獲得;模型數據文件是用來估計人臉上68個特征點(x, y)的坐標位置,這68個坐標點的位置如圖2所示;候選人臉文件如圖3所示;需要識別的人臉圖像文件如圖4所示。

圖2 人臉特征坐標

圖3 候選人臉圖像

圖4 待識別的人臉圖像
從圖4可以看出:test1.jpg、test2.jpg和候選文件中的本人看起來有很大差別,test3.jpg是候選人中的原圖,test4.jpg中的女孩微微側臉,并且左臉有明顯黑色陰影。
基于以上分析和處理,人臉識別的相關數據已經準備完成,那么就可以通過編寫程序完成人臉識別了。其中人臉識別的大致流程如下:
(1)在對候選人進行人臉檢測、關鍵點提取、描述子生成后,把候選人描述子保存起來。
(2)然后對測試人臉進行人臉檢測、關鍵點提取、描述子生成。
(3)最后求測試圖像人臉描述子和候選人臉描述子之間的歐氏距離,距離最小者判定為同一個人。
#文件名: girl-face-rec py
#-*-coding:UHF-8-*-
import sys, os, dlib, glob, umpyfrom skimage
import io
if len(sys. argv)!=5:
print"請檢查參數是否正確”
exit()
predictor_path=sys.argv[1]
face_rec_model_path=sys. argv[2]
faces_folder_path=sys. argv[3]
img_path=sys. argv[4]
detector= dlib.get_frontal_face detector()
sp =dlib_shape_predictor(predictor_path)
facerec=
dlib face_recognition_model_vl(face_rec_mo
del_path)
descriptors=[]
for f in
glob glob(os path. join(faces_folder_path,
“*.jpg”)):
print(“Processing file:{}”.format(f))
img=io.imread(f)
dets=detector(img,1)
print(“Number of faces detected:
{}”.format(len(dets)))
for k, d in enumerate(dets):
shape=sp(img,d)
face descriptor=
facerec.compute_face_descriptor(img, shape)
v=numpy.array(face_descriptor)
descriptors.append(v)
img=io.imread(img_path)
dets=detector(img, 1)
dist=[]for k,d in enumerate(dets):
shape=sp(img, d)
face_descriptor=
facerec.compute_face_descriptor(img, shape)
d_test=numpy.array(face_descriptor)
for i in descriptors:
dist_=numpy.linalg.norm(i-d_test)
dist.append(dist_)
candidate=
[‘Unknown1’, ‘Unknown2’, ‘Shishi’, ‘Unknown4’
‘Bingbing’, ‘Feifei’]
c_d=dict(zip(candidate,dist))
cd_sorted=sorted(c_d.iteritems(),
key=lambda d:d [1])print” The person is:
“, cd_sorted[0][0]
dlib.hit_enter_to_continue()
分別運行如下命令:
(1)python girl-face-rec.py 1.dat
2.dat./candidate-faces testl.jpg
(2)python girl-face-rec.py 1.dat
2.dat./candidate-faces test2.jpg
(3)python girl-face-rec.py 1.dat
2.dat./candidate-faces test3.jpg
(4)python girl-face-rec.py 1.dat
2.dat./candidate-faces test4.jpg
通過運行結果可知:test1.jpg、test2.jpg、test3.jpg測試結果完全正確。但是測試圖片test4.jpg的輸出結果顯示是候選人girl4.jpg,識別存在一定的錯誤率。
利用Python的dlib庫可以實現人臉識別功能,編程簡單、準確度高。但由于每個人臉有68個特征值,假如已知人臉圖片過多,特征值庫將較大,歐式距離的計算將消耗較長時間,所以需要引入并行計算技術,以提高人臉識別效率。
[1]聶晶. Python在大數據挖掘和分析中的應用優勢[J].廣西民族大學學報, 2018, 24 (1) : 76-79.
[2]嚴婷,欣秀,趙嘉豪,等.基于Python 的可視化數據分析平臺設計與實現[J].計算機時代, 2017,(12) : 54-56.
[3]鄒國鋒,傅桂霞,李海濤,高明亮,王科俊.多姿態人臉識別綜述[J].模式識別與人工智能, 2015,28(07):613-625.
[4]胡敏,程天梅,王曉華.融合全局和局部特征的人臉識別[J].電子測量與儀器學報, 2013,27(09):817.
[5]Mark Summerfield著.王弘博,孫傳慶譯.Python3程序開發指南(第2版)[M].人民郵電出版社, 2015:427-444.
2018年重慶市高等職業教育雙基地建設重慶安全技術職業學院“大數據與物聯網融合實訓基地”項目支持。