,,
(上海工程技術大學 電子電氣工程學院,上海 201620)
21世紀是科技飛速發展的時代,科學技術已經深深影響著人們的日常生活,并給人們帶來的極大便利。但是凡事有利有弊,高科技也帶來了很多不安全的因素,例如使用高科技手段進行偷盜、搶劫和間諜等犯罪行為日益增多。傳統門禁系統利用密碼、磁卡等驗證身份,已經不能滿足現代安防的需求。因此建立一個具有更安全、更可靠、更便捷的身份識別的門禁系統來解決日益嚴重的安全問題就顯得尤為重要[1]。
生物識別技術,特別是人臉識別技術以及移動開發技術的發展使得將人臉識別技術和移動開發技術應用到門禁系統中成為可能。本文主要通過研究人臉識別技術以及Android技術,并將其應用到門禁系統設備上,完成門禁系統的設計,從而實現提高門禁系統的安全性的目的[2-3]。
整個門禁系統工作原理如圖1所示,用戶在手機客戶端下載安裝本文設計的門禁APP后進行注冊,注冊時填寫本人身份信息(用戶名,姓名,身份證號和手機號),并從本地上傳本人清晰的人臉照片,這些數據都是由服務器保存至數據庫。注冊完成后登錄到主界面,點擊人臉識別模塊,手機攝像頭開啟拍攝用戶人臉照片上傳至服務器并與保存在數據庫的人臉作比對,如果比對成功服務器將會發送二維碼到手機端,其中二維碼中的信息就是用戶的身份證號以及手機號,用戶用此二維碼放在二維碼掃描器上進行掃描,掃描器讀取到二維碼的信息后傳至門禁控制器,門禁控制器將此信息傳送至后臺服務器,服務器將此信息與數據庫中保存的二維碼信息作比對,如果比對成功則發送開門信號給門禁控制器,門禁控制器驅動磁力鎖開門。

圖1 門禁系統的工作原理圖
1)灰度化:為了使后續的圖像的計算量變得少一些,需要將手機拍攝的彩色圖像轉變為灰度圖像。灰度圖像與彩色圖像所描述的一樣反映了整幅圖像的整體與局部的色度和亮度等級的分布和特征,本文對彩色的圖像進行灰度化處理直接采用的是OpenCV中的灰度算法[4]。
2)直方圖均衡化:通過使用累積函數對灰度值進行“調整”以實現對比度的增強減少由于光照、噪聲等因素對圖像的質量的影響[5]。
Adaboost算法是目前最常用的人臉檢測算法之一,它與與Haar特征相結合,可以將一個弱學習算法提升為一個強學習算法。Haar特征通常是由2到4個矩形組成,分別用來檢測邊界、細線和對角線特征。Haar特征值計算方法是白色矩形像素和與黑色矩形像素和的差值。為了減少特征值計算量,一般使用積分圖來計算圖像的Haar特征。通過 Adaboost 算法挑選數千個有效的haar特征來組成人臉檢測器。
Adaboost人臉檢測方法具體過程如下:對每個特征fj,訓練成一個弱分類器:
(1)
其中:θj表示閾值,pj表示不等號的方向,x則代表一個子窗口。
為了提高檢測效率,需要篩選出分類效果比較好的少量矩形特征的集合,進行T輪迭代,每輪篩選出一個分類誤差最小的分類器ht。更新樣本的權值,給分類錯誤的樣本賦予比較高的權值,這樣下一輪迭代中篩選出來的分類器將錯誤樣本分類正確的可能性就提高了。在新的樣本分布下,繼續迭代。經過T次循環就得到T個弱分類器,將T個弱分類器按照一定的權值疊加,得到了一個強分類器。再將多個強分類器連接起來,得到了Adaboost級聯分類器[6]。
在圖像處理時,因數據量太大,通常需要降低數據的維數,但又希望保留貢獻大的特征數據,而PCA就是保留主要成分的降維算法,因此本文采用的人臉識別方法是目前比較流行的特征臉方法,也被稱作PCA方法,其具體過程如下。
1)首先讀取訓練集下指定個數的圖像,將人臉像素值保存到一個二維數組中,將該數組按列排成列向量,即每一列表示一張圖像的像素信息,列數代表一共有多少張人臉圖像。如果有S張人臉圖像,則X=[MN,S];
2)計算每一行的均值,再把每行的元素與均值相減,就得到了每張人臉與平人臉的差值,組成新矩陣X;
3)計算X的協方差矩陣C,大小為MN*MN;
4)計算出C的特征值與特征向量,共有MN個特征值,對應于MN個特征向量;
5)選擇主成分,將特征值按照從大到小的順序排列,選出前R個特征值并且這R個特征值占所有特征值比例90%以上,再將對應的特征向量按行排列,則特征空間P=[R,MN];
6)將訓練集投影到特征空間,Y=PX=[R,S];
7)將測試集也投影到該特征空間,假設測試集有Q張圖像,那么降維后的矩陣為[R,Q];
8)利用歐氏距離法求出每一張圖像[R,1]與特征空間[R,S]最相近的一個圖像,識別為該類。所有測試集完成以后,最后求出識別概率。
特征臉方法經過K-L變換后由原來的高緯度向量轉換成低緯度向量子空間,達到了非常好的降維效果,簡單有效,而且其運算復雜度低識別速度快,同時易于實現,識別率高,在人臉識別這一塊得到了廣泛的應用[7]。
本文設計的人臉識別門禁系統分為硬件系統和軟件系統,主要由移動手機端、門禁端和后臺服務器端構成。移動客戶端采用Android系統的移動設備,主要進行人臉注冊、人臉識別和獲取二維碼;門禁端主要功能是掃描用戶二維碼,接收來自服務器端的身份驗證信息和控制開關門;服務器端主要是進行人臉照片圖像識別,發送二維碼給用戶手機端,并且接收門禁端發送來的二維碼,并驗證用戶二維碼中的信息成功后,發送開門的指令。
硬件系統主要包括移動客戶端設備(主要是Android手機),服務器和門禁端設備。門禁端設備有:二維碼掃描器、門禁控制器、磁力鎖和電源箱, 其中門禁端設備功能如下:
二維碼掃描器:負責將讀取的二維碼中的信息傳送給門禁控制器處理。
門禁控制器:是門禁端的核心部件,負責整個門禁端輸入、輸出信息的處理和存儲、控制,并且與服務器端進行通信。
磁力鎖:與門禁控制器相連,是門禁系統的執行部件,系統通過對二維碼權限的判斷,決定是否打開門鎖。
電源箱:與門禁控制器相連,負責整個系統的正常供電。
3.2.1 系統總體模塊結構
本軟件系統由前臺移動客戶端軟件,后臺管理員端軟件組成,主要功能模塊包括注冊登錄模塊、人臉識別模塊、獲取二維碼以及管理員模塊,系統總體模塊結構如圖2所示。

