祁長興
(沈陽師范大學軟件學院,遼寧沈陽 110023)
人臉識別技術選取人的面部特征進行識別,與其他生物特征識別技術相比,人臉識別技術擁有非接觸性與非強制性等優(yōu)勢。在桌面應用系統(tǒng)中,基本都會有基于安全的身份驗證登錄系統(tǒng),而設計一個基于人臉識別的智能登錄系統(tǒng),將人臉識別技術與加密技術相結合,在保障用戶信息安全的同時,無須每次都手動輸入用戶名密碼進行校對,無疑會提供給用戶一個更便捷的使用方式,提升用戶體驗[1]。
OpenCV 即Open Source Computer Vision Library,由英特爾公司發(fā)起并參與開發(fā),是一款開源的跨平臺計算機視覺庫,可以運行在Linux、Windows 和Mac OS操作系統(tǒng)上。并提供對C#等語言的API接口函數,提供了計算機視覺中的常見算法實現。Emgu CV 是OpenCV 在.Net 平臺下的封裝庫,它允許使用.Net 平臺兼容的語言,如C#、VB 等使用OpenCV 提供的函數。它可以被編譯運行在Windows 等系統(tǒng)中[2]。EmguCV 完全由基于.Net 平臺的C#語言編寫。在OpenCV2.4 版本后提供了一個名為FaceRecognizer 的類來完成人臉識別功能,其中EigenFaceRecognizer 繼承了FaceRecognizer,并使用主成分分析法來實現人臉的識別。SQLite是一款關系型數據庫管理系統(tǒng),引擎并不是通過網絡與客戶端通信,而是作為客戶端的一部分,與之在同一進程空間中運行。所以,使用SQLite數據庫,可以在編程語言內直接通過編程接口操縱數據庫,這使得訪問速度加快,同時降低了系統(tǒng)的復雜度。SQLite 的數據庫信息整體保留在客戶機的單一文件中,這樣的設計可以簡化事務的實現,SQLite 引擎僅僅需要在事務開始階段鎖定數據庫文件即可達到目的。
開發(fā)基于OpenCV的人臉識別模塊并與桌面應用軟件的登錄模塊融合,利用生物識別與SQLite數據庫技術,充分發(fā)揮了其在圖像處理與模式識別方面的優(yōu)勢,能夠以人體生物特征為前提明確被識別人的身份信息,節(jié)省登錄系統(tǒng)的時間并提供了操作便利[3-5]。
主成分分析法是一種利用數學進行降維的方法,它通過眾多變量的線性組合,得到若干綜合變量,并以此來盡可能地表示原來變量的信息,同時這些綜合變量之間并不相關。因此,主成分分析法需要找出一種方法,能通過線性變換將原先的可能具有一定相關性的變量轉化為一組新的相互無關的變量,并且希望這些變量能夠盡量反映原始數據的信息[5]。
主成分分析法的計算步驟:
1)原始指標數據的標準化采集p維隨機向量為
其中i=1,2,...,n,n>p,構造樣本陣,對樣本陣元進行如下所示的標準化變換:
其中i=1,2,3,...n;j=1,2,3,...p,并且其中
可得到標準化陣Z。
2)對標準化陣Z求相關的系數矩陣:
3)解樣本相關矩陣R的特征方程:
得p個特征根,來確定主成分。
計算m值,使信息的利用率達到85%以上。對每個λj,j=1,2,3,...m,解決方程組,
得到單位特征向量。
將標準化后的指標變量轉換為主成分:
U1稱為第一主成分,U2稱為第二主成分,…,Up稱為第p主成分。
4)對m個主成分進行綜合評價:
對m 個主成分進行加權求和后,即得最終評價值,權數為每個主成分的方差貢獻率。
在本系統(tǒng)中,首先將人臉圖像轉化為一維向量,之后對樣本數據進行主成分分析,然后選擇主成分生成子空間,即得到特征臉空間。識別時將預測向量做線性變換,將其投影到人臉子空間中去,然后依據其與訓練樣本的相似程度進行識別。
本系統(tǒng)模塊在Windows 平臺運行,以攝像頭作為輸入設備,在客戶端安裝有OpenCV及SQLite數據庫,并與傳統(tǒng)的登錄模塊的輸入用戶名密碼的驗證方式配合使用。作為在.Net平臺下的一個獨立應用,可以整合到其他在.Net 平臺下的桌面應用系統(tǒng)中。系統(tǒng)對文件進行加密和解密操作,文件被加密后只能在本機上被解密,加密使用DES 對稱加密算法,編寫專門函數實現加密和解密過程,而加密密鑰和解密密鑰就是用戶的登錄密碼。用戶人臉數據可以被重置。用戶可以自由在人臉登錄和輸入用戶密碼登錄之間選擇切換。通過人臉識別程序,進行機器學習后將登錄用戶人臉信息保存在客戶端文件中,當用戶登錄時可以直接通過人臉識別實現用戶登錄。當人臉識別失敗無法登錄時,可以切換到輸入用戶名密碼登錄模式[6-8]。
在SQLite 數據庫中設計兩個表,user 表保存用戶信息,settings表保存面部識別過程中的參數信息。
系統(tǒng)間模塊依賴圖如圖1,各模塊的詳細功能如下:

