周章輝, 譚功全
(四川輕化工大學自動化與信息工程學院, 四川 自貢 643000)
面部表情識別長期以來一直是計算機視覺領(lǐng)域的一項艱巨任務。隨著智能化的加快,各種服務機器人層出不窮,而服務機器人的成功無否,很大程度取決于一個機器人能否與用戶進行順暢的交流[1]。因此,機器人需要識別從用戶的臉上提取信息,比如識別感情、狀態(tài)或者性別。面部表情識別在其他領(lǐng)域也是比較熱門研究熱點,比如在網(wǎng)絡教育、智能家居、疲勞檢測、工作狀態(tài)檢測、百姓娛樂上,都有很大的應用前景,受到了廣大學者的關(guān)注[2]。而使用機器學習技術(shù)來正確解釋這些因素被廣泛地證明是復雜的,因為每個任務中的樣本具有可變性。傳統(tǒng)的機器學習是要先設計出特征提取的方法,對輸入的原始圖像進行特征提取,如從中提取眼睛周圍的紋理特征、嘴巴周圍的紋理特征、或者提取顏色特征和形狀特征,然后再設計出分類器,對提取的特征進行分類處理[3]。目前,傳統(tǒng)的面部表情特征提取方法有局部二元模式[4](Local Binary Pattern,LBP),gabor小波變換[5]和方向梯度直方圖(Histogram of Oriented Gradient,HOG)等。奧盧大學的Ojala等人提出LBP算法用來描述灰度圖像的局部紋理信息[6],2004年,Ahonen[7]等將LBP算法用于人臉識別領(lǐng)域以得到更高效的提取特征。在分類識別上,一般采用迭代算法(Adaboost)、支持向量機(SVM)等[8]。這些都是人為設計的一些特征提取方法,大都損失了原有圖像中的一些特征信息,實際檢測的精度受到了很大影響。而卷積神經(jīng)網(wǎng)絡的提出,對于解決面部表情識別問題來說,提供了很大的幫助。卷積神經(jīng)網(wǎng)絡(Convolutional Neural Network,CNN)是一種深度學習的算法,其最早于1998年由Yann Lecun[9]提出,其本質(zhì)為一個多層感知機,用來處理手寫數(shù)字識別問題。2012年提出的AlexNet[10],其層次更深,參數(shù)規(guī)模更大,并且引入了修正線性單元(Relu)作為激活函數(shù),在圖像識別中取得了較大的成功。2014年由牛津大學視覺組設計的VGGNet[11],采用小卷積堆疊的方式來搭建整個網(wǎng)絡,其深度達到了16層以上。同一年,Google研究設計的GoogleNet Inception V1[12],將多個不同尺度的卷積核、池化層進行整合,利用全局池化層代替全連接層,使得網(wǎng)絡參數(shù)量和模型大小大大減小,之后分別提出了Inception V2、Inception V3。本文基于GoogleNet Inception V3模型進行CNN改進,改進后的模型分為兩個通道,先用3×3的卷積核對輸入進行卷積操作,再進行通道的1×1卷積。同時采用L2正則化函數(shù),在每個卷積模塊后面都加入了Relu激活函數(shù)?;诟倪M模型,本文設計了一種可視化的人臉識別表情系統(tǒng),完成了人臉表情實時檢測和圖片輸入檢測的功能。并且在FER2013數(shù)據(jù)集上與主流的人臉表情識別算法進行對比,驗證了本文改進的網(wǎng)絡模型具有更好的性能。
CNN在本質(zhì)上是一種從輸入到輸出的映射,能夠?qū)W習較多的輸入到輸出的關(guān)系,但是不需要任何精確的數(shù)學表達式來表達輸入和輸出之間的關(guān)系,只需要用已知的模式對卷積網(wǎng)絡加以訓練,網(wǎng)絡就具有輸入輸出之間的映射關(guān)系[13]。并且CNN執(zhí)行的有監(jiān)督訓練模式,在訓練開始之前,用不同的隨機數(shù)對網(wǎng)絡的所有權(quán)值進行初始化。本文設計了一種用于人臉識別的深度卷積神經(jīng)網(wǎng)絡結(jié)構(gòu),如圖1所示,包括:(1)在卷積神經(jīng)網(wǎng)絡中加入了新的通道,成為雙通道卷積網(wǎng)絡,并且在新的通道中加入了卷積層;(2)在每個卷積模塊后面都加了一個Relu激活函數(shù);(3)采用與原網(wǎng)絡模型不同的L2正則化函數(shù)。
圖1 表情識別模型
圖1所示的模型含有15個卷積層,以此來形成網(wǎng)絡的特征提取,除了最后一個卷積層不進行批歸一化操作,其余卷積層都進行批歸一化操作。此結(jié)構(gòu)中包含4個殘差深度可分離卷積,每個卷積后面是一個批歸一化操作和Relu激活函數(shù)。最后一層加入了全局平均池化層和Softmax分類器來生成預測值。這個模型訓練總參數(shù)有58 423個,可訓練的參數(shù)有56 951個,不可訓練參數(shù)有1472個。輸入層輸入的48×48的圖像,卷積層1、卷積層2和最后一個卷積層7分別使用8個3×3的卷積核、8個3×3的卷積核和7個3×3的卷積核進行卷積操作。深度可分離卷積層1和深度可分離卷積2均分別使用16個、32個、64個、128個3×3卷積核進行卷積操作。卷積層3分別使用16個、32個、64個、128個1×1的卷積核進行卷積操作。最大池化層采樣窗口大小為3×3;Softmax層對全局平均池化層輸出的特征進行分類,將人臉分成憤怒、沮喪、恐懼、高興、悲傷、驚訝、中性。
CNN是一個前饋式神經(jīng)網(wǎng)絡,能從圖像中提取出拓撲結(jié)構(gòu),挖掘出數(shù)據(jù)在空間上的相關(guān)性,以減少訓練參數(shù)的數(shù)量,從而改進反向傳播算法來優(yōu)化網(wǎng)絡結(jié)構(gòu)的效率。其中的卷積層采用不同的卷積核分別與輸入到卷積層的特征圖進行卷積求和,將其正則化,再加上偏置,然后再經(jīng)過該層加入的激活函數(shù)最終輸出形成神經(jīng)元,也就是該層不同特征的特征圖[14]。通常來講,卷積層的計算公式為:
j= 1,2,…,N
(1)
θ(x)=max(0,x)
(2)
圖2 Relu激活函數(shù)圖像
卷積層作為特征提取層,其每個神經(jīng)元的輸入與前一層的局部感受相連接,提取出該局部的特征。卷積層1采用8個3×3的卷積核對48×48的圖像進行卷積操作,其特征圖的大小為(48-3+1)×(48-3+1)=46×46,得到8個46×46的特征圖。同理,卷積層2得到8個44×44的特征圖。深度可分離卷積層1與深度可分離卷積層2均分別得到16個44×44、32個22×22、64個11×11、128個6×6的特征圖。卷積層3分別得到16個22×22、32個11×11、64個6×6、128個3×3的特征圖。卷積層7等得到7個3×3的特征圖。
本文應用了兩個池化層,一個最大池化層(Max-Pooling)和一個平均池化層[15](Mean-Pooling)。為了避免將學習到的特征直接去訓練Softmax而帶來的維數(shù)過高的問題,在模型中加入了最大池化層,其目的是將特征圖的大小變小,使得特征圖的輸出具有平移不變性。全局平均池化層不改變輸入特征圖的大小,將每個特征圖轉(zhuǎn)化為一個值。比起使用全連接層減少了參數(shù),加快了訓練時間,且可以減少過擬合。
本次CNN設計的最后一層采用的是Softmax分類器。Softmax分類器實質(zhì)是一種邏輯回歸二分類器泛化到多類的情形,從新的角度做了與傳統(tǒng)的SVM不一樣的處理,即需要將輸入分量映射到概率域上做一個歸一化,保證其和為1,映射即是概率。其公式為:
(3)
(4)
其中:fj表示當前層的第j個特征圖;總體損失是Li遍歷訓練集之后的均值,再加上正則化項。
實驗使用Pycharm編輯器,在基于python3.65解釋器版本下的keras深度學習框架下進行編程。硬件平臺為組裝臺式機:AMD ryzen 2600 cpu、主頻3.4 GHz、內(nèi)存16 GB、Nvidia GeForce GTX1060 3 GB。
實驗使用的數(shù)據(jù)集為Kaggle比賽提供的一個數(shù)據(jù)集。該數(shù)據(jù)集包含28 709張訓練樣本,38 59張驗證數(shù)據(jù)集和3859張測試樣本,一共有35 887張包含生氣、討厭、恐懼、驚訝、悲傷、高興、正常這7種類別的圖像,圖像分辨率為48×48,如圖3所示。為了防止網(wǎng)絡過快地過擬合,本文對輸入圖像做了一些預處理:將采用Imagegenerator生成器對圖像進行旋轉(zhuǎn),變形和歸一化操作,同時擴充數(shù)據(jù)量,避免因數(shù)據(jù)量太少而導致過擬合。模型的優(yōu)化器采用Adam算法,為隨機梯度下降算法的變種,學習率最大值最小值設置為0.1,學習衰減率為0.1,隨著迭代次數(shù)的增長,其學習率也相應做改變。通過多次的調(diào)參實驗,經(jīng)過5000次的迭代訓練,本文設計的網(wǎng)絡模型在FER2013數(shù)據(jù)集上的識別效率達到66.7%,見表1。網(wǎng)絡訓練的過程中,網(wǎng)絡損失值逐步減少,整體過程趨于平穩(wěn),收斂情況不錯。圖4和圖5分別描述了本文設計的卷積神經(jīng)網(wǎng)絡的訓練準確率(train_acc)和驗證準確率(val_acc)。圖6和圖7分別描述了訓練損失值(train_loss)和驗證損失值(val_loss)。
圖3 表中設置的7類表情類別
表1本文方法在FER2013上的識別效率
圖4 在FER2013上訓練準確率曲線
圖5 在FER2013上驗證準確率曲線
圖6 在FER2013上訓練損失曲線
圖7 在FER2013上驗證損失曲線
從表1可以看出,本文模型對高興和驚訝這兩種表情的識別準確度最高,分別為88%和85,但是對于悲傷和恐懼這兩種表情的識別準確度較低,為47%和53%。猜想應該需要通過細化臉部的特征提取,以此來提高分類的精準度。
與傳統(tǒng)的算法在FER2013數(shù)據(jù)集上進行對比,結(jié)果見表2。其中,LBP是由Rivera設計的、使用了人工特征提取方法進行表情識別的算法[12],其識別精度略低于基于深度學習的算法。CNNs算法[16]使用并行卷積神經(jīng)網(wǎng)絡,且構(gòu)造了3個不同的通道,最終的識別效率達到65.6%。而本文設計的雙通道的卷積神經(jīng)網(wǎng)絡識別效率達到了66.7%,比LBP算法提高了1.2%,比三通道的CNNs算法提高了1.1%,說明本文設計的網(wǎng)絡模型在人臉表情上擁有更好的識別效率。
表2FER2013數(shù)據(jù)集上識別率對比
本文基于OpenCV(計算機視覺庫)技術(shù),實現(xiàn)了人臉表情的自動分類,同時實現(xiàn)了利用攝像頭實時識別人臉表情和在圖片中識別人臉表情的功能。并且利用python中集成的PyQt5庫文件,制作了人臉表情識別的可視化界面。具體的識別過程如下:首先是載入haarcascade_frontalface_default.xml人臉檢測模型、載入訓練好的人臉表情識別模型,然后輸入靜態(tài)圖片或者調(diào)用攝像頭采集人臉圖像信息,再對人臉進行檢測、定位,而后將檢測到的人臉圖像轉(zhuǎn)為灰度圖片,再從灰度圖片中提取出感興趣區(qū)域,將其大小轉(zhuǎn)換為64×64,之后用通過本文設計的卷積神經(jīng)網(wǎng)絡訓練后得到的人臉表情識別模型對檢測到的人臉進行表情識別,最后通過制作的可視化界面返回表情預測值。圖8為本文設計的人臉表情識別的系統(tǒng)框架圖。圖9為可視化人臉表情檢測界面,其中,“選擇模型”功能選擇的是本文訓練好的精度為66.7%的人臉表情識別模型;“實時攝像”調(diào)用的是電腦上安裝的聯(lián)想筆記本g410自帶的攝像頭,以實現(xiàn)人臉表情實時識別;“選擇圖片”功能就是選擇想要識別的圖片來對其進行表情識別;“用時”表示的是對輸入圖像進行表情識別分類所產(chǎn)生的時間;“識別結(jié)果”輸出的就是分類中最高概率的標簽。圖10為輸入圖片部分識別效果圖,其中,綠色框標出來的為檢測到的人臉部分,旁邊綠色的字樣為預測標簽;圖片右方為表情標簽的預測概率值,概率最高的則為輸出預測標簽值。
圖8 人臉表情識別系統(tǒng)框架圖
圖9 可視化人臉表情檢測界面
圖10 表情識別效果圖
由圖10可知,圖10(a)識別的是一張表情為憤怒的圖片,通過模型識別出來為憤怒的概率為65.54%,恐懼的概率為29.98,識別時間為0.451 s,選擇最高概率的類別作為輸出,所以該圖最終識別為憤怒的表情;圖10(b)識別的是一張表情為悲傷的圖片,通過模型識別出來為悲傷的概率為43.80%,正常的表情為34.13%,識別時間為0.502 s,選擇最高概率的類別作為輸出,所以該圖最終識別為悲傷的表情;圖10(c)識別的是一張表情為驚訝的圖片,通過模型識別出來為驚訝的概率為96.95%,害怕的概率為1.98%,識別時間為0.203 s,選擇最高概率的類別作為輸出,所以該圖最終識別為驚訝的表情;圖10(d)識別的是一張表情為高興的圖片,通過模型識別出來為高興的概率為52.56%,正常的概率為38.55%,識別時間為0.486 s,選擇最高概率的類別作為輸出,所以該圖最終識別為高興的的表情。該系統(tǒng)的UI界面簡潔、色彩舒適、交互簡單、實用性強,識別時間和識別結(jié)果都清晰可見,對于一般場景的應用十分合適。由4組表情識別實驗可知,識別圖片表情所用時間均遠遠低于1 s,所耗費時間成本低,滿足了人臉表情識別的實時性,且4組實驗的識別都正確,識別精度高。
本文基于GoogleNet對深度卷積神經(jīng)網(wǎng)絡進行了優(yōu)化調(diào)參,通過在Pycharm編輯器中,使用python解釋器,基于keras平臺構(gòu)建優(yōu)化后的深度卷積神經(jīng)網(wǎng)絡模型,以此來有效地對人臉表情進行識別。該卷積神經(jīng)網(wǎng)絡可以直接將圖像的像素值作為輸入,通過訓練數(shù)據(jù)集中劃分的訓練集來自主學習,不明顯地獲得輸入圖像更抽象的特征,而不需要如傳統(tǒng)人臉表情識別那樣給出具體的特征提取過程。且該人臉表情實時識別系統(tǒng)可以采用不同模型來應對不同的人臉表情識別場景。盡管本文的卷積神經(jīng)網(wǎng)絡盡可能地減少了參數(shù),提高了訓練速度,但在數(shù)據(jù)量較為稀缺的情況下,仍需要花費較長的時間進行訓練,相比較來說,此時傳統(tǒng)的機器學習方法更具優(yōu)勢。下一步的研究方向是進一步考慮各個層之間特征圖的關(guān)系,在超參數(shù)的選擇上進一步優(yōu)化,以及進一步優(yōu)化卷積神經(jīng)網(wǎng)絡的結(jié)構(gòu),以提高不同應用環(huán)境下的識別率和訓練速度。