圖2 系統總體模塊結構圖
3.2.2 系統各模塊的功能
移動客戶端軟件在Android開發平臺上,采用Java語言進行開發,與服務器端軟件的通信采用Web Service。本文設計的門禁APP主要提供用戶注冊(包括用戶身份信息的注冊和人臉信息的注冊)、登錄、人臉識別以及獲取二維碼的功能。
后臺服務器:服務器端采用MVC設計模式進行設計,將系統分為模型層、邏輯層和表現層,主要負責進行圖像的人臉識別,用戶身份驗證,與客戶端和門禁端進行通信。
3.2.3 人臉檢測與識別模塊的設計
人臉檢測與識別模塊的功能主要是對檢測到的樣本圖像進行預處理(灰度化、直方圖均衡化)、人臉檢測、特征提取以及識別,整個模塊流程圖如圖3所示。

圖3 人臉檢測識別模塊流程圖
3.2.4 數據庫設計
本系統設計的數據庫有三張表,分別是用戶信息表、人臉信息表和二維碼信息表,用戶信息表中的字段有用戶id、用戶名、姓名、身份證號和手機號,人臉信息表字段有用戶id、圖片對應路徑和分配的人臉圖片編號,二維碼信息表字段有用戶id、身份證號和手機號。本系統采用的數據庫為SQLServer,訪問數據的操作由服務器端完成,服務器端通過JDBC與數據庫連接,進行數據庫訪問。移動客戶端通過SQAP協議調用Web Service與服務器端進行數據的交互,服務器端接收到調用命令后,進行相應的處理并將處理的結果返回給客戶端。
硬件系統采用ACM68-LAN系列門禁控制器、中控多門控制電源箱、MCM-MS100系列二維碼掃描器和280 KG雙門磁力鎖,以及Android手機。
4.2.1 開發環境的搭建
本文設計的門禁APP軟件是采用Android技術進行開發,Android應用程序是用Java語言進行開發的。因此,在Windows系統下,需要安裝Android Studio開發環境。
由于本應用程序中涉及到大量的圖像處理,本文采用JNI技術,實現在Java程序中調用外部的C++代碼,以完成相應的功能,例如調用人臉識別相應的算法。在Android平臺下,要實現這樣的功能,需要安裝和配置Android NDK[8]。
4.2.2 OpenCV的應用
OpenCV是Intel資助的開源計算機視覺庫,它主要由一系列C函數和少量C++類構成,同時提供了Python、Ruby、MATLAB等語言的接口,實現了圖像處理和計算機視覺方面的很多通用算法。它可以在Linux操作系統上和Windows操作系統上運行,現在也支持Android操作系統環境開發。本文采用的很多圖像處理就是調用了OpenCV的相應函數,本文下載的是OpenCV-3.2.0-Android-sdk版本[9]。
4.2.3 用戶注冊模塊的實現
注冊頁面的設計,用戶初次登錄門禁APP需要進行注冊,本文人臉圖像選擇的是本地獲取的方式,在獲取到人臉圖像后,程序首先對圖像進行處理(灰度化、直方圖均衡化),再對處理后的圖像進行人臉檢測并將人臉圖片顯示在界面,如圖4,同時服務器將圖片保存在某個目錄中并將文件路徑和分配的編號保存至后臺數據庫的人臉信息表中由管理員統一管理。人臉檢測是直接通過Java端調用detectMultiScale函數來完成的,檢測前需要將OpenCV目錄下的cascade文件加載,先將這個xml文件放在Android工程項目的raw文件夾下,程序運行的時候就將這個文件寫入到該apk運行時創建的項目文件夾中,然后利用OpenCV自帶的cascade加載器對這個訓練文件夾進行加載,加載成功后把這個文件刪除。用戶填寫好身份信息后點擊注冊按鈕,服務器端首先接收到用戶身份信息將其保存至后臺數據庫中的用戶信息表,再從數據庫的人臉信息表中讀取到所有圖片的路徑和編號來進行訓練,最后保存訓練模型方便下次直接調用,其中訓練函數都是寫在JNI層,由Android NDK編譯成動態鏈接庫,再通過java端來調用,訓練部分主要函數如下。
Ptr
model->train(images,labels);//訓練人臉圖片,labels:標簽,
model->save(“Train_model.xml”);//保存訓練模型,供下次直接調用[10]。

