曾崇林 姚富光


摘 要 當前正在開發的面部識別技術廣泛用于安全、監視、一般識別、訪問等領域。如在搜索和救援失散兒童和提高身份識別效率方面發揮著重要作用。本文基于樹莓派的硬件基礎,在Python軟件環境下,選擇了通過計算128D的特征值和128D向量間的歐氏距離的方法,并結合Adaboost算法、提取Haar特征的方法來提取人臉特征。開發過程中用到的OpenCV級聯分類器是通過人臉檢測算法進行訓練的,再加以通過積分圖方法來獲取完整的級聯分類器結構,最后,開發了一個實現人臉識別功能的智能終端。可投入小型場所例如課堂簽到,考試身份驗證,上班打卡,防盜鎖等諸多領域。
關鍵詞 人臉識別;OpenCV;AdaBoost;分類器;樹莓派
引言
當今社會中,面部識別技術變得越來越重要,我們迫切需要更方便用戶的識別,生物技術正在成為信息處理和信息產業的一個動態領域和重要的方向。受2020年年初爆發的全球性肺炎疫情,人們在公共場合需要進行身份識別和體溫檢測,但是人與人之間的接觸又是十分危險的。如果人臉識別智能終端開發成熟能夠投入到社會中,就會大大提高身份識別的效率并且可以很大程度上保障市民的生命安全。
基于這個時代大背景,設計了一個基于OpenCV的人臉識別系統。該系統能夠廣泛應用與各種場合下,移動方便,操作簡單,使用靈活,還可以彌補傳統安保行業的安全、方便等方面的缺失。該系統可保障識別數據的實時性,真正做到安全、方便和直觀的人臉識別系統,從而進一步提高公司、倉庫、家庭、學校等地的安保水平和管理穩定性[1]。
1系統設計
1.1 系統整體設計
該系統的整體設計是以python語言為基礎開發的,運用到了如OpenCV、DLIB等開發包,以實現單個驅動樣品中的面部識別,并具有更友好的UI界面和優化的識別速度。首先進行面部認知,并試驗閱讀面孔集的過程,檢測面孔,提取面孔身份矢量,存儲面孔身份矢量,標識單個測試面板和打印標識結果。標識界面初始化,加載各種參數模型,手動選擇單個面部測試圖表,根據人體面部檢測器openCV檢測人體面部,從人臉特征矢量中提取,計算十二個特征點之間的距離,檢測人臉標簽中最小距離的標簽,以及輸出面部識別結果,圖1顯示了該系統的組織結構。
面部檢測包括檢測面部特征,并在某些情況下定位眼睛、鼻子、耳朵和眉毛等面部特征,從而能夠準確地定位臉部和人臉的其他部分。一般情況下,人臉檢測是通過相關技術進行的,這些技術將要檢測的人臉圖像劃分為一種人臉圖像模式(“檢測到的人臉組成部分”)和一種非人臉圖像模式。
該人臉識別系統的設計以樹莓派為基礎,加以數據庫、OpenCV庫以及顯示屏。使用本套系統之前需要通過攝像頭識別人臉并將人臉樣本保存到人臉庫中,即數據的采集和保存。當有人的臉部出現在攝像頭之下,就會自動捕捉人臉,將識別到的人臉與人臉庫中的樣本進行比對,如果人臉庫中存在此人的人臉樣本就會輸出該人臉所對應的相關信息,如賬號、姓名等。若無上述現象,則證明人臉庫中不存在該對象[2-4]。
圖1? 系統設計結構圖
1.2 系統硬件設計
將樹莓派專用攝像頭用白色排線連接到樹莓派的開發板上,再將樹莓派通過USB接口和AMI轉換器與顯示屏連接成功,將所需的鼠標鍵盤通過USB線連接到樹莓派上。硬件框架大概基本搭建完成,可以進行環境的配置和系統的開發了[5]。
1.3 系統軟件設計
(1)系統開發所需軟件環境
1)開發所需要軟件資源:win32 DiskImager,SDFormatter,樹莓派鏡像文件,樹莓派官方Linux系統,PyCharm,python 3.8。
2)開發工具選擇。本次設計所用的開發工具是PyCharm 2020.1 x64,python 3.8,Pycharm 2020.1 X64 Pycharm。
(2)軟件運行環境的搭建
1)燒錄系統;
2)配置樹莓派wifi和遠程桌面;
3)安裝Qt、QtCreator、圖形化遠程桌面、PyCharm,python 3.8;
4)安裝開發所需要的庫[6-8]。
2系統實現
2.1 系統核心代碼
if len(self.faces) != 0
# 獲取當前捕獲到的圖像的所有人臉的特征,存儲到 features_cap_arr
features_cap_arr = []
for i in range(len(self.faces)):
shape = self.predictor(self.img, self.faces[i])
features_cap_arr.append(self.face_rec.compute_face_descriptor(self.img, shape))
# 遍歷捕獲到的圖像中所有的人臉
for k in range(len(self.faces)):
# 人員信息列表
# 先默認不認識,是 unknown
name_namelist.append(“unknown”)
# 每個捕獲人臉的名字坐標
the positions of faces captured
pos_namelist.append(tuple([self.faces[k].left(), int(
self.faces[k].bottom() + (self.faces[k].bottom() - self.faces[ k].top()) / 4)]))