摘 ?要:近年來,伴隨著人工智能的迅速發展,深度學習也掀起一股發展浪潮,在圖像、語音、大數據特征提取等多個方面獲得廣泛的應用。伴隨著人工智能、深度學習的發展浪潮,人臉識別這一項安全性較高的生物識別技術,已經成為了當今的研究熱點,在如智能家居、軍事安防等等眾多領域中得到了廣泛的應用。本文主要提出了兩種基于深度學習在Python語言實現人臉識別的方法。
關鍵詞:Python;人臉識別;深度學習
中圖分類號:TP391.41 ? ? ?文獻標識碼: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 ?深度學習的發展階段
1.1 ?深度學習的起源階段
20世紀40年代到60年代,深度學習在控制論中出現萌芽。1943年,美國數學家沃爾特·皮茨(W.Pitts)和心理學家沃倫·麥克洛克(W.McCulloch)提出了M-P模型。在此基礎上,美國人工智能專家弗蘭克·羅森布萊特(F. Rosenblatt)于1958年,正式提出了由兩層神經元組成的神經網絡感知器,對神經網絡的發展具有里程碑式的意義。
1.2 ?深度學習的發展階段
20世紀80年代到90年代,是深度學習發展的第二次浪潮。美國物理學家約翰·霍普菲爾德(Hopfield)在1982年發明了Hopfield神經網絡。1986年深度學習之父杰弗里·辛頓(Geoffrey Hinton)提出了一種適用于多層感知器的BP算法,該算法完美地解決了非線性可分問題,使得人工神經網絡再次引起人們的廣泛關注。
1.3 ?深度學習的爆發階段
第三次浪潮始于2006年。杰弗里·辛頓以及他的學生魯斯蘭·薩拉赫丁諾夫正式提出了深度學習這個概念。他們在論文中詳細地描述了無監督的逐層訓練算法,再使用有監督的反向傳播算法進行調優。深度學習一經提出,立即在學術圈引起了巨大的反響,又在工業界中迅速蔓延。在該階段,人們已經開始放眼于深度學習在小數據集上的泛化。
1.4 ?深度學習現狀
在世界級人工智能競賽LFW(大規模人臉識別競賽)上,應用深度學習進行計算機視覺研究的團隊力壓Facebook奪得冠軍,使得人工智能在該領域的識別能力超越真人。在國際上,Google、IBM等公司都進行了DNN(深度神經網絡)語音識別的研究。如今,深度學習已經在圖像、語音、CTR預估、大數據特征提取等多個方面獲得廣泛的應用。
2 ?人臉識別介紹
人臉識別的實質就是一種基于人臉的特征信息進行身份識別的生物技術,當我們用攝像產品采集到人臉的圖像時候,能自動地在圖像中檢測并追蹤指定人臉,再將檢測得到的人臉進行一系列相關操作。人臉識別主要由四個部分構成,分別為:圖像采集和檢測、圖像預處理、人臉特征提取以及人臉匹配和識別。
人臉識別技術的研究跨越了多個領域學科。人臉識別技術是一項高端的技術研究工作,在其中包含了多個學科的專業知識,如計算機視覺、圖像學、生理學、心理學等等學科知識。在人臉識別技術的研究中,目前主流的人臉識別分類方法一種是人臉特征統計的方法,主要有將圖像降維的特征臉方法和根據人臉面部特征及其幾何形狀來進行的幾何特征方法。另一種方法就是本文著重介紹的基于深度學習的人臉識別算法,通過深度學習,我們可以在大量人臉數據庫中學習訓練,從而獲得大量的使計算機易于理解和區分的人臉特征,達到人臉識別的效果。
人臉檢測是指通過分析人臉與其他物體不同的特征,對動態視頻或者圖像進行特征對比,判斷其中是否存在人臉特征,若是存在,確定人臉在圖像中的坐標,從而在圖像中分離出相應的人臉。人臉檢測的基本原理是:通過對人臉進行分析、建模,提取出屬于人臉特有的特征,通過判斷圖像中是否存在與特征匹配的區域,得到人臉。
深度學習的崛起使得人臉識別技術獲得了巨大的突破性的發展。人臉特征的選取是非常復雜且困難的,而深度學習的出現讓我們不需要再選擇特征,而是通過大數據自然訓練學習得到。深度學習得到的人臉特征有著其他特征所不具備的特性:它對局部的遮擋具有良好的魯棒性,而且沒有在模型中加入后期處理和顯式約束,這無疑更堅定了我們在將深度學習應用在人臉識別領域的決心。
3 ?基于Python深度學習人臉識別方法
3.1 ?Python基于OpenCV庫實現人臉識別
這幾年Python語言迅速發展。因為其有著豐富的第三方庫,我們可以用Python語言調用第三方庫幫助我們高效地實現人臉識別這個功能。OpenCV庫提供了三種人臉識別器,分別為基于PCA的EigenFace人臉識別器、基于LDA的FisherFace人臉識別器,和利用局部二值模式直方圖的LBPH人臉識別器。通過測試表明,光照的變化是導致人臉識別性能下降的主要原因之一。在實際應用中,環境變化非常大,其中光照的變化會使識別準確率大大下降。相比于其他兩種算法,LBPH有受光源影響較小的優點。所以本文選用OpenCV中提供的LBPH人臉識別器來實現人臉識別。以下為該方法實現的主要函數。
方法實現:
(1)該函數為檢測有效人臉。
def func1(img):
# 識別是否存在有效人臉,這里參數使用GitHub默認值
face_cascade=cv2.CascadeClassifier(r'./haarcas cade_ frontalface_default.xml')
# 讀取圖片
image = img
#對圖片進行灰度轉化
gray = cv2.cvtColor(image,cv2.COLOR_BGR2 GRAY)
# 探測圖片中的人臉
face = face_cascade.detectMultiScale(
#我們可以隨意指定里面參數的值,來達到不同精度下的識別。
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
#返回圖像以及是否有人臉的數值
return image,have_face
(2)該函數是對被測圖像進行采集。
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)該函數將被測的照片貼上標簽并將其臉部區域提取返回輸入到分類器中。
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庫實現人臉識別
Dlib是一個開源工具包,包含了許多機器學習算法和工具,目前Dlib已經被廣泛地應用在行業和學術領域,其中包括了嵌入式設備,機器人和大型高性能計算環境等。當然也可以幫助我們實現人臉識別。對Dlib庫源碼的查看,觀察到Dlib的原理是先檢測到人臉,然后通過深度殘差網(ResNet)生成一個128維的向量,ResNet有幾種不同深度的結構,而Dlib使用的是34層的網絡,生成向量后再求兩個向量之間的距離即可判定兩個臉的相似程度。以下為利用Dlib庫實現人臉識別的部分函數方法實現:
(1)該函數為加載人臉識別檢測器和模型進行人臉檢測。
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)該函數是用來得到多張圖像的特征值庫。
def func2(dirname,filetype):
descriptors = []
for f in glob.glob(os.path.join(dirname, filetype))
vector = func1(f)
des.append(vector)
return des
(3)該函數計算兩個向量之間的歐氏距離,距離越小者兩個臉越相似。
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 ?結 ?論
本文介紹了深度學習的發展。對人臉檢測,人臉識別進行了簡單的介紹。最主要的是介紹了兩種基于Python深度學習實現人臉識別的方法:第一種結合OpenCV提供了一種簡單易操作的人臉識別方法,但是由于該方法在動態識別圖像中仍存有很大的問題,所以仍然需要改進相關的算法,在更大數據集中進行訓練學習。第二種使用Dlib實現了簡單的人臉識別方法,也有不足之處。如當特征值庫較大時,計算向量之間的歐氏距離會花費很長時間,且代碼效率低,需要引進并行等技術改進算法。
參考文獻:
[1] 張枝令.Python實現基于深度學習的人臉識別 [J].電子商務,2018(5):47+96.
[2] 薛同來,趙冬暉,張華方,等.基于Python的深度學習人臉識別方法 [J].工業控制計算機,2019,32(2):118-119.
[3] 嚴嚴,陳日偉,王菡子.基于深度學習的人臉分析研究進展[J].廈門大學學報(自然科學版),2017,56(1):13-24.
[4] 何榮.基于OpenCV的人臉識別系統設計 [D].廣州:華南理工大學,2013:7-31.
作者簡介:徐浩浩(1998.07-),男,漢族,安徽潁上人,本科在讀,研究方向:計算機科學與技術。