摘 ?要:近年來,伴隨著人工智能的迅速發(fā)展,深度學(xué)習(xí)也掀起一股發(fā)展浪潮,在圖像、語音、大數(shù)據(jù)特征提取等多個方面獲得廣泛的應(yīng)用。伴隨著人工智能、深度學(xué)習(xí)的發(fā)展浪潮,人臉識別這一項安全性較高的生物識別技術(shù),已經(jīng)成為了當(dāng)今的研究熱點,在如智能家居、軍事安防等等眾多領(lǐng)域中得到了廣泛的應(yīng)用。本文主要提出了兩種基于深度學(xué)習(xí)在Python語言實現(xiàn)人臉識別的方法。
關(guān)鍵詞:Python;人臉識別;深度學(xué)習(xí)
中圖分類號:TP391.41 ? ? ?文獻標(biāo)識碼:A 文章編號:2096-4706(2019)17-0088-03
Abstract:In recent years,with the rapid development of artificial intelligence,the deep learning has also gained a steam,which has been widely used in many aspects,such as image,voice,big data feature extraction,etc. With the development of artificial intelligence and deep learning,face recognition,a highly secure biometric technology,has become a prevalent research topic and has been widely used in many fields such as smart home,military security and so on. This paper mainly proposes two methods of face recognition based on deep learning in Python language.
Keywords:Python;face recognition;deep learning
1 ?深度學(xué)習(xí)的發(fā)展階段
1.1 ?深度學(xué)習(xí)的起源階段
20世紀(jì)40年代到60年代,深度學(xué)習(xí)在控制論中出現(xiàn)萌芽。1943年,美國數(shù)學(xué)家沃爾特·皮茨(W.Pitts)和心理學(xué)家沃倫·麥克洛克(W.McCulloch)提出了M-P模型。在此基礎(chǔ)上,美國人工智能專家弗蘭克·羅森布萊特(F. Rosenblatt)于1958年,正式提出了由兩層神經(jīng)元組成的神經(jīng)網(wǎng)絡(luò)感知器,對神經(jīng)網(wǎng)絡(luò)的發(fā)展具有里程碑式的意義。
1.2 ?深度學(xué)習(xí)的發(fā)展階段
20世紀(jì)80年代到90年代,是深度學(xué)習(xí)發(fā)展的第二次浪潮。美國物理學(xué)家約翰·霍普菲爾德(Hopfield)在1982年發(fā)明了Hopfield神經(jīng)網(wǎng)絡(luò)。1986年深度學(xué)習(xí)之父杰弗里·辛頓(Geoffrey Hinton)提出了一種適用于多層感知器的BP算法,該算法完美地解決了非線性可分問題,使得人工神經(jīng)網(wǎng)絡(luò)再次引起人們的廣泛關(guān)注。
1.3 ?深度學(xué)習(xí)的爆發(fā)階段
第三次浪潮始于2006年。杰弗里·辛頓以及他的學(xué)生魯斯蘭·薩拉赫丁諾夫正式提出了深度學(xué)習(xí)這個概念。他們在論文中詳細(xì)地描述了無監(jiān)督的逐層訓(xùn)練算法,再使用有監(jiān)督的反向傳播算法進行調(diào)優(yōu)。深度學(xué)習(xí)一經(jīng)提出,立即在學(xué)術(shù)圈引起了巨大的反響,又在工業(yè)界中迅速蔓延。在該階段,人們已經(jīng)開始放眼于深度學(xué)習(xí)在小數(shù)據(jù)集上的泛化。
1.4 ?深度學(xué)習(xí)現(xiàn)狀
在世界級人工智能競賽LFW(大規(guī)模人臉識別競賽)上,應(yīng)用深度學(xué)習(xí)進行計算機視覺研究的團隊力壓Facebook奪得冠軍,使得人工智能在該領(lǐng)域的識別能力超越真人。在國際上,Google、IBM等公司都進行了DNN(深度神經(jīng)網(wǎng)絡(luò))語音識別的研究。如今,深度學(xué)習(xí)已經(jīng)在圖像、語音、CTR預(yù)估、大數(shù)據(jù)特征提取等多個方面獲得廣泛的應(yīng)用。
2 ?人臉識別介紹
人臉識別的實質(zhì)就是一種基于人臉的特征信息進行身份識別的生物技術(shù),當(dāng)我們用攝像產(chǎn)品采集到人臉的圖像時候,能自動地在圖像中檢測并追蹤指定人臉,再將檢測得到的人臉進行一系列相關(guān)操作。人臉識別主要由四個部分構(gòu)成,分別為:圖像采集和檢測、圖像預(yù)處理、人臉特征提取以及人臉匹配和識別。
人臉識別技術(shù)的研究跨越了多個領(lǐng)域?qū)W科。人臉識別技術(shù)是一項高端的技術(shù)研究工作,在其中包含了多個學(xué)科的專業(yè)知識,如計算機視覺、圖像學(xué)、生理學(xué)、心理學(xué)等等學(xué)科知識。在人臉識別技術(shù)的研究中,目前主流的人臉識別分類方法一種是人臉特征統(tǒng)計的方法,主要有將圖像降維的特征臉方法和根據(jù)人臉面部特征及其幾何形狀來進行的幾何特征方法。另一種方法就是本文著重介紹的基于深度學(xué)習(xí)的人臉識別算法,通過深度學(xué)習(xí),我們可以在大量人臉數(shù)據(jù)庫中學(xué)習(xí)訓(xùn)練,從而獲得大量的使計算機易于理解和區(qū)分的人臉特征,達到人臉識別的效果。
人臉檢測是指通過分析人臉與其他物體不同的特征,對動態(tài)視頻或者圖像進行特征對比,判斷其中是否存在人臉特征,若是存在,確定人臉在圖像中的坐標(biāo),從而在圖像中分離出相應(yīng)的人臉。人臉檢測的基本原理是:通過對人臉進行分析、建模,提取出屬于人臉特有的特征,通過判斷圖像中是否存在與特征匹配的區(qū)域,得到人臉。
深度學(xué)習(xí)的崛起使得人臉識別技術(shù)獲得了巨大的突破性的發(fā)展。人臉特征的選取是非常復(fù)雜且困難的,而深度學(xué)習(xí)的出現(xiàn)讓我們不需要再選擇特征,而是通過大數(shù)據(jù)自然訓(xùn)練學(xué)習(xí)得到。深度學(xué)習(xí)得到的人臉特征有著其他特征所不具備的特性:它對局部的遮擋具有良好的魯棒性,而且沒有在模型中加入后期處理和顯式約束,這無疑更堅定了我們在將深度學(xué)習(xí)應(yīng)用在人臉識別領(lǐng)域的決心。
3 ?基于Python深度學(xué)習(xí)人臉識別方法
3.1 ?Python基于OpenCV庫實現(xiàn)人臉識別
這幾年P(guān)ython語言迅速發(fā)展。因為其有著豐富的第三方庫,我們可以用Python語言調(diào)用第三方庫幫助我們高效地實現(xiàn)人臉識別這個功能。OpenCV庫提供了三種人臉識別器,分別為基于PCA的EigenFace人臉識別器、基于LDA的FisherFace人臉識別器,和利用局部二值模式直方圖的LBPH人臉識別器。通過測試表明,光照的變化是導(dǎo)致人臉識別性能下降的主要原因之一。在實際應(yīng)用中,環(huán)境變化非常大,其中光照的變化會使識別準(zhǔn)確率大大下降。相比于其他兩種算法,LBPH有受光源影響較小的優(yōu)點。所以本文選用OpenCV中提供的LBPH人臉識別器來實現(xiàn)人臉識別。以下為該方法實現(xiàn)的主要函數(shù)。
方法實現(xiàn):
(1)該函數(shù)為檢測有效人臉。
def func1(img):
# 識別是否存在有效人臉,這里參數(shù)使用GitHub默認(rèn)值
face_cascade=cv2.CascadeClassifier(r'./haarcas cade_ frontalface_default.xml')
# 讀取圖片
image = img
#對圖片進行灰度轉(zhuǎn)化
gray = cv2.cvtColor(image,cv2.COLOR_BGR2 GRAY)
# 探測圖片中的人臉
face = face_cascade.detectMultiScale(
#我們可以隨意指定里面參數(shù)的值,來達到不同精度下的識別。
gray,
scaleFactor = 1.15,
minNeighbors = 5,
minSize = (30,30),
flags = cv2.cv.CV_HAAR_SCALE_IMAGE
)
if len(face) == 0:
have_face == 0
if len(face) == 1:
have_face == 1
#返回圖像以及是否有人臉的數(shù)值
return image,have_face
(2)該函數(shù)是對被測圖像進行采集。
def fun2(num):
number = 1
while(1):
#讀取攝像頭圖像
ret,imga = cap.read()
org_img, face=test.func1(imga)
if face == 1:
# 命名存儲圖像
now_time = time.strftime (″%Y-%m-%d%H:%M:%S″,time.localtime())
picture_name = str(the_now_time)
old_filname = the_picture_name + '.jpg'
filname = old_filname.replace(″:″, ″ ″)
cv2.imwrite(filname,imga)
number +=1
if number == num:
break
(3)該函數(shù)將被測的照片貼上標(biāo)簽并將其臉部區(qū)域提取返回輸入到分類器中。
deffunc3(img):
gray=cv2.cvtColor(img,cv2.COLOR_BGR2 GRAY) face_cascade=cv2.CascadeClassifier(r'./haarcas cade_frontalface_default.xml')
face = face_cascade.detectMultiScale(
gray,
scaleFactor = 1.15,
minNeighbors = 5,
minSize = (30,30),
flags = cv2.cv.CV_HAAR_SCALE_IMAGE
)
(a, b, w, h) = face_data[0]
return gray[b:b + w, a:a + h], face_data[0],1
3.2 ?Python基于Dlib庫實現(xiàn)人臉識別
Dlib是一個開源工具包,包含了許多機器學(xué)習(xí)算法和工具,目前Dlib已經(jīng)被廣泛地應(yīng)用在行業(yè)和學(xué)術(shù)領(lǐng)域,其中包括了嵌入式設(shè)備,機器人和大型高性能計算環(huán)境等。當(dāng)然也可以幫助我們實現(xiàn)人臉識別。對Dlib庫源碼的查看,觀察到Dlib的原理是先檢測到人臉,然后通過深度殘差網(wǎng)(ResNet)生成一個128維的向量,ResNet有幾種不同深度的結(jié)構(gòu),而Dlib使用的是34層的網(wǎng)絡(luò),生成向量后再求兩個向量之間的距離即可判定兩個臉的相似程度。以下為利用Dlib庫實現(xiàn)人臉識別的部分函數(shù)方法實現(xiàn):
(1)該函數(shù)為加載人臉識別檢測器和模型進行人臉檢測。
def func1(imgname):
#加載檢測器
fd = dlib.get_frontal_face_detector()
sp = dlib.shape_predictor(predictor_path)
#加載模型
frm= dlib.fae_recognition_model_v1(face_rec_model_path)
img = io.imread(imgname)
dets = detector(img,1)
#人臉檢測
yo for k, d in enumerate(dets):
shape = sp(img, d)
face_descriptor = frm.compute_face_descriptor (img,shape)
test = numpy.array(face_descriptor)
returntest
(2)該函數(shù)是用來得到多張圖像的特征值庫。
def func2(dirname,filetype):
descriptors = []
for f in glob.glob(os.path.join(dirname, filetype))
vector = func1(f)
des.append(vector)
return des
(3)該函數(shù)計算兩個向量之間的歐氏距離,距離越小者兩個臉越相似。
def func3(vector,des)
dist = []
for k in des:
dist_ = numpy.linalg.norm(j-vector)
dist.append(dist_)
print("The person is:",dist.index((min(dist)))+1)
4 ?結(jié) ?論
本文介紹了深度學(xué)習(xí)的發(fā)展。對人臉檢測,人臉識別進行了簡單的介紹。最主要的是介紹了兩種基于Python深度學(xué)習(xí)實現(xiàn)人臉識別的方法:第一種結(jié)合OpenCV提供了一種簡單易操作的人臉識別方法,但是由于該方法在動態(tài)識別圖像中仍存有很大的問題,所以仍然需要改進相關(guān)的算法,在更大數(shù)據(jù)集中進行訓(xùn)練學(xué)習(xí)。第二種使用Dlib實現(xiàn)了簡單的人臉識別方法,也有不足之處。如當(dāng)特征值庫較大時,計算向量之間的歐氏距離會花費很長時間,且代碼效率低,需要引進并行等技術(shù)改進算法。
參考文獻:
[1] 張枝令.Python實現(xiàn)基于深度學(xué)習(xí)的人臉識別 [J].電子商務(wù),2018(5):47+96.
[2] 薛同來,趙冬暉,張華方,等.基于Python的深度學(xué)習(xí)人臉識別方法 [J].工業(yè)控制計算機,2019,32(2):118-119.
[3] 嚴(yán)嚴(yán),陳日偉,王菡子.基于深度學(xué)習(xí)的人臉分析研究進展[J].廈門大學(xué)學(xué)報(自然科學(xué)版),2017,56(1):13-24.
[4] 何榮.基于OpenCV的人臉識別系統(tǒng)設(shè)計 [D].廣州:華南理工大學(xué),2013:7-31.
作者簡介:徐浩浩(1998.07-),男,漢族,安徽潁上人,本科在讀,研究方向:計算機科學(xué)與技術(shù)。