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