朱學玲 陳浩旗
(安徽新華學院大數據與人工智能學院,安徽 合肥 230088)
人臉識別技術的發展始于20 世紀60 年代,科研人員經過60 多年的不斷探索和研究,尤其是近年來人工智能的快速發展,人臉識別已成為計算機視覺、圖像處理、模式識別等領域的研究熱點之一,特別是在視頻監控、人機交互界面等方面。
人臉識別的方法有很多種,有幾何特征、特征提取、神經網絡、彈性匹配等,本文采用了最基礎的卷積神經網絡(CNN——Convolutional Neural Networks)來進行特征提取,并結合OpenCV 進行前期檢測和后期的識別,總體實現流程如圖1 所示。下面將詳細介紹檢測、特征提取和識別部分。

圖1 流程
人臉數據的獲取包括人臉圖像的采集和檢測。首先通過電腦攝像頭進行人臉檢測和錄入,本人采用了OpenCV 技術,用了OpenCV 的Cascade Classifier 類中的人臉檢測器haarcascade_frontalface_alt2.xml,生成原始數據集和標簽。
圖像的預處理主要是調整圖片大小,使得圖片都滿足Inage_size=64,考慮到識別的效果,減小計算誤差,還做了灰度變換、維度轉換和歸一化處理,得到了處理好的數據集,如圖2 所示。

圖2 預處理后的數據集(無光線、角度等變化)
后期考慮到角度和光線的不同對識別結果的影響,又增加了角度變化和光線變化的數據集,如圖3和圖4 所示。

圖3 角度變化

圖4 光線變化
構建卷積神經網絡做特征提取,本實驗采用了三層“卷積+池化”的結構,第一和第二個卷積層各有32個filter,卷積核大小為3*3,池化層2*2,代碼如下:

由于以上數據集都是自己采樣而來,訓練數據不是很多,為了能有得到較好的測試精度防止過擬合,在構建好卷積層和池化層后與全連接層和激活層之前,再添加Dropout 層,Dropout 比率設置為0.5:

在卷積層和池化層之后添加全連接層,該層有512 個神經元,再通過激活函數,增加神經網絡的非線性,如圖5 所示,完成了卷積神經網絡的構建。

圖5 構建卷積層和池化層代碼
在訓練代碼中使用了fit()函數計算訓練集的均值、方差等屬性,生成了訓練模型number.h5。并利用evaluate()等函數對測試和識別結果進行評估。
測試時中對視頻下所出現的人臉進行識別再次用到了OpenCV 的CascadeClassifier 類中的人臉檢測器haarcascade_frontalface_alt2.xml,使用條件判斷語句對檢測到的人臉進行識別。
訓練的好壞直接影響識別的準確度,因此,在訓練模型中使用了Adam 優化算法,通過調試學習率提高測試準確率,Adam 算法中參數配置如下:

(1)learning_rate 字面理解為學習速率。在速率校正之前會加快初始學習速度,前期取值為0.3。較小的值(例如1.0e-5)在培訓期間降低學習速度,后期調試時取值為0.1~0.001,通過不斷的訓練,learning_rate 的取值逐漸減小,經過若干次調試后,最后一次取值為0.001。
(2)beta1 為一階矩指數衰減率,取0.9。
(3)beta2 為二階矩指數衰次減率,取0.999。
(4)epsilon 的值非常小,防止在實現中被0 除,此處取值是常規的10e-8。
第一次訓練時(角度、光線正常)learning_rate 值較高,取值0.3,識別準確率平均為79.61%。經過若干次調試后,調試learning_rate 值并考慮到環境、人臉角度變化等因素,如表1 所示,得出learning_rate 取值為0.01~0.001 之間較為合適。

表1 調試learning_rate 和環境因素運行結果的變化
分別在角度、光線、距離上進行調試運行效果如圖6 所示,在識別框的內側的上方顯示是否是本人,如果是本人顯示“me”,如果不是本人則顯示“other”,通過識別框的顯示范圍可以看出識別效果較好,能夠準確的捕捉人臉的位置。

圖6 調試后運行效果
通過實驗過程可以體會到OpenCV 和卷積神經網絡相結合的方式實現人臉識別是眾多方法中比較快速、基礎的方法,該方法實現簡單但也存在一些不足,比如在檢測環節,圖片的色彩比較豐富、人臉部分顏色較暗、圖片不夠清晰等都會影響檢測的準確度。另外,訓練的次數為了達到預期效果,需要不斷的調整參數,因此在后期的優化中,可以考慮一些基于PyTorch 的方法。