嚴正國,王家冰
(西安石油大學光電油氣測井與檢測國家教育部重點實驗室,西安710065)
當今社會,大多數公司、企業都會對員工的上、下班進行考勤。當前的卡片打卡機防作弊機制不完全,只要手中有他人的卡片就可以替代打卡,市面上也出現了指紋式打卡機,這種打卡機指紋容易磨損,同時指紋套等物品的出現也說明了指紋打卡的不可靠性。如今,生物特征識別技術應用需求廣泛,而人臉識別技術又以其非強制性、非接觸性、并發性和普遍性的特點,得到了廣泛的應用。嵌入式系統作為時下最流行的智能設備開發平臺,通過OpenCV 這個資源豐富的跨平臺計算機視覺庫,將人臉識別技術與嵌入式系統相結合,顯著提高了開發的效率。
系統總體設計方案主要包括以下兩個內容:
一是嵌入式硬件系統的搭建,主要包括了硬件平臺的選擇、Bootloader 的移植,Linux 內核的裁剪與移植和根文件系統的構建。
二是軟件系統的編程,主要涵蓋了對基于OpenCV的人臉識別技術的研究與應用程序的設計和編寫。
本設計選用了mini2440 開發板,其采用的微控制器是三星公司推出的S3C2440A,基于ARM920T 核心,具有性能高、功耗低、成本低的特點。
Bootloader 是開機啟動系統時的一小段程序,通過這段程序來初始化硬件與建立內存空間的映射表,從而建立適當的軟硬件環境。u-boot 是最常用的一種Bootloader,它是一個開源的通用引導程序,同時支持x86、ARM 和PowerPC 等多種處理器架構。
(1)網上下載相應版本的u-boot.bin 到虛擬機的tftpboot。
(2)在開發板上配置TFTP 服務器的IP 地址,setenv serverip 192.168.1.xx(虛擬機ip 地址),并通過tftp 把u-boot.bin 下載到開發板內存。

圖1 系統流程圖
(3)在開發板上燒寫u-boot.bin。
需要對內核進行適當的修改才能更好適配開發板,需要對內核進行配置并重新Makefile。
(1)官網下載與開發板對應的內核版本,make${PLATFORM}_defconfig 確定平臺。
(2)make menuconfig 進入圖形化界面配置內核信息,進行內核裁剪。
(3)make uImage 編譯內核源碼。
(4)tftp 0x30008000 uImage 在uboot 環境下載內核鏡像,bootm 0x30008000 啟動內核。

圖2 內核裁剪界面
在Linux 系統我們也需要把磁盤和Flash 分為多個分區,便于日常的使用,常用的存儲設備文件系統類型有jffs2、yaffs2、ubifs、ramdisk、nfs,等等。在網上下載一個常用的根文件系統放到虛擬機nfs 目錄中,然后通過nfs 掛載的方式實現根文件系統的搭建。

圖3 開發板根文件系統
根據設計的需求決定采用Qt Creator 作為圖形應用程序開發工具,Qt Creator 是一個跨平臺的C++圖形用戶界面應用程序框架,它為應用程序開發者提供建立藝術級圖形界面所需的所有功能。使用Qt Creator主要是因為它跨平臺,支持Windows 和Linux 等平臺;函數接口簡單,易于編程;開發效率高,有成熟的軟件框架,可以快速地編寫應用程序;支持嵌入式開發。
OpenCV 是一個開源的跨平臺計算機視覺庫,它為我們提供了大量的圖像處理的C 語言函數和C++類,供學習者免費使用。我們可以在嵌入式Linux 環境下對OpenCV 庫進行編譯,將編譯好的OpenCV 庫移植到開發板的根文件系統的/usr/lib 目錄,人臉識別的具體識別方法將利用OpenCV 的函數進行編寫。
圖形的界面的開發主要使用QtGUIApplication 的進行設計,主要界面包含了攝像頭、人臉識別方法以及必要的功能按鈕。

圖4 Qt Creator設計界面

圖5 軟件流程圖
人臉識別模塊的編寫主要使用了OpenCV 中的FaceRecognizer 類,主要的功能是實現了對于攝像頭采集的圖片的訓練和預測,分別對應train 和predict 函數。訓練的時候,將照片的信息保存在vector
//創建人臉識別類
Ptr
Ptr
Ptr
//訓練
faceClass->train(images,labels);
fisherClass->train(images,labels);
lpbhClass->train(images,labels);
//保存訓練的分類器
faceClass->save("faceClass.xml");
fisherClass->save("fisherClass.xml");
lpbhClass->save("lpbhClass.xml");
//加載分類器
faceClass->load("faceClass.xml");
fisherClass->load("fisherClass.xml");
lpbhClass->load("lpbhClass.xml");
//使用訓練好的分類器進行預測。
int faceResult=faceClass->predict(src_5);
訓練和預測時使用的人臉識別方法是特征臉EigenFace、Fisher 臉FisherFace、LBP 直方圖LBPHFace,分別調用函數cv::face::EigenFaceRecognizer::create、cv::face::FisherFaceRecognizer::create 和 cv::face::LBPHFaceRecognizer::create 建立模型。
識別結果如圖6 所示,正確識別了組名、用戶名并返回了預測值,我們可以看到預測值達到91.35。根據筆者試驗,一般預測值達到80 以上時,識別結果均準確無誤,成功實現了人臉識別。

圖6 人臉識別結果
通過開源的OpenCV 計算機視覺庫,使得人臉識別技術在嵌入式系統得以實現,可以根據實際需求具體定制人臉識別設備,在嵌入式生物識別領域具有一定的應用前景。但本設計亦有考慮不足之處,在實際工程中還需要進一步優化與改進。
(1)系統在經過長時間的運行之后,是否還能保持設備可靠的運行。
(2)信息采集模塊由于實際應用的不確定性,如果獲取的照片角度不佳或光照不足,是否會對人臉識別模塊造成影響。