祁長興
(沈陽師范大學(xué)軟件學(xué)院,遼寧沈陽 110023)
人臉識(shí)別技術(shù)選取人的面部特征進(jìn)行識(shí)別,與其他生物特征識(shí)別技術(shù)相比,人臉識(shí)別技術(shù)擁有非接觸性與非強(qiáng)制性等優(yōu)勢。在桌面應(yīng)用系統(tǒng)中,基本都會(huì)有基于安全的身份驗(yàn)證登錄系統(tǒng),而設(shè)計(jì)一個(gè)基于人臉識(shí)別的智能登錄系統(tǒng),將人臉識(shí)別技術(shù)與加密技術(shù)相結(jié)合,在保障用戶信息安全的同時(shí),無須每次都手動(dòng)輸入用戶名密碼進(jìn)行校對(duì),無疑會(huì)提供給用戶一個(gè)更便捷的使用方式,提升用戶體驗(yàn)[1]。
OpenCV 即Open Source Computer Vision Library,由英特爾公司發(fā)起并參與開發(fā),是一款開源的跨平臺(tái)計(jì)算機(jī)視覺庫,可以運(yùn)行在Linux、Windows 和Mac OS操作系統(tǒng)上。并提供對(duì)C#等語言的API接口函數(shù),提供了計(jì)算機(jī)視覺中的常見算法實(shí)現(xiàn)。Emgu CV 是OpenCV 在.Net 平臺(tái)下的封裝庫,它允許使用.Net 平臺(tái)兼容的語言,如C#、VB 等使用OpenCV 提供的函數(shù)。它可以被編譯運(yùn)行在Windows 等系統(tǒng)中[2]。EmguCV 完全由基于.Net 平臺(tái)的C#語言編寫。在OpenCV2.4 版本后提供了一個(gè)名為FaceRecognizer 的類來完成人臉識(shí)別功能,其中EigenFaceRecognizer 繼承了FaceRecognizer,并使用主成分分析法來實(shí)現(xiàn)人臉的識(shí)別。SQLite是一款關(guān)系型數(shù)據(jù)庫管理系統(tǒng),引擎并不是通過網(wǎng)絡(luò)與客戶端通信,而是作為客戶端的一部分,與之在同一進(jìn)程空間中運(yùn)行。所以,使用SQLite數(shù)據(jù)庫,可以在編程語言內(nèi)直接通過編程接口操縱數(shù)據(jù)庫,這使得訪問速度加快,同時(shí)降低了系統(tǒng)的復(fù)雜度。SQLite 的數(shù)據(jù)庫信息整體保留在客戶機(jī)的單一文件中,這樣的設(shè)計(jì)可以簡化事務(wù)的實(shí)現(xiàn),SQLite 引擎僅僅需要在事務(wù)開始階段鎖定數(shù)據(jù)庫文件即可達(dá)到目的。
開發(fā)基于OpenCV的人臉識(shí)別模塊并與桌面應(yīng)用軟件的登錄模塊融合,利用生物識(shí)別與SQLite數(shù)據(jù)庫技術(shù),充分發(fā)揮了其在圖像處理與模式識(shí)別方面的優(yōu)勢,能夠以人體生物特征為前提明確被識(shí)別人的身份信息,節(jié)省登錄系統(tǒng)的時(shí)間并提供了操作便利[3-5]。
主成分分析法是一種利用數(shù)學(xué)進(jìn)行降維的方法,它通過眾多變量的線性組合,得到若干綜合變量,并以此來盡可能地表示原來變量的信息,同時(shí)這些綜合變量之間并不相關(guān)。因此,主成分分析法需要找出一種方法,能通過線性變換將原先的可能具有一定相關(guān)性的變量轉(zhuǎn)化為一組新的相互無關(guān)的變量,并且希望這些變量能夠盡量反映原始數(shù)據(jù)的信息[5]。
主成分分析法的計(jì)算步驟:
1)原始指標(biāo)數(shù)據(jù)的標(biāo)準(zhǔn)化采集p維隨機(jī)向量為
其中i=1,2,...,n,n>p,構(gòu)造樣本陣,對(duì)樣本陣元進(jìn)行如下所示的標(biāo)準(zhǔn)化變換:
其中i=1,2,3,...n;j=1,2,3,...p,并且其中
可得到標(biāo)準(zhǔn)化陣Z。
2)對(duì)標(biāo)準(zhǔn)化陣Z求相關(guān)的系數(shù)矩陣:
3)解樣本相關(guān)矩陣R的特征方程:
得p個(gè)特征根,來確定主成分。
計(jì)算m值,使信息的利用率達(dá)到85%以上。對(duì)每個(gè)λj,j=1,2,3,...m,解決方程組,
得到單位特征向量。
將標(biāo)準(zhǔn)化后的指標(biāo)變量轉(zhuǎn)換為主成分:
U1稱為第一主成分,U2稱為第二主成分,…,Up稱為第p主成分。
4)對(duì)m個(gè)主成分進(jìn)行綜合評(píng)價(jià):
對(duì)m 個(gè)主成分進(jìn)行加權(quán)求和后,即得最終評(píng)價(jià)值,權(quán)數(shù)為每個(gè)主成分的方差貢獻(xiàn)率。
在本系統(tǒng)中,首先將人臉圖像轉(zhuǎn)化為一維向量,之后對(duì)樣本數(shù)據(jù)進(jìn)行主成分分析,然后選擇主成分生成子空間,即得到特征臉空間。識(shí)別時(shí)將預(yù)測向量做線性變換,將其投影到人臉子空間中去,然后依據(jù)其與訓(xùn)練樣本的相似程度進(jìn)行識(shí)別。
本系統(tǒng)模塊在Windows 平臺(tái)運(yùn)行,以攝像頭作為輸入設(shè)備,在客戶端安裝有OpenCV及SQLite數(shù)據(jù)庫,并與傳統(tǒng)的登錄模塊的輸入用戶名密碼的驗(yàn)證方式配合使用。作為在.Net平臺(tái)下的一個(gè)獨(dú)立應(yīng)用,可以整合到其他在.Net 平臺(tái)下的桌面應(yīng)用系統(tǒng)中。系統(tǒng)對(duì)文件進(jìn)行加密和解密操作,文件被加密后只能在本機(jī)上被解密,加密使用DES 對(duì)稱加密算法,編寫專門函數(shù)實(shí)現(xiàn)加密和解密過程,而加密密鑰和解密密鑰就是用戶的登錄密碼。用戶人臉數(shù)據(jù)可以被重置。用戶可以自由在人臉登錄和輸入用戶密碼登錄之間選擇切換。通過人臉識(shí)別程序,進(jìn)行機(jī)器學(xué)習(xí)后將登錄用戶人臉信息保存在客戶端文件中,當(dāng)用戶登錄時(shí)可以直接通過人臉識(shí)別實(shí)現(xiàn)用戶登錄。當(dāng)人臉識(shí)別失敗無法登錄時(shí),可以切換到輸入用戶名密碼登錄模式[6-8]。
在SQLite 數(shù)據(jù)庫中設(shè)計(jì)兩個(gè)表,user 表保存用戶信息,settings表保存面部識(shí)別過程中的參數(shù)信息。
系統(tǒng)間模塊依賴圖如圖1,各模塊的詳細(xì)功能如下:
圖1 系統(tǒng)模塊分解圖
1)FaceLocker.Core:提供人臉識(shí)別功能和文件加密功能的實(shí)現(xiàn),系統(tǒng)大部分組件都依賴于它完成人臉檢測和識(shí)別功能。本模塊是系統(tǒng)中實(shí)現(xiàn)難度最大的一部分,模塊的研發(fā)思路是向外提供三個(gè)接口,一個(gè)工廠類與一個(gè)參數(shù)類。
FaceLocker.Core模塊類圖如圖2所示。
圖2 FaceLocker.Core模塊類圖
FaceDetector 類實(shí)現(xiàn)了IFaceDetector 接口,F(xiàn)aceRecognizer 類實(shí)現(xiàn)了IFaceRecognizer 接口,F(xiàn)ileEncoderAndDecoder 類實(shí)現(xiàn)了IFileEncoderAndDecoder 接口,CoreServiceFactory類實(shí)現(xiàn)了獲得以上各接口實(shí)例的方法(內(nèi)部使用BackgroundWorker 異步執(zhí)行識(shí)別器的訓(xùn)練任務(wù),界面上顯示一個(gè)進(jìn)度條,提示用戶耐心等待)。
2)FaceLocker.Database:模塊提供了系統(tǒng)數(shù)據(jù)保存與獲取的接口,屏蔽了數(shù)據(jù)存儲(chǔ)的底層實(shí)現(xiàn),使得系統(tǒng)實(shí)現(xiàn)策略更加靈活。本模塊實(shí)現(xiàn)對(duì)數(shù)據(jù)的存取功能,向外提供兩個(gè)接口和一個(gè)工廠類,屏蔽了模塊內(nèi)的實(shí)現(xiàn)細(xì)節(jié),提高了系統(tǒng)的可擴(kuò)展性。
3)FaceLocker:模塊是系統(tǒng)前端模塊,提供與用戶交互的接口與功能導(dǎo)航。此模塊組織系統(tǒng)操作流程。
4)FaceLocker.ShellExtension:提供Windows 外殼擴(kuò)展功能,包括上下文菜單和文件圖標(biāo)。本模塊提供多種外殼擴(kuò)展,用于將本系統(tǒng)與Windows資源管理器相集成。
圖3 FaceLocker模塊窗體類圖
1)BaseForm窗體:相當(dāng)于一個(gè)窗體容器或模板,為其他窗體(ProgressBarForm除外)提供一致的界面外觀和操作體驗(yàn),其他窗體在BaseForm之上實(shí)現(xiàn)自身功能。
2)MainForm窗體為系統(tǒng)主窗體,系統(tǒng)啟動(dòng)時(shí)創(chuàng)建并顯示的窗體,用戶在本窗體中進(jìn)行人臉信息的采集。如果已經(jīng)完成過信息采集,默認(rèn)為進(jìn)行人臉識(shí)別登錄。用戶可以在本窗體選擇重置用戶信息,重新進(jìn)行用戶的人臉信息采集。
3)LoginForm 窗體為登錄窗體,初始化時(shí)輸入用戶和密碼。
4)SystemInitialForm 窗體為系統(tǒng)初始化窗體,用于初始化系統(tǒng)后臺(tái)數(shù)據(jù),建立人臉信息與用戶登錄時(shí)用戶名和密碼之間的關(guān)聯(lián)關(guān)系。
5)ChangePasswordForm窗體用于用戶修改密碼。
6)ProgressBarForm 窗體,用于后臺(tái)執(zhí)行耗時(shí)任務(wù)時(shí),請(qǐng)用戶耐心等待。
1)用戶信息初始化。當(dāng)系統(tǒng)啟動(dòng)MainForm 窗體時(shí),首先進(jìn)行初始化操作,包括輸入用戶名,密碼,并進(jìn)行多次的用戶人臉圖像采集,后臺(tái)進(jìn)行機(jī)器學(xué)習(xí)過程最終確認(rèn)人臉信息,采集次數(shù)至少應(yīng)該為10次,采集次數(shù)越多,理論上準(zhǔn)確度越高,使用OpenCV進(jìn)行人臉識(shí)別準(zhǔn)確度可以達(dá)到99%以上。采集成功后運(yùn)行后臺(tái)初始化處理進(jìn)程,將用戶的人臉信息保存在本地SQLite數(shù)據(jù)庫中[10-12]。
2)用戶登錄。如果已經(jīng)初始化過,用戶通過攝像頭采集人臉信息,系統(tǒng)將新采集的面部信息與初始化的信息進(jìn)行校驗(yàn)則進(jìn)行人臉識(shí)別登錄,如果登錄失敗,給出提示信息,并可以選擇重新輸入識(shí)別或切換到人工輸入用戶密碼窗體登錄,登錄成功則進(jìn)入桌面應(yīng)用系統(tǒng)主窗體。
3)用戶信息重置。用戶重新采集人臉信息,并輸入用戶密碼,也可以修改登錄的密碼。
初始化后建立人臉信息和登錄用戶的關(guān)聯(lián)關(guān)系。
本文采用OpenCV 的人臉識(shí)別的技術(shù),主成分分析法來降維保存人臉信息。文中對(duì)實(shí)現(xiàn)的設(shè)計(jì)思想,功能組成,執(zhí)行過程以及實(shí)現(xiàn)過程做了詳細(xì)的闡述,程序滿足了在桌面應(yīng)用系統(tǒng)中基于人臉識(shí)別的登錄,并與使用用戶名和密碼登錄融合,實(shí)現(xiàn)了登錄的安全控制。模塊可以作為一個(gè)獨(dú)立組件整合到其他基于.Net 的桌面應(yīng)用系統(tǒng)中[13]。同時(shí)由于OpenCV 也提供了面向移動(dòng)應(yīng)用的接口,所以將此技術(shù)擴(kuò)展到移動(dòng)App中是下一步學(xué)習(xí)和實(shí)現(xiàn)的方向。