周 婕,馬明棟
(1.南京郵電大學 通信與信息工程學院,江蘇 南京 210003;2.南京郵電大學 地理與生物信息學院,江蘇 南京 210003)
眾所周知,人臉表情作為非語言交際的一種形式,包含著豐富的情感信息,同時傳達出一些有關人的認知行為、性格和心理情緒,雖然顯示出的信息是比較隱晦的,但更能實時地、真實地反映出人的內心活動,真實性更高,且這種信息表達方式不能被其他方式所替代,因此人臉表情在人們的日常交流中占據著重要地位。隨著計算機技術的快速發(fā)展,人們對人工智能的研究更加深入,希望通過計算機能模擬人類行為,提高人類的生活質量,造福人類。因此人臉表情識別技術作為通過計算機來預測人類心理狀態(tài)的一種方式具有廣闊的應用前景,比如在教育、醫(yī)學、心理學、商業(yè)、安全駕駛等各大領域都有對此技術的研究。
人臉表情識別的關鍵就在于人臉不同表情特征點的提取,然而傳統(tǒng)的特征提取算法,如尺度不變特征變換(SIFT)、局部二值模式(LBP)等,不僅設計方法比較困難,而且特征點提取不完全,從而導致效率低下。因此,研究人員將卷積神經網絡如AlexNet、VGGNet、GoogleNet等用于人臉表情識別。卷積神經網絡以其能夠共享卷積核,對高維數(shù)據處理無壓力且特征分類效果好的獨特優(yōu)勢,在圖像、語音處理方面得到廣泛的應用。但隨著網絡深度的加深,學習能力的加強,反而造成了梯度爆炸和梯度消失,從而出現(xiàn)了所謂的“退化”問題,即優(yōu)化效果越來越差,測試數(shù)據和訓練數(shù)據的準確率也越來越低?;谶@樣的背景,He Kaiming等人提出了ResNet網絡模型,與其他網絡最主要的區(qū)別就是在卷積神經網絡中引入了殘差的思想,主要是通過添加shortcut連接,把通過跳層連接的梯度更新成一樣,解決了網絡變深之后,前面層次的網絡權值得不到更新,從而導致梯度消失的問題。
為了更加高效且準確地識別出人臉表情,該文提出了基于改進的ResNet卷積神經網絡,該網絡的參數(shù)量和運算量更少,能夠更快更好地提取人臉表情特征,且保存了“最有辨識力”的信息。同時為了能夠實時識別人臉表情,直接利用OpenCV中的基于Haar特征的人臉檢測分類器,實現(xiàn)了從視頻中抓取人臉,并加載訓練好的模型,最終實現(xiàn)對視頻人臉表情的實時識別系統(tǒng)。
OpenCV是開源的計算機視覺和機器學習軟件庫,可以運行在不同的操作系統(tǒng)上。它主要由C函數(shù)和C++類組成,但也提供了其他語言接口。OpenCV在圖像處理方面提供了很多通用算法,因此大大提高了圖像處理的效率。該文主要使用到它的視頻處理模塊和人臉檢測分類器。
視頻處理模塊主要是從視頻序列讀取幀,因此只需創(chuàng)建一個cv::VideoCapture類的實例,然后在一個循環(huán)中提取并顯示視頻的每幀就可以讀取數(shù)據進行處理了。
人臉檢測分類器主要是檢測并分割出人臉,本系統(tǒng)選用的是Haar特征加上Adaboost級聯(lián)分類器的組合。Haar特征是一種反映圖像灰度變化,像素分模塊求差值的特征,主要利用黑色和白色這兩種矩形組成特征模板,再用兩種矩形像素和的差值作為該特征模板的特征值。通常,人臉的眼睛要比臉頰顏色要深,鼻梁兩側比鼻梁顏色要深,嘴巴比周圍顏色要深等,因此,人臉的一些特征就可以由Haar特征來簡單描述。然而如果對一幅圖像采用全部的特征去檢測,效率必定非常低,因此Haar特征一般結合Adaboost級聯(lián)分類器,將全部特征分為各個階段,并且每個階段的特征是逐漸增加的,使得人臉檢測效率大大地提高了。
1.2.1 ResNet網絡的提出
深度卷積神經網絡起源于AlexNet網絡,后來針對此網絡的不足,研究人員又提出了VGGNet、GoogleNet等網絡,不難看出隨著網絡深度的增加,網絡的表達能力越來越強大,識別的速度和準確率也不斷上升,這是因為網絡越深,所能獲取的信息越多,提取的特征也越豐富。然而實驗表明不斷加深的網絡深度并沒有得到人們預期的識別結果,反而出現(xiàn)了“退化”現(xiàn)象,優(yōu)化效果變差,測試數(shù)據和訓練數(shù)據的準確率也降低了,這是因為網絡的加深會造成梯度爆炸和梯度消失的問題。針對這個現(xiàn)象,對輸入數(shù)據和中間層的數(shù)據進行歸一化操作,這種方法可以保證網絡在反向傳播中采用隨機梯度下降(SGD),從而讓網絡達到收斂。但是歸一化操作只能解決深度為幾十層的網絡的梯度消失問題,如果網絡深度再加深的話,這種方法就無效了。
為了讓更深的網絡也能訓練出好的效果,He Kaiming等人提出了新的網絡結構—ResNet,通過使用Residual Unit成功訓練了深度為152層的卷積神經網絡,并在ILSVRC 2015比賽中獲得了冠軍。ResNet網絡在獲得低誤差率,需要較小的參數(shù)量和計算量的同時,也加快了模型訓練的速度,使得訓練模型的效果非常突出。
ResNet較之于其他網絡,最主要的區(qū)別就是在卷積神經網絡中引入了殘差函數(shù)。ResNet網絡在內部的殘差塊使用了跳躍連接,這樣做的好處是緩解了在卷積神經網絡中增加深度帶來的梯度消失的問題,使得ResNet網絡容易優(yōu)化,即能夠通過增加網絡的深度來提高準確率。
1.2.2 ResNet網絡結構
ResNet網絡見圖1,主要由輸入部分、卷積部分以及輸出部分組成,其中卷積部分又分為四個階段。
圖1 ResNet網絡結構
由圖1可知,ResNet網絡的輸入部分主要由大卷積核和最大池化這兩個部分組成,這一步的目的是為了將大像素的輸入圖像變成小像素的特征圖像,在盡量保留含有信息的特征點的同時,也減少了存儲所需的大小。
中間卷積部分是此網絡結構的核心,引入的殘差塊將輸入數(shù)據分成兩條路,如圖2,一條路經過2個卷積核為3*3的卷積層,另一條路則直接短接(shortcut),通過shortcut將輸入和輸出進行一個element-wise的加疊,這個簡單的加法不僅不會為網絡增加額外的參數(shù)和計算量,而且還可以加快模型的訓練速度,提高模型的訓練效果,這樣做可以有效地解決梯度爆炸和梯度消失的問題。最終兩條路相加并經過ReLU激活函數(shù)處理后輸出。這一步的目的是為了實現(xiàn)特征信息的提取。
圖2 ResNet殘差塊
最后的輸出部分先是通過全局自適應平滑池化,然后接全連接層輸出,這樣做的好處是首先通過GAP減少了參數(shù)的數(shù)量,降低過擬合的發(fā)生幾率,再連接FC就是高度提純的特征,方便交給最后的分類器。
1.3.1 殘差塊的優(yōu)化
Basicblock結構如圖2,將輸入數(shù)據分成兩條路,一條路經過卷積層,另一條路則直接短接(shortcut),最終兩條路相加并經過relu激活函數(shù)處理后輸出。Bottleneck結構如圖3,對殘差塊做了計算優(yōu)化,即將兩個3*3的卷積層替換為兩個1*1的卷積層加上一個3*3的卷積層,雖然在原來的結構上增加了一個卷積層,但是通過第一個1*1卷積層的降維處理后又在最后一個1*1卷積層下進行了還原處理,這樣做既保持了精度又減少了計算量。直接計算來計較一下兩個結構的計算量,比如說,對于256維的輸入特征,Bottleneck結構的參數(shù)數(shù)目為1×1×256×64+3×3×64×64+1×1×64×256=69 632,Basicblock結構的參數(shù)數(shù)目為(3×3×256×256)×2=1 179 648,計算量簡化了約6%。
圖3 ResNet殘差塊的優(yōu)化
1.3.2 下采樣部分的改進
原本的下采樣是在每個階段的第一個卷積下去做的,這樣做的后果就是輸入數(shù)據會通過一個stride=2的1*1卷積,直接使得特征圖的尺寸縮小了一半,大量的特征信息丟失,使訓練的模型不夠精確,從而導致識別率降低。因此,該文將下采樣這一步驟轉移到3*3的卷積里面,這樣做的好處就是避免大量的信息流失,使特征信息的提取更加完整。
1.3.3 激活函數(shù)的改進
ResNet網絡是在每個卷積之后都加入了ReLU激活函數(shù),主要目的是為了引入非線性因素,將神經網絡可以應用到非線性模型中,提高神經網絡對模型的表達能力。
ReLU的函數(shù)公式是f
(x
)=max(0,x
),函數(shù)圖像如圖4所示。圖4 ReLU激活函數(shù)圖像
ReLU函數(shù)能夠加快計算與收斂速度,而且在一定程度上緩解梯度消失的問題,但是從ReLU的函數(shù)圖像中可以看出如果輸入小于0的話,經ReLU函數(shù)激活后輸出為0,這相當于完全沒有激活,這個函數(shù)也是“死掉的”,即產生所謂的“dying relu”問題,導致后面的權值不再更新,影響到網絡的表達能力。因此嘗試用PReLU激活函數(shù)替代ReLU函數(shù)。
PReLU的函數(shù)公式是f
(x
)=max(a
×x
,x
),函數(shù)圖像如圖5所示。圖5 PReLU激活函數(shù)圖像
從圖中可以看出在負數(shù)區(qū)域內,PReLU有一個很小的斜率,這樣既保留了ReLU函數(shù)的優(yōu)點,同時又能避免“dying relu”問題。同時調整PReLU的位置,將相加后的激活函數(shù)移入殘差塊內部,加強模型的表達能力。
基于改進的ResNet網絡的人臉表情識別系統(tǒng)的整體流程設計如圖6所示。該系統(tǒng)主要由三個部分組成,分別是視頻數(shù)據的讀取、人臉檢測與人臉圖像提取、人臉表情的預測及結果輸出。
圖6 系統(tǒng)流程
視頻數(shù)據的讀?。河捎谝曨l或攝像頭的實時畫面是由一幀一幀的圖像組成,因此動態(tài)的數(shù)據讀取本質上是圖像的讀取。該文使用OpenCV的VideoCapture 函數(shù)讀取攝像頭數(shù)據也就是當前幀圖像,將獲取的實時畫面數(shù)據存放在定義的Mat數(shù)據容器(frame)中,并判斷frame是否為空,若不為空則使用窗口顯示讀取到的圖像。
人臉檢測與人臉圖像提?。哼@步的作用主要是定位到人臉圖像并截取出來,為之后的人臉表情識別做準備。本系統(tǒng)利用OpenCV自帶的Haar特征人臉檢測器。Haar特征主要是根據人臉的立體感造成的灰度變化而通過像素分模塊求差值,這樣,人臉的一些特征就可以由Haar特征來簡單描述,再結合Adaboost級聯(lián)分類器,將全部特征分為各個階段,提高人臉檢測效率。OpenCV已經包含許多用于臉部、眼睛、嘴巴等的預先分類器,這些XML文件存儲在opencv/data/haarcascades/文件夾中。首先加載所需的XML分類器,XML中存放的是訓練后的特征池,其中特征大小是根據訓練時的參數(shù)而定,然后以灰度模式加載輸入圖像(或視頻),最后就可以在圖像中定位人臉位置,如果找到人臉的話,它會以坐標形式返回檢測到的臉部的位置從而提取出人臉圖像。整個人臉檢測過程的原理是將存放在XML中的每個固定大小的特征與輸入圖像同樣大小的區(qū)域進行對比,如果相符則記錄此矩形區(qū)域的位置,然后滑動窗口,重復以上步驟檢測圖像的其他區(qū)域。
人臉表情預測及結果輸出:以Tensorflow2.0深度學習框架為基礎實現(xiàn)改進后的卷積神經網絡來訓練模型,再利用訓練好的模型完成對人臉表情的預測,并判斷抓取的人臉表情屬于哪個標簽,最后輸出識別結果。
該文選取Fer2013數(shù)據集作為人臉表情識別研究的數(shù)據集,雖然該數(shù)據集的測試集存在許多標簽的錯誤,導致測試精度不是很高,但本身已劃分了訓練集、驗證集和測試集,因此選用該數(shù)據集,有利于在相同條件下將文中方法與其他相關方法進行比較。
Fer2013人臉表情數(shù)據集由35 886張人臉表情圖片組成,其中,訓練圖(Training)28 708張,公共驗證圖(PublicTest)和私有驗證圖(PrivateTest)各3 589張,每張圖片是由大小固定為48*48的灰度圖像組成,共有7種表情,分別對應于數(shù)字標簽0~6,具體表情對應的標簽和中英文如下:0 anger 生氣;1 disgust 厭惡;2 fear 恐懼;3 happy 開心;4 sad 傷心;5 surprised 驚訝;6 normal 中性。
數(shù)據集并沒有直接給出圖片,而是將表情、圖片數(shù)據、用途的數(shù)據保存到csv文件中,第一列表示表情標簽,第二列為原始圖片數(shù)據,最后一列為用途。這樣處理數(shù)據的目的是為了方便訓練時讀取數(shù)據。
一般來說,訓練的數(shù)據量越大,系統(tǒng)的識別率也越精確,因此,為了得到一個比較成功的神經網絡,就需要大量的參數(shù)。然而,實際情況中,并沒有這么多的數(shù)據可以用于訓練,因此,在將數(shù)據提供給模型之前進行擴充即增強數(shù)據。數(shù)據集增強主要是為了加大訓練的數(shù)據量,提高模型的泛化能力及模型的魯棒性,減少網絡的過擬合現(xiàn)象。該文通過對訓練圖片進行如隨機縮放、翻轉、平移、旋轉等變換操作來增強數(shù)據,使數(shù)據集的數(shù)據量增加了數(shù)十倍。
將增強后的Fer2013數(shù)據集分別放入ResNet和改進后的ResNet網絡中進行訓練和測試,可以得到如表1所示的準確率。ResNet在Fer2013數(shù)據集上的準確率為70.3%,改進后的ResNet在相同數(shù)據集上的準確率為73.2%,準確率提高了將近3%,說明改進后的ResNet網絡確實能夠提高人臉表情的識別率。
表1 不同模型在數(shù)據集上的準確率對比
得到訓練模型后,加載OpenCV自帶的Haar特征的人臉檢測器和訓練好的模型,先是通過攝像頭按幀讀取圖像,然后從圖像中檢測出并截取出人臉,利用訓練好的模型完成對人臉表情的預測,判斷抓取的人臉表情屬于哪個標簽,最后輸出識別結果。改進方法的效果如圖7所示,結果可以接受。
圖7 識別結果
本系統(tǒng)實現(xiàn)了結合深度學習來進行人臉表情識別的輸出,主要是基于傳統(tǒng)ResNet網絡的基本結構,并對其進行了優(yōu)化。輸入和輸出部分仍保持原來的結構,主要是對中間的卷積部分進行了改進:將中間卷積部分改為前后各一個卷積核為1*1的卷積層,中間是卷積核大小為3*3的卷積層,這樣做既可以減少計算量又可以保持精確度不下降;將下采樣移到后面的3*3卷積里面去做,目的是為了減少信息的流失,最大程度地保證有信息量的特征點保留下來;用PReLU替代ReLU函數(shù),同時調整激活函數(shù)的位置,可以在提高神經網絡對模型表達能力的同時避免出現(xiàn)“dying relu”的問題。最后的實驗結果表明,與傳統(tǒng)ResNet模型相比,改進的網絡結構減少了計算量,提高了識別速度以及識別率。