衡友躍
摘要:考場傳統的人工核驗身份存在效率低、人為因素大等弊端,設計實現了一種考場人臉識別系統,該系統基于PCA算法,在OpenCV中實現,測試達到預期效果,為考試提供了有力支持.
關鍵詞:人臉識別;PCA;OpenCV
中圖分類號:TP391 文獻標識碼:A 文章編號:1673-260X(2019)03-0051-03
基于視頻的考生異常行為識別的第一步識別考生身份,傳統的人工核驗身份證和準考證效率低,出錯率高.針對當前現狀,本文設計了考場人臉識別系統,為考生異常行為識別奠定基礎.
1 考生臉部圖像獲取及處理
在考生人臉識別之前,需要先進行考生面部圖像的獲取.為防止學生替考,要求用二代身份證核驗身份,通過拍攝二代身份證上的照片提取面部圖像.拍照的角度,拍照時的光線強弱等因素都會帶來干擾,對照片有影響.加上JPEG格式壓縮的圖像,其本身也有一定程度的失真.給人臉識別增加難度.這些因素沒法改變,因此只能通過選擇合適的算法,并對其進行優化,在一定程度上消除不利因素.
人臉識別算法對照片中人臉的標準化要求很高,在進行人臉識別之前,要對原始的照片進行預處理.預處理之后的照片應該大小一樣,人臉的位置也應該保持一致.
預處理流程步驟:首先對照片進行旋轉,旋轉到兩個眼睛處在同一條水平線上即可.接著對照片進行裁剪,根據人臉圖像的寬度是標準照片中兩個眼睛之間的距離的2倍進行裁剪,兩個眼睛的位置確定下來,其他器官的位置也就跟著確定了,一張標準化的人臉圖像就生成了.接著對圖像進行灰度歸一化處理,為了方便統一處理不同灰度值的圖像,圖像的灰度值和方差需要被設定到一個合理的范圍之內.
2 面部特征提取
目前面部特征提取方法有:基于幾何特征面部識別方法、基于BP神經網絡面部識別方法、基于LBP的面部識別方法等[1].每種方法都各有適用場景及優缺點,考慮到平臺的兼容性,硬件資源配置低的因素,本文采用PCA(Principal Component Analysis)算法.
PCA即主成分分析,是一種常用的數據降維方法.它可以通過線性變換將面部原始數據變換為一組各維度線性無關表示,以此來提取數據的主要特征分量.PCA算法步驟[2,3]:
(1)將面部圖像采集到數據庫中.這一步先進行圖像預處理,然后再將數據按列組成n*n矩陣X.
(2)求特征協方差矩陣.將X的每一行進行零均值化處理,求出協方差矩陣C,進而求出協方差矩陣C的特征值及對應的特征向量.
(3)對面部特征進行降維.將面部特征向量按照對應特征值大小從上到下按行進行排列成矩陣,取前k行組成矩陣P,Y=PX即為降維到k維后的特征向量.
3 面部特征識別
識別過程分為兩步,第一步訓練,第二步識別.
訓練步驟:
(1)準備一組面部圖像.
(2)訓練這些圖像,生成它們的特征臉,保存N個特征值相關的特征向量,并將其定義為一個“面部空間”.
(3)將訓練集合中的面部圖像全部投影到“面部空間”上,計算出每一個人臉圖像在該N維空間上的相關分布系數.
訓練之后就可以識別了,識別步驟:
(1)將待識別的人臉圖像投影到N個特征臉上,計算其權值.
(2)將得到的權值和原始的人臉集合做對比,計算圖像之間的歐式距離,通過比較歐式距離和設置的閾值做比較,可以確認該人臉是否是人臉庫中的人臉.
4 特征臉在OpenCV中實現
OpenCV是一個開源發行的跨平臺計算機視覺庫,可以運行在Linux、Windows、Android、Mac OS操作系統上.它用C++編寫,但提供了大量的Python、Ruby等語言接口[4,5].
在OpenVCV2.4以后,加入了新的類FaceRecognizer.通過它可以方便快捷的進行人臉識別.首先輸入人臉圖像訓練樣本,FaceRecognizer類調用train方法對其進行訓練,訓練的結果通過調用save方法保存到FaceRecognizer對象中.接著進行識別工作,先通過load方法加載之前訓練好的特征文件,然后FaceRecognizer調用predict方法進行人臉識別[6].整個識別過程在OpenCV中的實現過程如圖1所示.
5 Android人臉識別軟件設計
5.1 開發環境準備
(1)從opencv官網上下載sdk,本項目選擇3.3.3版本.
(2)新建一個Android項目,導入opencvLibrary.
(3)復制sample/face-detection/src到app項目的src下.
(4)導入res文件.
(5)復制jni/detectionBasedTracker_ini.cpp和
jni/detectionBased Tracker_ini.h到cpp目錄下.
(6)新建main/jniLibs/armeabi-v7a目錄,復制sdk/native/libs/armeabi-v7a/libopencv_java3.so到新建目錄下.
(7)復制sdk/native/jni/include/*.*
到main/jniLibs/目錄下.
(8)修改CMakeList.txt文件.
(9)在build-gradle文件中加入要支持的armeabi-v7a架構.
(10)加入啟動頁面,運行.
5.2 人臉檢測與識別
OpenCV有一個org.opencv.android.JavaCameraView自定義控件,它不停地從攝像頭抓取數據,在回調方法中,我們能得到Mat數據,然后通過調用OpenCV的Native方法,檢測當前是否是人臉,我們會獲得一個Rect數組,里面都是人臉數據,最后將人臉畫在屏幕上.
人臉識別用到了JavaCV,JavaCV是一款開源的視覺處理庫,封裝了OpenCV等計算機視覺編程常用接口,在Android平臺上調用方便[7].
人臉檢測階段檢測到人臉之后,把人臉部分截取出來,接著預處理原始數據,然后將特征值跟人臉空間特征值做比對,達到一定相似度即識別出來.
5.3 軟件測試
本次App測試過程中,主要測試軟件的識別率,測試組選取四位志愿者.首先訓練樣本,四位志愿者每人拍攝5張圖片作為訓練樣本,如圖2所示.
每位志愿者采集的面部圖像的神態、表情都稍微有些變化,圖中的人臉圖像都是經過預處理之后的.在樣本訓練結束之后,進行人臉識別,識別結果如圖3所示.
經過軟件測試,當測試人數為4人時,軟件識別率達到100%.
6 結束語
本文首先詳細介紹了PCA人臉識別算法,然后配置Android開發環境,使用OpenCV開發實現了人臉識別軟件,測試結果達到預期效果.
參考文獻:
〔1〕江琨,鄭祿,帖軍.基于LBP和PCA算法的智能人臉識別[J].計算機與數字工程,2016,44(10):2048-2051+2056.
〔2〕趙鑫,汪維家,曾雅云等.改進的模塊PCA人臉識別新算法[J].計算機工程與應用,2015(02):161 -164+176.
〔3〕張曉璐.基于PCA的人臉識別技術的研究[J].遼寧科技學院學報,2014(04):38-39+42.
〔4〕林啟亮.基于OpenCV2.X的車牌識別系統設計與實現[D].廈門大學,2013.6-7.
〔5〕王艷紅.基于OpenCV的運動目標檢測與跟蹤算法的研究[D].杭州電子科技大學,2014.5-6.
〔6〕劉海建.基于OpenCV的人臉辨識算法研究與實現[D].集美大學,2014.10-12.
〔7〕曾健平,邵艷潔.Android系統架構及應用程序開發研究[J].微計算機信息,2011(09):1-3.