圖4 注冊界面
4.2.4 人臉識別模塊的實現
點擊人臉識別按鈕,會進入拍照界面(如圖5所示),系統調用內置相機程序,對返回的照片傳送到JNI層進行處理(灰度化、直方圖均衡化),處理好的圖片傳送到JNI層的識別函數進行識別,識別時首先將圖片傳送給矩陣,然后加載保存的訓練模型,最后返回一個整數值,此時如果返回的整數值對應于訓練模型中的那個label,服務器將根據這個label到后臺數據庫的用戶信息表將這個用戶的身份信息回顯到手機端界面(如圖6所示),當用戶點擊獲取二維碼按鈕便可得到服務器發送過來的二維碼(如圖7所示),二維碼中的信息就是用戶身份證號與手機號以及對應的用戶id,同時服務器將二維碼中的信息保存至數據庫的二維碼信息表中,二維碼將作為刷碼開門的標識。其中識別函數如下。
Jint*cbuf=env->GetIntArrayElements(buf,0);//獲取傳遞過來的人臉圖像;
Mat pic(h,w,CV_8UC4,(unsigned char*)cbuf);//傳遞給矩陣;
Ptr
model->load(“Train_model.xml”);//加載保存的訓練模型;
Int predict=model->predit(pic);//預測人臉[10];

圖5 人臉識別界面 圖6 識別結果

圖7 獲取二維碼
4.2.5 服務器端的實現
服務器端采用JavaEE編程,通過JDBC與數據庫連接,進行數據庫訪問。移動客戶端通過SQAP協議調用Web Service與服務器端進行數據的交互,服務器端接收到調用命令后,進行相應的處理并將處理的結果返回給客戶端。本文后臺服務器主要負責對移動客戶端發送過來的命令進行處理,比如將用戶身份信息保存至數據庫、接收用戶人臉注冊照片訓練并存放到指定文檔、接受用戶登錄照片進行人臉識別以及授權發送二維碼。
為了驗證本文實現的基于 Android的人臉識別門禁系統的性能指標,本文采集了40張不同的人臉建成人臉庫進行訓練測試,采集設備是華為P9,系統版本EMUI4.1兼容Android6.0,CPU八核華為麒麟955,內存3G。系統測試結果如表1所示。
以上的結果表明,在Android系統上本設計達到了預期設計標準,有較好的人臉識別率和實時性,樣本中大部分的人臉圖像都有著正確的識別,但是由于人臉識別率受所處環境的光照、人臉表情和膚色相類似的背景以及拍攝角度等因素影響,所以會有一定的錯誤率。

表1 系統測試結果
本文采用人臉識別技術和移動開發技術設計了基于Android系統的人臉識門禁系統,為一些高安全等級場所提供安全保證。在安全性方面,采用了人臉識別和二維碼雙重驗證,大大增加了門禁系統的安全性,為智能門禁提出了新方案。測試結果表明:本系統具有良好的易用性、安全性,并且識別速度快識別率高,彌補傳統門禁的缺陷與不足。