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

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

圖2 人臉特征坐標(biāo)

圖3 候選人臉圖像

圖4 待識(shí)別的人臉圖像
從圖4可以看出:test1.jpg、test2.jpg和候選文件中的本人看起來有很大差別,test3.jpg是候選人中的原圖,test4.jpg中的女孩微微側(cè)臉,并且左臉有明顯黑色陰影。
基于以上分析和處理,人臉識(shí)別的相關(guān)數(shù)據(jù)已經(jīng)準(zhǔn)備完成,那么就可以通過編寫程序完成人臉識(shí)別了。其中人臉識(shí)別的大致流程如下:
(1)在對(duì)候選人進(jìn)行人臉檢測(cè)、關(guān)鍵點(diǎn)提取、描述子生成后,把候選人描述子保存起來。
(2)然后對(duì)測(cè)試人臉進(jìn)行人臉檢測(cè)、關(guān)鍵點(diǎn)提取、描述子生成。
(3)最后求測(cè)試圖像人臉描述子和候選人臉描述子之間的歐氏距離,距離最小者判定為同一個(gè)人。
#文件名: girl-face-rec py
#-*-coding:UHF-8-*-
import sys, os, dlib, glob, umpyfrom skimage
import io
if len(sys. argv)!=5:
print"請(qǐng)檢查參數(shù)是否正確”
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()
分別運(yùn)行如下命令:
(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
通過運(yùn)行結(jié)果可知:test1.jpg、test2.jpg、test3.jpg測(cè)試結(jié)果完全正確。但是測(cè)試圖片test4.jpg的輸出結(jié)果顯示是候選人girl4.jpg,識(shí)別存在一定的錯(cuò)誤率。
利用Python的dlib庫(kù)可以實(shí)現(xiàn)人臉識(shí)別功能,編程簡(jiǎn)單、準(zhǔn)確度高。但由于每個(gè)人臉有68個(gè)特征值,假如已知人臉圖片過多,特征值庫(kù)將較大,歐式距離的計(jì)算將消耗較長(zhǎng)時(shí)間,所以需要引入并行計(jì)算技術(shù),以提高人臉識(shí)別效率。
[1]聶晶. Python在大數(shù)據(jù)挖掘和分析中的應(yīng)用優(yōu)勢(shì)[J].廣西民族大學(xué)學(xué)報(bào), 2018, 24 (1) : 76-79.
[2]嚴(yán)婷,欣秀,趙嘉豪,等.基于Python 的可視化數(shù)據(jù)分析平臺(tái)設(shè)計(jì)與實(shí)現(xiàn)[J].計(jì)算機(jī)時(shí)代, 2017,(12) : 54-56.
[3]鄒國(guó)鋒,傅桂霞,李海濤,高明亮,王科俊.多姿態(tài)人臉識(shí)別綜述[J].模式識(shí)別與人工智能, 2015,28(07):613-625.
[4]胡敏,程天梅,王曉華.融合全局和局部特征的人臉識(shí)別[J].電子測(cè)量與儀器學(xué)報(bào), 2013,27(09):817.
[5]Mark Summerfield著.王弘博,孫傳慶譯.Python3程序開發(fā)指南(第2版)[M].人民郵電出版社, 2015:427-444.
2018年重慶市高等職業(yè)教育雙基地建設(shè)重慶安全技術(shù)職業(yè)學(xué)院“大數(shù)據(jù)與物聯(lián)網(wǎng)融合實(shí)訓(xùn)基地”項(xiàng)目支持。