吳友蘭 胡冬琴 石俊峰
摘要:本文介紹兩種快速搭建人臉識別系統(tǒng)的方法。一種設(shè)計方法以O(shè)penCV視覺庫為核心的人臉識別系統(tǒng),我們將攝像頭采集的人的面部圖像進(jìn)行灰度化處理、特征值計算,并在此基礎(chǔ)上訓(xùn)練出待測人臉的數(shù)據(jù)模型,然后對數(shù)據(jù)進(jìn)行分析處理,用以識別出人臉。另一種方法是基于百度云API進(jìn)行人臉檢測,我們靈活利用百度云提供的大量模塊化接口,可快速完成相關(guān)的開發(fā),大大縮短開發(fā)周期。
關(guān)鍵詞:人臉識別; OpenCV; 人工智能; 嵌入式;
一、引言
人臉識別是獲得人的眼、口、鼻輪廓,從而識別多種人臉屬性。它實現(xiàn)從輸入的人臉圖像或視頻流中檢測和跟蹤人臉,首先判斷其是否存在人臉,如果存在人臉就進(jìn)行預(yù)處理,切割出其中的人臉照片,然后再給出每個人臉的位置、大小和各個主要面部器官的位置信息。最后依據(jù)這些信息,進(jìn)一步提取每個人臉中所包含的身份特征數(shù)據(jù),并將其與已知的人臉庫中人臉進(jìn)行對比,從而識別不同人臉的身份。人臉識別作為一種生物識別技術(shù),具有非強(qiáng)制性、非接觸性、并發(fā)性等特點,已經(jīng)廣泛應(yīng)用于各行各業(yè)。
下面我們介紹二種方法用以快速搭建人臉識別系統(tǒng),可以把它加載到現(xiàn)有的項目中快速實現(xiàn)人臉比對、人臉識別功能。我們的程序設(shè)計都采用了python語言來實現(xiàn),如圖1列出了人臉識別系統(tǒng)框圖。
在很多設(shè)計開發(fā)項目中,我們需要通過人臉的比對來進(jìn)行身份的驗證。當(dāng)前主流的人臉識別算法,在進(jìn)行人臉比對時,主要依靠人臉特征值的比對。所謂特征值,即面部特征所組成的信息集,人工智能算法可以很精確的辨別和記住面部特征,從而實現(xiàn)人臉比對,人臉識別。
人臉識別就是給定一張臉,判斷這張臉是誰。人臉識別是需要識別人的的人臉特征與數(shù)據(jù)庫中已獲取到的人臉特征模板進(jìn)行比對,根據(jù)所比較的相似程度對人臉的身份信息進(jìn)行判斷。我們介紹二種方法來快速實現(xiàn)人臉識別和人臉比對。人臉識別步驟包括數(shù)據(jù)收集和預(yù)處理、訓(xùn)練模型、人臉識別三個部分。第一種方法是在本地拍攝待測人臉大約30張照片,照片在不同時間、不同光照、不同表情(睜眼閉眼、笑或者不笑)、不同人臉細(xì)節(jié)(戴眼鏡或者不戴眼鏡)下進(jìn)行采集。然后用OpenCV中FaceRecognizer類對收集的待測人臉照片數(shù)據(jù)進(jìn)行人臉檢測和訓(xùn)練生成人臉數(shù)據(jù)集.yml文件,利用生成的.vml模型文件來實現(xiàn)人臉識別。第二種方法是將自己的照片上傳到百度云平臺上,由百度云平臺負(fù)責(zé)收集你的臉部特征和對模型的訓(xùn)練,并將你攝像頭中所錄取的照片與人臉庫比對從而實現(xiàn)人臉識別的功能。
第一種方法我們利用OpenCV中提供的人臉識別算法來實現(xiàn)人臉檢測識別。OpenCV的全稱是Open Source Computer Vision Library,是一個開放源代碼的計算機(jī)視覺庫,可以運(yùn)行多種操作系統(tǒng)上,我們可以利用OpenCV快速的實現(xiàn)端對端的人臉識別。
實現(xiàn)步驟包括下面三步:
第一步:人臉數(shù)據(jù)圖片的收集和預(yù)處理
數(shù)據(jù)的收集和預(yù)處理就是在得到待測人臉照片之后,對圖片上的人臉進(jìn)行檢測和分割并添加數(shù)據(jù)標(biāo)簽。
執(zhí)行步驟包括:
1.加載分類器,我們調(diào)用opencv中提供的“haarcascade_frontalface_alt2.xml”分類器文件,它對人臉的檢測準(zhǔn)確率和速度都比較好。
2.調(diào)用detectMultiScale()函數(shù)檢測,調(diào)整函數(shù)的參數(shù)可以使檢測結(jié)果更加精確。
3.把檢測到的人臉用矩形畫出來。
4. 記錄每一個人臉對應(yīng)的標(biāo)簽,就是為每一個人姓名編號。
實現(xiàn)人臉檢測的核心代碼如下:
face_detect = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
faces=face_detect.detectMultiScale(image_gray, scaleFactor=1.15, minNeighbors=5, minSize=(5, 5)) # 檢測人臉
for (x, y, width, height) in faces:# 根據(jù)檢測結(jié)果繪制矩形框
cv2.rectangle(image, (x, y), (x + width, y + height), (255, 0, 0), 2)
cv2.imwrite("dataset/User."+str(face_id)+'.'+str(count)+".jpg",gray[y:y+h,x:x+w])# 記錄人臉標(biāo)簽
第二步:訓(xùn)練模型,圖2是訓(xùn)練人臉模型流程圖如下:
通過樣本和類別標(biāo)簽進(jìn)行訓(xùn)練,得到訓(xùn)練好的人臉模型,將模型保存為.xml文件。
現(xiàn)在待測人臉數(shù)據(jù)集準(zhǔn)備好了,接下來就是訓(xùn)練模型了。這里我們用到了opencv的Facerecognizer類。FaceRecognizer類主要包含了三種人臉識別的方法:基于PCA變換的、基于Fisher變換的和基于局部二值模式的三種方法。
LBPH(Local Binary Pattern Histogram)將檢測到的人臉分為若干個小單元,并將每個小單元與模型中的對應(yīng)單元進(jìn)行比較,對每個區(qū)域進(jìn)行匹配,由所獲得的匹配值產(chǎn)生直方圖。由于這種方法的靈活性,LBPH是唯一允許模型樣本人臉和檢測到的人臉在形狀、大小上可以不同的人臉識別算法。
我們從數(shù)據(jù)集中獲取所有用戶數(shù)據(jù),并調(diào)用train函數(shù)進(jìn)行并“訓(xùn)練”產(chǎn)生OpenCV 識別器。訓(xùn)練結(jié)束后,會產(chǎn)生一個 .yml 的模型文件,該文件將保存在“trainer/”目錄中,供我們后面做人臉識別測試時用。
第三步:人臉識別、人臉測試
在模型訓(xùn)練好之后我們拿數(shù)據(jù)集中的最后幾張圖片做一個測試,根據(jù)獲得的confidence值確定測試結(jié)果。
調(diào)整后的區(qū)域中調(diào)用 predict()函數(shù), 該函數(shù)返回兩個元素的數(shù)組:
第一個元素是所識別個體的標(biāo)簽, 第二個是置信度評分。 所有的算法都有一個置信度評分閾值,置信度評分用來衡量所識別人臉與原模型的差距, 0 表示完全匹配。 可能有時不想保留所有的識別結(jié)果,則需要進(jìn)一步處理,因此可用自己的算法來估算識別的置信度評分。 LBPH一個好的識別參考值要低于 50,任何高于 80 的參考值都會被認(rèn)為是低的置信度評分。
第二種方法我們調(diào)用百度提供的開放人臉api接口,幫助我們快速在自己的系統(tǒng)中集成人臉識別的功能,而且這個接口可以無限次調(diào)用。由于嵌入式開發(fā)系統(tǒng)的性能限制,運(yùn)行神經(jīng)網(wǎng)絡(luò)來進(jìn)行人臉模型的訓(xùn)練識別的難度較大,在嵌入式系統(tǒng)的開發(fā)中一般采用了百度提供的開源的人臉識別SDK來進(jìn)行人臉的識別和檢測。
開發(fā)步驟如下:
1.在百度智能云上申請注冊,先獲取APPID、API Key和secret key,添加人臉識別功能。
2.下載Python HTTP? SDK安裝百度的api。
輸入以下代碼安裝:pip install baidu-aip
python setup.py install
3.新建分組
4.在分組中創(chuàng)建用戶,用戶名zhangsan,并且添加自己人臉照片進(jìn)去,如在光線條件充足的條件下的正面照、側(cè)面照片,以便識別時能準(zhǔn)確識別。
5.訪問API接口,上傳圖片的URL。
6.獲取返回的信息數(shù)據(jù)
7.操作返回的信息數(shù)據(jù)
利用百度云實現(xiàn)人臉識別的核心代碼如下:
import cv2
import urllib.request
import base64
import time
#百度人臉識別API賬號信息
APP_ID = ‘添加自己創(chuàng)建的百度APPID
API_KEY = ‘添加自己創(chuàng)建的百度API Key
SECRET_KEY =添加自己創(chuàng)建的百度secret key ‘
client = AipFace(APP_ID, API_KEY, SECRET_KEY)#創(chuàng)建一個客戶端用以訪問百度云
#圖像編碼方式
IMAGE_TYPE=BASE64
def go_api(image):
result = client.search(str(image, ‘utf-8), IMAGE_TYPE, GROUP);
if result[‘error_msg] == ‘SUCCESS:
name = result[‘result][‘user_list][0][‘user_id]
score = result[‘result][‘user_list][0][‘score]
if score > 80:#如果相似度大于80
if name == ‘zhangsan:
print(“歡迎%s !” % name)
time.sleep(3)
return 1
else:
print(“對不起,我不認(rèn)識你!”)
name = ‘Unknow
return 0
while True:
print(‘準(zhǔn)備)
if True:
getimage()#拍照
img = transimage()#轉(zhuǎn)換照片格式
res = go_api(img)#將轉(zhuǎn)換了格式的圖片上傳到百度云
time.sleep(3)
以上兩種方法都可以快速實現(xiàn)人臉識別系統(tǒng)的開發(fā),可識別單張,多張人臉圖片。我們可以根據(jù)項目的需要自行選擇一種方法來實現(xiàn)人臉識別,后期我們可以將計算機(jī)視覺庫移值到嵌入式系統(tǒng)中,可以利用計算機(jī)視覺技術(shù)實現(xiàn)監(jiān)控設(shè)備、醫(yī)療設(shè)備、機(jī)器人設(shè)備等產(chǎn)品的開發(fā)。
作者單位:吳友蘭? ? 胡冬琴? ? 石俊峰? ? 北京電子科技職業(yè)學(xué)院
參? 考? 文? 獻(xiàn)
[1]楊軍,張岳,劉燕峰.基于Python語言的數(shù)據(jù)挖掘課程的建設(shè)與研究[J].科技風(fēng),2021(14):80-82.
[2]高雙喜,曹淑服.基于人臉識別的門禁系統(tǒng)設(shè)計[J].河北省科學(xué)院學(xué)報,2012,29(1).
[3]郝立濤,陳書旺,唐鴻武.基于人臉識別的門禁系統(tǒng)設(shè)計[J].河北工業(yè)科技,2009,26(5):339-341.
[4]張玉榮,王強(qiáng)強(qiáng),吳瓊,等. 基于Python-OpenCV圖像處理技術(shù)的小麥不完善粒識別研究[J]. 河南工業(yè)大學(xué)學(xué)報(自然科學(xué)版),2021,42(6):1-13.