張東曉,陳彥翔
(集美大學理學院,福建 廈門 361021)
面部表情識別正受到越來越多的關注,涉及計算機視覺、機器學習和認知科學等領域[1],應用于醫(yī)療[2]、工業(yè)互聯(lián)網(wǎng)[3]、人機交互[4]、娛樂[5]、虛擬現(xiàn)實[6]、餐飲[7]等方面。一個完整的情緒識別系統(tǒng)通常包括三個部分:人臉區(qū)域檢測、面部情緒特征提取和使用分類器進行預測。人臉檢測技術已經(jīng)比較成熟,所以相關研究主要集中在后兩個方面。傳統(tǒng)的研究思路是構造人工特征,如基于降維算法來構建特征[8-10],基于眼睛、嘴巴、鼻子等部位構建幾何特征[11-13],基于顏色變化構建紋理特征[14-16];然后采用傳統(tǒng)機器學習算法進行分類,如支持向量機(support vector machine,SVM)[17-18]、K-近鄰(K-nearest neighbor,KNN)[18]、隨機森林[19]等。這些方法可以在特定數(shù)據(jù)庫下取得良好的結果。但人工特征往往具有局限性,導致模型泛化能力不強,在現(xiàn)實任務中很容易受到光照、遮擋等情形的影響。
近幾年深度學習在視覺領域取得優(yōu)異成績,在表情識別方面也涌現(xiàn)出很多研究成果,如卷積神經(jīng)網(wǎng)絡(convolutional neural networks,CNN)[20-22]、對抗神經(jīng)網(wǎng)絡[23-24]、成熟網(wǎng)絡結構的遷移學習[25-26],以及其他深度網(wǎng)絡[27-28]。也有學者嘗試將經(jīng)典方法與深度學習相結合。如夏添等[29]將眉毛、眼睛、鼻子和嘴巴等部位的特征點作為深度網(wǎng)絡的輸入,張發(fā)勇等[30]將深度網(wǎng)絡獲取的特征用到隨機森林模型中,所得結果對視角都具有較強的魯棒性。由于可以自動學習特征,這些方法均取得良好的效果。
目前公開報道的應用主要集中在PC端,但是近幾年移動互聯(lián)網(wǎng)的快速發(fā)展也催生了移動端的巨大需求。如:在線教育中,可以通過自動檢測學生的表情變化,及時掌握學習情況;購物平臺的智能客服可以通過用戶表情及時調(diào)整對話策略。所有這些應用場景均有兩個前提條件——計算資源消耗小和實時性。但是深度學習框架下的主流網(wǎng)絡結構往往比較深,需要消耗大量計算資源。受算力限制,這些模型均無法直接移植到移動端。而經(jīng)典提取特征的方法泛化能力有限,又不能滿足移動端的應用需求。因此,本文設計了一個淺層神經(jīng)網(wǎng)絡,期望在確保模型識別率的前提下,能大幅降低運算量。
伴隨著表情識別研究的興起,各國學者開始構建表情數(shù)據(jù)集。最早開始這項工作的是學者Lyons等[31],他們于1998年構建了一個日本女性表情數(shù)據(jù)集(The Japanese Female Facial Expression Database,JAFFE),包括高興、悲傷、中性、厭惡、生氣、害怕及驚訝7種不同的面部表情,共計213張圖像。
目前應用較為廣泛的數(shù)據(jù)集是構建于2010年的The Extended Cohn-Kanade Dataset(CK+)[32]。該數(shù)據(jù)集包含來自123個人的總計593張正面照,它還包括對應于面部表情的每張照片的標簽及動作單元編碼標簽。與JAFFE相比,該數(shù)據(jù)集的樣本數(shù)量更多,且多了一個“蔑視”表情。
表1 FER-2013各表情對應的標簽及樣本數(shù)量Tab.1 The label and amount of eachexpression in FER-2013標簽Label數(shù)量Amount表情Expression04 593生氣Angry1547厭惡Disgust25 121恐懼Fear38 989開心Happy46 077傷心Sad54 002驚訝Surprise66 198中性Neutral
另一個知名數(shù)據(jù)集是FER-2013[33]。該數(shù)據(jù)集是由Carrier等于2013年建立的公開數(shù)據(jù)集,數(shù)據(jù)主要來源于網(wǎng)絡檢索,總計35 887張灰度人臉圖像,先后被發(fā)布在Kaggle和ICML2013等平臺。其數(shù)據(jù)是已經(jīng)裁剪好的人臉灰度圖像,大小為48 px×48 px。表情種類與JAFFE一致,含有7種常見的面部表情:0-生氣(angry);1-厭惡(disgust);2-恐懼(fear);3-開心(happy);4-傷心(sad);5-驚訝(surprise);6-中性(neutral)。每種表情的樣本數(shù)量及對應的標簽如表1所示。
國內(nèi)也有學者開展這方面的工作,如吳丹等[34]建立了包括70個人的1 000段臉部表情視頻數(shù)據(jù)庫,為表情識別的深入研究做出貢獻。對比這些數(shù)據(jù)集,F(xiàn)ER-2013有較大規(guī)模的數(shù)據(jù)量,基本可以滿足本文所提模型對樣本量的需求,所以本文最終選擇使用FER-2013數(shù)據(jù)集進行模型的訓練。
經(jīng)典機器學習方法在表情識別方面存在泛化能力弱的問題,不能滿足移動端需求。而深度學習方法在移動端又有計算資源的限制,所以本文將搭建一個淺層神經(jīng)網(wǎng)絡。
AlexNet[35]在ILSVRC2012的表現(xiàn)引起轟動,隨后各種網(wǎng)絡結構紛紛被提出,表現(xiàn)也越來越好?;旧涎刂鴥蓚€方向在前行:在縱向不斷加深網(wǎng)絡,在橫向不斷拓寬網(wǎng)絡。在眾多網(wǎng)絡結構中,縱向加深的代表是VGGNet[36],該網(wǎng)絡摒棄了AlexNet中5×5和7×7卷積核,改用堆積的3×3卷積核,在ILSVRC2014比賽中大放異彩,后續(xù)諸多研究表明VGGNet在特征提取方面相較于其他深度網(wǎng)絡有明顯優(yōu)勢,原因可能在于堆積的3×3卷積核具有較好的感受野。
更深層的網(wǎng)絡具有更強的特征表達能力,其分類效果更好。但是深層網(wǎng)絡結構的參數(shù)也隨之大幅增加,這帶來兩個問題:需要更多的訓練樣本和大量的計算資源??紤]到公開的表情數(shù)據(jù)規(guī)模較小,且移動端算力有限,本文不直接使用深度網(wǎng)絡,而是搭建一個如圖1所示的淺層CNN模型。
在如圖1所示的網(wǎng)絡結構中,本文使用三組堆疊的卷積層來提取面部表情特征。堆疊的卷積層有助于增大感受野,便于更好地提取特征,這是提升識別率的關鍵。在三組卷積層中,卷積核大小均為3×3,第一組由3個卷積核數(shù)為32的卷積層組成,第二組由3個卷積核數(shù)為64的卷積層組成,第三組由2個卷積核數(shù)為128的卷積層和一個卷積核數(shù)為256的卷積層組成。這里每組的卷積核數(shù)量遞增是受VGGNet啟發(fā),以期獲得更豐富的特征。第一組和第二組之后均有尺寸為2×2的最大池化層,第三組的池化層在中間。每個卷積層之后都使用ReLU激活函數(shù)f(x)=max(x,0),即輸入小于0時輸出0,否則原樣輸出。為了加速訓練,以及避免學習率過高導致不良影響,在每組卷積層和激活層之間插入了BN(batch normalization)層[37]。
公開報道的用于表情識別的卷積神經(jīng)網(wǎng)絡中,大多數(shù)在卷積層和輸出層之間添加1個或者更多的全連接層,如文獻[20-22]均采用這種策略。其背后的考量是將末端的每個特征層(最后的卷積層的輸出)的每個像素均視作一個神經(jīng)元。與此截然不同的另外一種方式是GAP(global average pooling),其思想源自文獻[38],它將末端的每個特征層的平均值作為一個神經(jīng)元。相對而言,GAP更符合卷積的工作機理。事實上,經(jīng)過多次卷積和Pooling,最后提煉出來的均是高級特征,每個特征層中的像素應該高度相關。將像素單獨作為神經(jīng)元,會破壞它們之間的相關性。GAP策略正好可以避免這一問題,而且相比單像素策略,還能大幅節(jié)約參數(shù)。因此,本文選擇GAP策略,即在第三組卷積后連接一個GAP。
Adam優(yōu)化算法[40]可以高效地求解非凸優(yōu)化問題,且內(nèi)存占用少,被廣泛應用到深度學習的模型訓練中。本文采用該算法反向傳播更新參數(shù)。
表2 數(shù)據(jù)集的分配Tab.2 Distribution of data sets標簽Label數(shù)量Length用途UsageTraining28 709Train setPrivateTest3 589Test setPublicTest3 589Validation set
FER-2013數(shù)據(jù)集的每個樣本包括“emotion”“pixels”和“usage”三個部分。其中:“emotion”是表情標簽;“pixels”是圖像數(shù)據(jù);“usage”記錄了對應樣本的用途——用于訓練的“Training”,用于訓練過程中進行驗證的“PrivateTest”和用于訓練完成后測試模型的“PublicTest”。按照Usage記錄將樣本分為三個獨立的部分,如表2所示。 從表1來看,F(xiàn)ER-2013數(shù)據(jù)集各表情的樣本分布不均衡,特別是“厭惡”的樣本數(shù)只占其他類別數(shù)量的10%左右,這會嚴重影響該表情的識別效果。為此,本文先做樣本均衡化處理??紤]到樣本的特殊性,這里主要使用左右鏡像、隨機縮放、隨機調(diào)整亮度、隨機旋轉等方式增加“厭惡”樣本。
數(shù)據(jù)均衡化后,訓練樣本約3萬個。為了增強模型的泛化能力,在訓練過程中對樣本進行隨機增強。即,每讀入一個批次的樣本,先隨機增強然后再輸入到網(wǎng)絡中進行參數(shù)更新。
Google Colab是Google公司的一個研究項目,旨在為開發(fā)者提供一個云端的深度神經(jīng)網(wǎng)絡訓練平臺。其向開發(fā)者提供型號為Tesla T4的GPU設備,約12 GB的臨時RAM和約358 GB的臨時存儲空間。這樣的配置可以滿足前述模型訓練需求,所以本文使用該平臺進行訓練。
眾所周知,參數(shù)設置對模型訓練至關重要。經(jīng)過嘗試,本文的參數(shù)設置為:最大池化層后接的Dropout比率為0.3,平均池化層后接的Dropout比率為0.4;每個批次的樣本數(shù)為128,每輪訓練次數(shù)取224,即訓練樣本總數(shù)28 709除以每批樣本數(shù)128再取整;在驗證集上每批樣本數(shù)也為128;初始學習率設置為0.01,并對學習率進行動態(tài)下調(diào),以保證模型收斂。訓練過程中模型的準確率和損失的可視化結果如圖2所示。
分析圖2可知,訓練集上的準確率隨著訓練輪數(shù)在增加,損失在減少,說明模型訓練狀況良好;驗證集上的準確率和損失在經(jīng)過300輪訓練后均趨于平緩,說明此時模型的識別能力已經(jīng)達到極限,故訓練到300輪左右時得到最終的模型。
首先考慮模型在FER-2013測試集上的表現(xiàn),為此繪制了如圖3所示的混淆矩陣圖,橫軸為模型預測結果,縱軸是真實標簽。圖3是標準化的混淆矩陣(normalized confusion matrix),對角線的數(shù)值稱為召回率,表示成功預測出該表情的樣本量占該表情所有樣本的比例,該值越接近1,對應的矩陣塊顏色越深,模型對該表情的分類準確程度越高。從結果來看,該模型在“開心(happy)”和“驚訝(surprise)”這兩類表情的分類準確程度最高,“厭惡(disgust)”和“中性(neutral)”次之,其余表情的準確程度較差。
為了探究“恐懼(fear)”“傷心(sad)”和“生氣(angry)”表情召回率偏低的原因,進一步分析圖3。從“恐懼(fear)”所在行可以看出,約21%的“恐懼(fear)”表情預測為“傷心(sad)”,約12%預測為“中性(neutral)”,約10%預測為“生氣(angry)”,約7%預測為“驚訝(surprise)”,約3%預測為“開心(happy)”。從每種預測錯誤的表情中挑選2張,結果如圖4所示。從圖4來看,與這些樣本的真實標簽“恐懼(fear)”相比,預測的結果反倒更為合理。
這種情況在標注為“傷心(sad)”和“生氣(angry)”的樣本中也有出現(xiàn)。如圖5所示,原本標注為“傷心(sad)”和“生氣(angry)”的表情從圖像上來看并不符合實際情況,而模型預測的結果卻更貼近真實表情。通過查看預測有誤的全部樣本,得出結論:FER-2013測試集中關于“恐懼(fear)”“傷心(sad)”和“生氣(angry)”的標注有較多錯誤。這也正是這三種表情召回率偏低的主要原因。
當衡量模型在每個類別上的性能時,可以考察每個類別的精確率P、召回率R、F1值,其計算公式為:
P=PT/(PT+PF),R=PT/(PT+NF),F(xiàn)1=2PR/(P+R)。
其中:針對某種表情,PT表示正確預測為該表情的樣本(true positive)數(shù);PF表示預測為該表情但不是該表情的樣本(false positive)數(shù);NF表示是該表情但預測為其他表情的樣本(false negative)數(shù);NT表示不是該表情且預測結果也不是該表情的樣本(true negative)數(shù)。
當衡量模型在所有類別上的綜合性能時,可以考察準確率A,A=(PT+NT)/N。其中,N為測試樣本總數(shù)。
模型在FER-2013測試集上的各項指標如表3所示。
表3 模型在FER-2013測試集上的指標
各表情的精確率和召回率,基本相差不大,說明模型對各種表情沒有明顯的偏好。至于“恐懼(fear)”和“中性(neutral)”兩種表情的數(shù)據(jù)相差超過10%,主要是如上所述標簽不準所致。整體準確率為0.7,該值偏低的原因除了上述標簽錯誤以外,還在于FER-2013數(shù)據(jù)集存在異常樣本。這里分別從測試集和訓練集中針對每個表情選取一個樣本,結果如圖6所示。其中,測試集的“厭惡(disgust)”表情沒有發(fā)現(xiàn)異常樣本。
異常的情況有“文字圖像”“純色圖像”“圖標圖像”“少部分人臉”“人臉太小”“面具或者雕塑圖像”等,這些異常樣本對訓練和測試均構成干擾。正如Goodfellow等[33]指出的那樣:FER-2013數(shù)據(jù)集存在標注錯誤、樣本異常等問題,人類的識別率約為65%±5%。本文所提模型已經(jīng)達到人類識別率的上限,同時超越FER-2013面部表情識別挑戰(zhàn)賽的亞軍成績:在FER-2013測試集上,并行卷積網(wǎng)絡[20]、MobileNets+Softmax Loss[22]、挑戰(zhàn)賽的亞軍[33]、挑戰(zhàn)賽的冠軍[33],以及本文方法的準確率分別為0.66、0.69、0.69、0.71、0.70。
為了衡量模型的泛化能力,考慮模型在CK+數(shù)據(jù)集上的表現(xiàn)。CK+數(shù)據(jù)集與FER-2013數(shù)據(jù)集重合的表情有6種,所以這里只考慮這6種表情。為了公平起見,在CK+中隨機抽取20%的樣本,運行3次取各指標的平均值,準確率為0.76,其余各指標如表4所示。
結果表明,模型在“開心(happy)”和“驚訝(surprise)”上的泛化能力較強,而在其他表情上的泛化能力較弱。原因除了FER-2013樣本異常以及標注問題以外,還有面部表情本身也具有歧義性,不同人的不同情緒導致的面部特征可能會大相徑庭,例如:“生氣(anger)”和“厭惡(disgust)”均可能包含“皺眉”和“抿嘴”等,多數(shù)情況下人眼都難以準確辨別。而精確率較高的“開心(happy)”和“驚訝(surprise)”則均含有比較突出的面部特征,如“咧嘴笑”、“嘴部呈O形”等。所以該模型的分類效果基本符合預期。
表4 模型在CK+測試集上的指標
為了排除數(shù)據(jù)集的影響,更為客觀地評估模型的效果,凍結模型的卷積層,只在最后一層進行微調(diào)(fine tuning)。隨機抽取CK+中80%的樣本作為訓練集,在剩余樣本上測試,準確率為0.96,其余指標如表5所示。與表4對比,各項指標均大幅提升。
表5 模型微調(diào)后在CK+測試集上的指標
在186個測試樣本中,8個樣本預測錯誤。這些錯誤樣本如圖7所示。有3個標注為“生氣(angry)”的樣本預測為“厭惡(disgust)”,有1個標注為“厭惡(disgust)”的樣本預測為“生氣(angry)”。從圖7上來看,預測為“厭惡(disgust)”的后兩個和標注為“厭惡(disgust)”的樣本基本沒有區(qū)別,所以很難下定“預測錯誤”的結論;比較標注為“傷心(sad)”和“生氣(angry)”的樣本,特別是第1個與標注為“生氣(angry)”的樣本區(qū)分度也不是很大,難怪模型將其預測為“生氣(angry)”;將“恐懼(fear)”表情預測為“驚訝(surprise)”的情形,似乎人眼也很難確定這個表情到底是哪一個。這也進一步驗證了前文所述表情存在歧義性的事實。
本文主要針對iOS系統(tǒng)闡述開發(fā)流程。移動端移植的基礎是Core ML,這是一個由Apple公司發(fā)布的機器學習框架,其提供了一系列可以將機器學習模型集成到iOS App中的工具。使用Xcode進行移動端程序的開發(fā),編程語言選用Swift,使用Coremltools將訓練所得的TensorFlow模型轉換為Core ML格式的表情識別模型,用于后續(xù)的移動端開發(fā)。
步驟1:搭建平臺。在Xcode開發(fā)平臺,建立一個iOS工程項目,并創(chuàng)建一個“Single View App”(單視圖應用),開發(fā)語言選擇Swift。進入開發(fā)界面后,對主程序界面進行簡單的排版,并添加啟動頁圖片和App圖標;在“Info.plist”文件中,添加“Privacy-Camera Usage Description”條目,為程序授予攝像頭使用權限。
步驟2:人臉檢測。Xcode中集成的CIDetector API是Core Image框架中所提供的一個識別器,可以進行包括對人臉、物體、文本等對象的識別。為了簡化開發(fā)流程,本文直接使用CIDetector進行人臉檢測。使用時需要實例化一個CIDetector對象,并將攝像頭獲取的圖像數(shù)據(jù)傳入到CIDetector中,若在圖像中檢測到人臉,則會返回人臉區(qū)域的位置信息,再根據(jù)位置信息,對人臉圖像裁剪、預處理,為下一步做準備。
步驟3:表情識別。1)加載CIDetector人臉檢測器和表情識別模型;2)在sessionPrepare函數(shù)中,創(chuàng)建攝像頭會話,用于捕捉攝像頭畫面,捕捉到的畫面將被輸出到captureOutput函數(shù)中;3)重寫viewDidLayoutSubviews函數(shù)和viewDidLoad函數(shù),觸發(fā)攝像頭會話的捕獲動作;4)在captureOutput函數(shù)中,將捕捉到的攝像頭畫面依次傳入人臉檢測器和表情識別模型,將檢測到的人臉區(qū)域和表情識別結果輸出到視頻幀中;5)定義一個文本標簽組件,用于實時顯示預測結果。
實時表情識別App順利運行后,將自動開啟前置攝像頭,從攝像頭中實時檢測人臉區(qū)域,并將表情的預測結果顯示在屏幕下方。在iPhone 8 Plus上能夠流暢運行,效果截屏如圖8所示。圖8中,第一幅圖是應用啟動界面,其余圖是程序運行結果。
本研究依次做了“中性(neutral)”“驚訝(surprise)”“開心(happy)”“生氣(angry)”“傷心(sad)”“恐懼(fear)”和“厭惡(disgust)”7種表情,前面5種的識別結果與實際表情相符,后兩種與實際表情不符。本意做的“恐懼(fear)”表情被識別為“傷心(sad)”,本意做的“厭惡(disgust)”表情被識別為“生氣(angry)”。原因一方面是如前所述的模型對這兩種表情的識別率偏低,另一方面這兩個表情也確實具有歧義性,如果用人眼來判斷,也可能將它們判定為“傷心(sad)”和“生氣(angry)”。
為了滿足移動端的應用需求,本文搭建了一個淺層卷積神經(jīng)網(wǎng)絡,網(wǎng)絡結構為三組堆疊的卷積層外加一個全局平均池化層?;贔ER-2013表情數(shù)據(jù)集,在Google Colab平臺使用TensorFlow進行訓練,在FER-2013測試集和CK+數(shù)據(jù)集上均取得不錯的識別效果。使用Core ML將訓練好的模型移植到iOS移動端,在iPhone 8 Plus上能夠穩(wěn)定、流暢地運行。FER-2013數(shù)據(jù)集上的實驗結果表明該數(shù)據(jù)集存在異常樣本和標注錯誤的情況,這在一定程度上影響了模型的性能,影響到移動端的識別效果。在CK+數(shù)據(jù)集上微調(diào)的測試結果表明,規(guī)范的數(shù)據(jù)集可以進一步大幅提升模型的性能,這也說明本文所提模型具有較好的特征提取能力。未來只要有更加規(guī)范的數(shù)據(jù)集,數(shù)量足夠的各類樣本,部署在移動端的應用就會有更好的識別效果,也能更好地應對復雜應用場景。