張綠云 韋肖雨 李琳
摘要:該文中的人臉識別系統(tǒng)是利用Python語言編程以及使用OpenCV庫調(diào)取攝像頭完成人臉圖像的采集與識別。利用OpenCV庫基于局部特征的人臉?biāo)惴?、Haar-like特征以及人臉檢測器模型級聯(lián)分類器對給定的人臉圖像進(jìn)行檢測訓(xùn)練分析,從而獲取匹配度最高的臉部特征數(shù)據(jù)信息,進(jìn)而實(shí)現(xiàn)人臉識別。
關(guān)鍵詞:Python;OpenCV;人臉檢測;人臉識別
中圖分類號:TP311? ? ? ? 文獻(xiàn)標(biāo)識碼:A
文章編號:1009-3044(2022)10-0087-02
隨著信息化時代快速發(fā)展,人們的個人信息安全面臨威脅,人們急需尋找有效的身份驗(yàn)證途徑,過去通過使用證件驗(yàn)證身份信息已不適用于現(xiàn)在高科技快速發(fā)展的時代。通過專家的不斷研究,作為全新的身份識別技術(shù)出現(xiàn)的生物識別慢慢成為信息化時代身份識別最主要的技術(shù)。生物識別技術(shù)主要是通過一些生物特征去實(shí)現(xiàn)的識別技術(shù),例如:人臉、指紋等,這樣的特征不容易被偽造。人臉識別是生物識別技術(shù)的一種,占有極為重要的地位,應(yīng)用領(lǐng)域廣泛。
1 人臉識別系統(tǒng)實(shí)現(xiàn)原理
(1) 加載目標(biāo)檢測模塊CascadeClassifier。CascadeClassifier是OpenCV下objdect模塊中用來做目標(biāo)檢測的級聯(lián)分類器的一個類,支持Haar-like特征的目標(biāo)檢測器。
face =cv2.CascadeClassifier('./face/face_xml/haarcascade_ frontalface_default.xml');
(2) 調(diào)用攝像頭,轉(zhuǎn)換灰度圖片。通過調(diào)用VideoCapture函數(shù)調(diào)用電腦的攝像頭cap=cv2.VideoCapture(0,cv2.CAP_DSHOW),把攝像頭拍到的人像通過read()函數(shù)賦給img。在已知img后通過cvtColor()函數(shù)將圖片轉(zhuǎn)換為灰度。gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY),因?yàn)樘卣魈崛♂槍叶葓D像,所以需要進(jìn)行轉(zhuǎn)換。彩色圖像分為R、G、B三個分量表達(dá)三個基色,每一個分量有256個灰度級。通過VideoCapture函數(shù)得到照片,獲取RGB分量值,再通過cvtColor函數(shù)計(jì)算像素灰度值,最后得到灰度圖像。
(3) 訓(xùn)練器的使用?;贚PB創(chuàng)建人臉識別特征提取訓(xùn)練器,將訓(xùn)練結(jié)果的模型參數(shù)寫入YML格式文件,該文件是可以直觀地被電腦識別的數(shù)據(jù)序列化格式。進(jìn)行識別時,訓(xùn)練器可直接讀取文件內(nèi)容。LBP是針對圖像局部提取紋理特征的方法。其原理是將已知人臉圖像進(jìn)行預(yù)處理,記錄下相對應(yīng)的人臉圖像的局部特征,記錄每個特征之間的投影向量,寫入數(shù)據(jù)庫。再對未知的人臉進(jìn)行預(yù)處理,使得原始人臉圖像通過之前得到的投影向量向選中的人臉空間做變換,隨后定義一個分類判別函數(shù),該函數(shù)將表述為未知的人臉的圖像的局部特征與之前已經(jīng)記錄好的人臉的數(shù)據(jù)庫中相對應(yīng)的局部特征之間的距離,并且以此距離為依據(jù),計(jì)算出人臉特征最小的分類錯誤率,進(jìn)行特征融合后根據(jù)得到的結(jié)果便可以進(jìn)行有效識別[1]。
(4) PyQt5窗口控件QtWidgets圖形界面的使用。在圖形界面與早時候的命令行界面相比較之下,用戶更喜歡視覺上的簡易明了。編寫該窗口作為人臉識別的載體,在該窗口點(diǎn)擊登錄就可以訪問到用戶在整個人臉識別系統(tǒng)中的所有服務(wù),實(shí)現(xiàn)后續(xù)一系列的功能,圖形界面承擔(dān)了與用戶之間的功能交互。
2 人臉識別開發(fā)工具介紹
OpenCV是一個開放源代碼的計(jì)算機(jī)視覺庫,應(yīng)用在很多領(lǐng)域上并且是可以跨平臺的,但它主要應(yīng)用在計(jì)算機(jī)視覺方向。OpenCV包含有非常多的函數(shù),可以高時效地實(shí)現(xiàn)計(jì)算機(jī)視覺絕大多數(shù)的通用算法[2],其中OpenCV 包含的圖像處理函數(shù)基本上包含了圖像需要處理的每個方面,例如:圖像和視頻的輸入輸出、基本的數(shù)字圖像處理、基本的圖像與視頻顯示矩、各種動態(tài)數(shù)據(jù)結(jié)構(gòu)等[3] 。
OpenCV的類FaceRecognizer提供了三種實(shí)現(xiàn)人臉識別的方法:EigenFace(基于PCA的特征臉?biāo)惴ǎ?、FisherFace(基于LDA的Fisher臉?biāo)惴ǎ?、LBPHFace(基于局部特征的人臉識別算法) [4]。本次人臉識別的方法是用LBPHFace實(shí)現(xiàn)的,系統(tǒng)是使用Python實(shí)現(xiàn),Python調(diào)用OpenCV,OpenCV調(diào)用C++接口,接口調(diào)用攝像頭驅(qū)動才打開攝像頭。
Numpy庫是標(biāo)準(zhǔn)的數(shù)據(jù)處理分析工具,是Python實(shí)現(xiàn)數(shù)據(jù)排列、矢量計(jì)算以及高效率的計(jì)算分析工作的幫助工具。Numpy庫的最主要作用是分析基本的數(shù)據(jù),沒有包括其他什么高級的功能。盡管如此,只要能掌握好Numpy庫的理論知識和應(yīng)用,也能夠很好地將其分析數(shù)據(jù)的作用優(yōu)勢發(fā)揮到極致[5]。
3 人臉識別的實(shí)現(xiàn)過程
3.1 人臉識別系統(tǒng)的基本框架設(shè)計(jì)
人臉識別系統(tǒng)的框架設(shè)計(jì)模式根據(jù)人體交互的原理實(shí)現(xiàn),操作簡易明了,本次人臉識別通過使用OpenCV調(diào)用攝像頭實(shí)現(xiàn)人臉識別。
(1) 登錄模塊:圖形界面登錄模塊是實(shí)現(xiàn)人臉識別系統(tǒng)用戶間交互的關(guān)鍵,登錄成功進(jìn)去后可以實(shí)現(xiàn)各功能,否則將無法實(shí)現(xiàn)人臉識別。
(2) 采集人臉:首先添加檢測人臉的id和姓名,使輸入的信息與待檢測的人臉信息綁定,同時加載好haarcascade_frontalface_default.xml檢測臉的模型,用于功能訓(xùn)練。使用OpenCV調(diào)取攝像頭檢測人臉需確保能檢測到人臉。檢測到的人臉需用矩形框框起來從而保證采集到的圖像坐標(biāo)大小都一樣,并且需要檢測多次才能確定人臉信息,同時設(shè)置好時間間隔獲取每一幀圖像并將圖像轉(zhuǎn)換成灰度圖片并保存到facedata文件夾里。
(3) 訓(xùn)練/學(xué)習(xí):通過使用已經(jīng)加載好的人臉訓(xùn)練器對facedata文件夾里人臉信息進(jìn)行人臉訓(xùn)練學(xué)習(xí),首先對人臉特征進(jìn)行提取,然后將所獲取的人臉特征保存到.yml文件里,以便識別人臉時特征比對。
(4) 人臉識別:首先調(diào)用攝像頭確保人臉在攝像頭范圍內(nèi),讓攝像頭能捕獲到人臉,先設(shè)置好時間間隔獲取每一幀圖像且要同時把它轉(zhuǎn)換成灰度圖像。再創(chuàng)建一個訓(xùn)練器以及加載臉的加載器,本文使用 LBP局部二值直方圖的算法和加載器對捕獲的圖片確保為人臉,若檢測到的是人臉,則用與采集人臉時一樣大小的矩形框框起來,方便人臉的特征進(jìn)行比對。將捕獲的人臉圖像特征與.yml文件里保存的人臉數(shù)據(jù)特征進(jìn)行遍歷對比識別得到一個相似度,再根據(jù)相似度得出匹配度最高的圖片的人臉數(shù)據(jù)信息,最后將匹配度最高的結(jié)果名字輸出在屏幕上識別出的圖像矩形框左上角,根據(jù)圖像直觀地知道識別輸出的名字是否與匹配的圖像人臉正確。
3.2 實(shí)現(xiàn)過程
(1) 獲取人臉信息
為了提高準(zhǔn)確度和方便后續(xù)訓(xùn)練,將獲取到的圖像轉(zhuǎn)化為灰度圖像。在采集人臉圖像時要規(guī)定好圖像的大小規(guī)格,只需要采集臉部的信息,不需要采集太多無用的元素,使用detectMultiScale函數(shù)采集人臉。
(2) 保存人臉信息
在獲取圖像并且規(guī)定好人臉圖像的大小規(guī)格后,將截好的人臉圖像保存在一個文件中。輸入圖像人物ID、姓名,文件夾中的圖片以ID號加第N張照片數(shù)加姓名的方式保存。
cv2.imwrite("./photo/."+ str(user_id) + '.' + str(count) + '.' + str(photo_name) +'.'+"jpg",gray[y:y+h,x:x+w])
(3) 建立人臉識別模型
OpenCV庫中的人臉檢測器模型級聯(lián)分類器,也就是所說的目標(biāo)檢測模塊通過調(diào)用CasedeClassifier類,將已經(jīng)存在的數(shù)據(jù)集合訓(xùn)練生成人臉識別模型,用haarcascade_frontalface_default.xml文件生成一個臉部的級聯(lián)分類器,除臉部外還可以有眼睛或者微笑等不同的文件。
(4) 創(chuàng)建訓(xùn)練器
創(chuàng)建人臉識別特征提取訓(xùn)練器,將圖像轉(zhuǎn)化為數(shù)據(jù)。在圖片訓(xùn)練之前對圖像進(jìn)行預(yù)處理,調(diào)用OpenCV中的cv2.face.LBPFaceRecognizer_Create(),將采集到的圖像信息進(jìn)行歸一化處理,保持人臉圖像的尺寸和色彩對比度的統(tǒng)一。
(5) 對圖像進(jìn)行訓(xùn)練
創(chuàng)建好訓(xùn)練器后,通過把之前收集并且處理的圖像的路徑進(jìn)行拼接,通過逐張?jiān)L問的方式,將id轉(zhuǎn)換成數(shù)組,圖像轉(zhuǎn)換成格式長度為8位的數(shù)據(jù)矩陣,接著調(diào)用train()函數(shù)對數(shù)據(jù)進(jìn)行訓(xùn)練,后再將訓(xùn)練數(shù)據(jù)寫入可以被電腦識別的數(shù)據(jù)序列化的.yml文件。
(6) 識別圖像
主要調(diào)用LBPFaceRecognizer訓(xùn)練器的predict()預(yù)測函數(shù),返回標(biāo)簽值id和樣本的相似值。若返回標(biāo)簽值為-1,說明測試的樣本在訓(xùn)練集中無對應(yīng)或者距離比較遠(yuǎn)。
id, con = recognier.predict(gray[y:y+h, x:x+w])
在識別界面中可以顯示識別圖像的id或者相似值,如果需要出現(xiàn)圖像中的任務(wù)的姓名,則需要在預(yù)測函數(shù)中得到id后與經(jīng)過分割函數(shù)把圖像路徑中分割出來的id進(jìn)行比對,通過相等的id就可以再次使用分割函數(shù)把路徑中的姓名分割出來,識別界面中顯示姓名。
4 實(shí)驗(yàn)結(jié)果分析
本次實(shí)驗(yàn)通過調(diào)用攝像頭獲取圖像,通過下載目標(biāo)檢測模塊類,加載臉部Haar-like特征的文件信息以及創(chuàng)建并且使用LBPFaceRecongizer訓(xùn)練器,將其結(jié)合搭建一個基于OpenCV的人臉系統(tǒng),進(jìn)行圖像采集、訓(xùn)練和識別測試。在實(shí)驗(yàn)過程中發(fā)現(xiàn)存在一些問題還需要進(jìn)一步完善,例如采集的圖像的分辨率若較低在檢測和識別時仍會出現(xiàn)偏差,采集的照片為正臉時采集準(zhǔn)確率較高,如果頭部稍微偏移的圖像準(zhǔn)確率會變低,多人出現(xiàn)在鏡頭時識別的辨識度會飄忽不定等,如何減小以上問題對圖像檢測的影響將成為研究的重點(diǎn)。
參考文獻(xiàn):
[1] 龍海強(qiáng).基于深度學(xué)習(xí)的人臉識別算法[D].廣州:廣東工業(yè)大學(xué),2016.
[2] 魏天琪.基于Python的人臉識別技術(shù)研究[J].信息與電腦(理論版),2021,33(2):162-164.
[3] 張齊.圖像處理系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)[D].南京:南京郵電大學(xué),2018.
[4] 卜秋月.基于OpenCV的人臉識別系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)[D].長春:吉林大學(xué),2015.
[5] 周競鴻.基于Python語言的大數(shù)據(jù)分析研究[J].電子技術(shù)與軟件工程,2020(13):178-179.
【通聯(lián)編輯:代影】
收稿日期:2021-08-12
基金項(xiàng)目:2021年廣西高校中青年教師科研基礎(chǔ)能力提升項(xiàng)目“深度學(xué)習(xí)下的人臉識別技術(shù)研究”(項(xiàng)目編號:2021KY0619)
作者簡介:張綠云(1987—),女,湖南祁陽人,講師,研究生,主要從事計(jì)算機(jī)視覺、圖像識別研究。