黨宏社,白文靜,馬毅超,陶亞凡
(陜西科技大學電氣與信息工程學院,西安710021)
研究人與人交互的情緒表達的特征,找尋到其內在真實的或統計意義上的規律,將有可能實現人與計算機和諧的情緒交互[1]。面部表情是人體語言的一部分,能夠傳遞心理的情感,從外觀體現人的情緒。隨著計算機技術在各個領域的快速發展,人與計算機之間的交互越來越頻繁,人們對人與計算機的交互要求也隨之提高,表情識別在計算機情感分析系統的地位也越來越重要。有研究指出,比起動作和語音,面部表情更能夠表達人的心理活動[2]。
近年來,面部表情識別技術越來越廣泛的應用在人機交互、智能控制、安全、醫療、通信等領域。面部表情識別一般涉及表情圖像的獲取、圖像預處理、情感特征的提取和表情分類[3]。特征提取的結果對最終的識別率有很大的影響。2013年胡敏等[4]人在LBP特征基礎上提出了自適應加權的完全二值模式,有效地提取了局部特征和全局特征。2014年李雅倩等人[5]將PCA算法和流型學習思想相融合,提出了一種融合全局與局部多樣性特征方法。2015年Robert Walecki等[6]提出了Variable-state LCRF模型通過解決AU識別問題很好地解決了面部表情分類問題。2016年王曉華等[7]提出了一種融合局部特征的提取方法,與最近鄰方法相結合對局部遮擋噪聲有很好的抗噪性。2017年鐘偉等[8]將粒子群算法與線性判別式分析(LDA)相結合,提出基于粒子群算法的LDA(PSO-LDA)來提取表情特征,對最優解的搜索能力有很大的改善。
傳統的特征提取采用的都是人為設定的特征,不僅損失了部分原有特征信息,并且由于特征維數較大增加了一定的運算量和復雜度。卷積神經網絡不需要人為的設定特征,而是通過訓練網絡結構而自動獲取特征,從而給出識別的結果。由于表情識別問題的復雜性,卷積神經網絡結構越來越復雜,參數不斷增加,計算復雜度越來越大,容易出現過擬合現象,因此本文利用MTCNN模型進行人臉檢測,引入inception模型,使用1×1的卷積核,降低特征圖的厚度,平衡網絡深度和寬度。
一個最簡單的卷積神經網絡結構包括:數據輸入層、卷積計算層、池化層、全連接層和輸出層。本文的算法思路:對輸入圖片采用不同卷積核進行卷積操作得到特征圖,再進行最大池化;之后采用inception模型,利用1×1卷積進行降維處理,將得到的特征圖池化;在全連接之后使用dropout進行過擬合處理,最后使用Softmax分類器完成分類。在整個結構中卷積是核心,卷積神經網絡通過卷積來模擬特征區分,并且通過卷積的權值共享及池化,來降低網絡參數的數量級。本文設計的卷積神經網絡結構如圖1所示。

圖1 網絡結構
算法的具體實現過程如下:
Step1:經過預處理后得到的48×48像素的圖片作為輸入層的圖像。將輸入的圖像與32個不同大小的像素為5×5的卷積核進行卷積,即每一個神經元制定一個5×5的局部感受野,卷積之后得到大小為44×44像素的32個特征圖。也就是提取了32個不同的局部表情特征,產生了832個((5×5+1)×32)可訓練的參數。
Step2:在BN(BatchNorm)層對得到的特征圖進行處理,實質是固定網絡層輸入的均值和方差。對于每個神經元而言,就是在進入下一層之前把非線性函數映射后,向取值區間極限飽和區靠攏的輸入分布,強制拉回到均值為0方差為1的比較標準的正態分布,使得非線性變換函數的輸入值落入對輸入比較敏感的區域,避免梯度消失問題。當梯度一直都保持比較大的狀態,神經網絡的參數調整效率就比較高,即收斂地速度快。
Step3:對BN層的輸出的特征圖進行池化,即下采樣。下采樣的目的是為了保持圖像的旋轉、平移、伸縮等不變性,同時也是為了降低因卷積層數增加而增加的特征維數。采用2×2的窗口進行最大池化,將得到32個像素為22×22的特征圖,特征圖的個數相比上一層不會發生改變。
Step4:第二次卷積采用64個3×3的卷積核對上一層輸出的特征圖進行卷積操作,得到了64個像素20×20的特征圖。將得到的64個特征圖,經BN層處理后,采用2×2的窗口進行最大池化,得到64個像素為10×10的特征圖。
Step5:網絡層數的增加導致參數增加,計算資源增加,因此用稀疏連接來代替全連接,網絡拓撲結構可由逐層分析與輸出高度相關的上一層的激活值和聚類神經元的相關統計信息來優化。但有非常多的限制條件,對計算的基礎設施要求過高,因此將稀疏矩陣聚類成相對稠密子空間來傾向于對稀疏矩陣的計算優化[9],就有了inception結構。在進行3×3和5×5卷積操作前,采用1×1卷積進行降維處理,1×1卷積不僅能夠降維,還能引入ReLU非線性激活。inception結構增加了每個階段的單元個數,也就是網絡的寬度和深度;同時也將多尺度處理之后的圖像結果聚集起來便于下一步能同時提取不同尺寸下的特征。對輸出的特征圖再進行池化,為全連接層做準備。
Step6:上一層輸出的每一個特征圖都是一個二維數組,全連接層的數據必須是一維的數組,因此將每一個二維數組轉換為一維數組,再將每一個特征圖的數組串聯起來形成一個特征向量,特征向量就是每一個神經元的輸入,則每個神經元輸出為:

ω為權值向量;x為神經元的輸入特征向量;在實驗中b=0表示偏置;θ(·)表示激活函數,本文中使用ReLU函數作為激活函數。
Step7:Dropout層的目的是為了防止過擬合,按照一定的概率暫時將部分神經元從網絡中丟棄[10]。經過Dropout層之后,有N個節點的神經網絡就可以看成是2N個模型的組合,但不影響訓練參數的數量,相比于訓練多個模型做組合節省了時間。
Step8:在卷積神經網絡的最后一層使用Softmax分類器。結合上一層的輸出結果,Softmax會給每一個類別分配一個小數用來表示類別概率,這些概率相加的結果為1。輸出層輸出的是屬于7種表情的概率數值,取最大值作為最終的識別結果。
卷積神經網絡模型通過訓練來完成參數修正。訓練主要包括兩方面:正向傳播和反向傳播。正向傳播就是對特征提取的過程,也就是網絡結構當中的卷積和池化。反向傳播則是根據網絡各層的反饋誤差計算參數的修正量[11],再通過梯度下降法對參數進行更新。
本文選用對數函數作為網絡模型訓練過程中的損失函數,其標準形式為:

y為已知分類的類別,x為樣本值,需要讓概率p(y |x)達到最大值,即求一個參數值,使得輸出的目前這組數據的概率值最大。在訓練過程中采用隨機梯度下降算法達到損失函數的最優化,隨機梯度下降算法公式為:

θt表示t時刻的訓練參數,△θt表示t時刻θt的修正量,η是學習率,gt為x在t時刻的梯度,訓練參數θ沿著負梯度方向更新。
本文選取的實驗樣本來自JAFFE人臉表情庫、CK+人臉表情庫。JAFFE數據庫發布于1998年,該人臉表情庫是由10名女性的7種表情圖片構成,整個數據庫合計213張圖像。CK+數據庫發布于2010年,是在Cohn-Kanade Dataset的基礎上擴展來的,該數據庫包括 123個 subjects,593個 image sequence,每個 image sequence的最后一張Frame都有action units的label,而在這 593個 image sequence中,有 327個 sequence有emotion的label[12]。數據庫都將表情分為生氣、厭惡、恐懼、高興、悲傷、驚訝、平靜7個類別。選取JAFFE數據庫所有圖片,CK+數據庫選擇2000張表情圖。CK+數據庫相比JAFFE數據庫增加了男性圖片,范圍更大。
樣本數據在實驗前需要進行預處理,本文采用MTCNN進行人臉檢測。MTCNN由P-Net、R-Net和O-Net三個網絡組成的[13]。MTCNN模型中綜合考慮了人臉邊框回歸和面部關鍵點檢測,能夠同時對多個人臉以及人臉特征點進行檢測。首先將照片按照不同的比例,縮放成不同大小的圖片,形成圖片的特征金字塔。P-Net再獲得人臉區域的候選窗口和邊界框的回歸向量,并用該邊界框做回歸,對候選窗口進行校準,然后通過非極大值抑制(NMS)來合并高度重疊的候選框。R-Net將經過P-Net的候選框在R-Net網絡中訓練,然后利用邊界框的回歸值去微調候選窗體,再利用NMS去除重疊窗體。O-Net功能與R-Net作用類似,只是在去除重疊候選窗口的同時,同時顯示五個人臉關鍵點的定位。MTCNN算法能夠在多人情境下快速準確地檢測到每一個人臉進行。
本文使用Python、Tensoflow和Keras搭建網絡。硬件平臺 Dell XPSD14D-5518:Intel酷睿 i5 2.5GHz,內存4GB。本文實驗分為三組進行:
(1)用JAFFE數據庫樣本進行訓練和測試,訓練樣本149個,測試樣本64個,循環20次后平均值作為測試結果。測試結果如表1所示。

表1 JAFFE數據庫測試識別率(%)
由表1可以計算出,在JAFFE數據庫測試的平均識別率89.35%。對于平靜和高興的識別率很高,傷心的識別率最低。
(2)用CK+數據庫樣本進行訓練和測試,訓練樣本2000個,測試樣本396個,循環20次后平均值作為測試結果。測試結果如表2所示。

表2 CK+數據庫測試識別率(%)
由表2可以計算出,在CK+數據庫測試的平均識別率90.10%。相比于JAFFE的測試結果的89.35%,識別率有小幅的增加。
(3)為了擴大數據集的樣本數,將CK+數據集的樣本進行翻轉,并且與JAFFE數據庫合并。選取合并后的表情圖庫圖像的90%為訓練樣本,其他10%為測試樣本,循環20次后平均值作為測試結果。測試結果如表3所示。

表3 CK+數據庫測試識別率(%)
由表3計算出,在合并的數據集進行測試的平均識別率為90.86%。CK+數據集樣本識別率相比,平均識別率有所提高,但部分表情的識別率有所下降。將本文算法與其他算法進行比較,可以看出本文算法有較好的識別率。

表4 本文算法與其他算法識別率比較
使用本文算法在實驗室環境下進行測試,結果如圖2所示。可以看出能夠顯示出每個人的表情狀態,實現了對多人表情的識別。

圖2 測試結果
本文在預處理階段使用了MTCNN模型進行了人臉檢測,能夠快速準確地檢測出多個人臉以及人臉特征點。在提取人臉圖像后采用了加入inception模型的卷積神經網絡進行面部表情的識別,降低了特征圖的厚度,平衡了網絡深度和寬度,抑制了過擬合現象,在測試過程中取得了較好的結果。下一步的研究工作將針對減小損失誤差問題對網絡結構進一步優化。