圖1 系統(tǒng)模塊分解圖
1)FaceLocker.Core:提供人臉識別功能和文件加密功能的實現,系統(tǒng)大部分組件都依賴于它完成人臉檢測和識別功能。本模塊是系統(tǒng)中實現難度最大的一部分,模塊的研發(fā)思路是向外提供三個接口,一個工廠類與一個參數類。
FaceLocker.Core模塊類圖如圖2所示。

圖2 FaceLocker.Core模塊類圖
FaceDetector 類實現了IFaceDetector 接口,FaceRecognizer 類實現了IFaceRecognizer 接口,FileEncoderAndDecoder 類實現了IFileEncoderAndDecoder 接口,CoreServiceFactory類實現了獲得以上各接口實例的方法(內部使用BackgroundWorker 異步執(zhí)行識別器的訓練任務,界面上顯示一個進度條,提示用戶耐心等待)。
2)FaceLocker.Database:模塊提供了系統(tǒng)數據保存與獲取的接口,屏蔽了數據存儲的底層實現,使得系統(tǒng)實現策略更加靈活。本模塊實現對數據的存取功能,向外提供兩個接口和一個工廠類,屏蔽了模塊內的實現細節(jié),提高了系統(tǒng)的可擴展性。
3)FaceLocker:模塊是系統(tǒng)前端模塊,提供與用戶交互的接口與功能導航。此模塊組織系統(tǒng)操作流程。
4)FaceLocker.ShellExtension:提供Windows 外殼擴展功能,包括上下文菜單和文件圖標。本模塊提供多種外殼擴展,用于將本系統(tǒng)與Windows資源管理器相集成。

圖3 FaceLocker模塊窗體類圖
1)BaseForm窗體:相當于一個窗體容器或模板,為其他窗體(ProgressBarForm除外)提供一致的界面外觀和操作體驗,其他窗體在BaseForm之上實現自身功能。
2)MainForm窗體為系統(tǒng)主窗體,系統(tǒng)啟動時創(chuàng)建并顯示的窗體,用戶在本窗體中進行人臉信息的采集。如果已經完成過信息采集,默認為進行人臉識別登錄。用戶可以在本窗體選擇重置用戶信息,重新進行用戶的人臉信息采集。
3)LoginForm 窗體為登錄窗體,初始化時輸入用戶和密碼。
4)SystemInitialForm 窗體為系統(tǒng)初始化窗體,用于初始化系統(tǒng)后臺數據,建立人臉信息與用戶登錄時用戶名和密碼之間的關聯關系。
5)ChangePasswordForm窗體用于用戶修改密碼。
6)ProgressBarForm 窗體,用于后臺執(zhí)行耗時任務時,請用戶耐心等待。
1)用戶信息初始化。當系統(tǒng)啟動MainForm 窗體時,首先進行初始化操作,包括輸入用戶名,密碼,并進行多次的用戶人臉圖像采集,后臺進行機器學習過程最終確認人臉信息,采集次數至少應該為10次,采集次數越多,理論上準確度越高,使用OpenCV進行人臉識別準確度可以達到99%以上。采集成功后運行后臺初始化處理進程,將用戶的人臉信息保存在本地SQLite數據庫中[10-12]。
2)用戶登錄。如果已經初始化過,用戶通過攝像頭采集人臉信息,系統(tǒng)將新采集的面部信息與初始化的信息進行校驗則進行人臉識別登錄,如果登錄失敗,給出提示信息,并可以選擇重新輸入識別或切換到人工輸入用戶密碼窗體登錄,登錄成功則進入桌面應用系統(tǒng)主窗體。
3)用戶信息重置。用戶重新采集人臉信息,并輸入用戶密碼,也可以修改登錄的密碼。
初始化后建立人臉信息和登錄用戶的關聯關系。
本文采用OpenCV 的人臉識別的技術,主成分分析法來降維保存人臉信息。文中對實現的設計思想,功能組成,執(zhí)行過程以及實現過程做了詳細的闡述,程序滿足了在桌面應用系統(tǒng)中基于人臉識別的登錄,并與使用用戶名和密碼登錄融合,實現了登錄的安全控制。模塊可以作為一個獨立組件整合到其他基于.Net 的桌面應用系統(tǒng)中[13]。同時由于OpenCV 也提供了面向移動應用的接口,所以將此技術擴展到移動App中是下一步學習和實現的方向。