李佳希 蔡思堃 趙長寬 張 昱 陳 默 于 戈
(東北大學計算機科學與工程學院 沈陽 110169)
自2012年大規模在線開放課程誕生以來,經過數年的發展,已經對教育教學改革產生重大影響。政府、高校正在圍繞實現“確保包容、公平和有質量的教育,促進全民享有終身學習機會”目標,積極推動利用“人工智能、大數據發展、信息通信技術等信息化手段推動教育可持續發展”[1]。隨著大規模在線開放課程的快速發展,開展線上和線下相結合的混合式教學改革正在成為課堂教學的重要方向。
相對傳統的e-learning系統,大規模在線開放課程力求滿足來自不同國家、不同年齡層次的、數以萬計的學習者共同的學習一門課程的需求,并嘗試通過海量數據實現個性教學目標。在當前的大規模在線開放課程教學中,教學錄像依然是教學資源主體。但是基于教學錄像的教學交互,這是一種單向的傳播行為。師生和生生互動,更多需要借助在線練習、測試、互評作業和論壇等異步方式開展。在傳統的課堂教學中,可以開展包括對話、手勢、表情等形式多樣的交互形式。另外,師生可以視教學交互成果,靈活調整教學交互內容。線下教學具備的自然、親切、富有人文情感的交互形式是大規模在線課程所欠缺的。
情感對人類活動的影響是顯而易見的,情感對認知、注意力、記憶和推理的影響已經獲得心理學、教育學和神經生物學等領域的關注[2]。隨著語音、視頻、傳感器、無線網絡、增強現實技術發展[3],基于情感計算深入洞察教學交互主體的情感互動與交流,將有助于提升大規模在線開放課程和混合式課程的教學質量和水平。
依據面部表情照片,計算其蘊含的情感,并將其歸入Paul Ekman提出的六種基本情感(包括生氣、害怕、厭惡、開心、傷心和驚訝)之一[5],是情感計算的核心任務之一。直接辨別與基于面部動作編碼系統(Facial Action Coding System,FACS)的符號判別是主流的研究方法[6],已經取得很多成果。但是,此類研究所用數據大多數來自于實驗室采集而非現實場景,例如FERPlus、AffectNet、Emotio-Net、MMI和SFEW/AFEW等[4],其特點是以專門采集的正面的、清晰的面部照片為主體,如圖1所示。
但是現實場景中,由于拍攝視角問題,很難獲得正面照片,很多都是側面的、扭曲或有遮擋的劣質圖像。例如,圖2展示幾張影視作品中的表情照片,受制于電影場景設計和鏡頭限制,很難獲得正面照片。針對現實場景中的情感計算,僅僅依賴單張的面部表情照片,需要在計算模型和算法方面取得較大的突破,難度較大。目前已經初步建立了相關數據集,例如Aff-Wild和EMOTIC[7],相關的研究工作開始啟動。
一個表情動作的發生,是在一個時間段內完成的,基于視頻錄像中的連續圖像序列,利用表情動作的時間連續性[8~9],臨近時間段的圖像信息可以彌補劣質圖像帶來的問題,是解決表情識別一條重要的技術路線。本文嘗試將表情圖像序列中多張圖像對齊后,疊加合成復合圖像,作為神經網絡模型的輸入,實現表情識別,主要貢獻如下:

圖2 現實場景下面部表情照片示例
1)使用表情公開數據集The MUG Facial Expression Database,經過數據清洗后,提取表情強度較大的高質量時序幀圖像,對每張圖像進行仿射變換,并將圖像進行疊加,得到臨近時刻的復合圖像。
2)構建卷積神經網絡模型,對復合圖像分類,實現表情識別,并且通過實驗驗證算法的有效性。
基于面部動作單元(Action Unit,AU)的情感計算思想是將與表情緊密相關的面部肌肉動作命名為動作單元,并發現動作單元組合與情感之間的關聯關系,實現情感識別。FACS從面部圖像中抽取重要的27個面部AU和20個眼部和頭部位置作為情感計算基礎,并制定了分類規則庫,從1978開始,Paul Eckman不定期發布FACS使用手冊[11],其最新版本為2020年由牛津大學出版社發行的《What the Face Reveals》。
由于面部動作本身是在三維空間中完成,從計算機視覺的角度,從二維圖像自動識別動作單元依然存在很多的困難[12]。為了解決此問題,形成如下三條技術路線。
1)基于面部的AU計算。以表情動作時間連續性為前提,利用時序圖像,識別AU。其研究方法細分為基于AU特征點的方法[12~13]、基于面部圖像的方法[14~15]和基于動態紋理[10,16]的方法。
2)基于多模態數據的識別方法:基于語音[17~18]、肢體[19]、心跳[20],以及對話[21~23]的關聯信息,或者多模態數據融合的方法。
3)重構三維圖像的方法,通過多角度照片重構面部三維圖像[24]。
在表情分類研究方面,前期主要采用方法包括SVM[25]和HMM[13],近期開始嘗試使用深度卷積神經網絡模型,例如CNN[26]和LSTM[27]等等。
基于圖像序列的識別方法包括多幀圖像融合[28~29]、學習不同強度表情、深度時空網絡等,Zhao[30]等提出一種基于峰值引導的神經網絡PPDN,通過建立峰值與非峰值表情之間的映射關系來解決微小表情難以識別的問題。在此基礎上,Yu[31]等提出深度級聯峰值引導網絡DCPN,采用更深的網絡來提取特征。深度時空網絡適合具有空間關系和時間規律的數據,例如RNN、LSTM等。Kahou[32]等利用CNN提取視頻序列中每幀圖像的高層語義特征,然后使用RNN提取這些特征的時序依賴關系,進而實現動態人臉表情識別。
本文中,使用YP=F(ZP,W)來表示表情計算問題,其中ZP是表情序列中的第P個表情,W表示訓練模型中的相關參數,輸入的表情序列在參數W的模型計算后,得到表情的預測標簽YP。
face_recognition是一個基于C++開源庫dlib中的深度學習模型以及python開發的人臉識別庫。使用face_recognition的標定臉部特征點模塊標定表情序列圖像首張表情圖像的臉部特征點,從視頻(圖像序列)中檢測出人臉,并標定68個臉部特征點,對特征點進行旋轉平移的仿射變換。人臉特征點對應的臉部器官如表1所示。將特征點移動到圖像中央,利用線性插值算法連接相鄰的臉部特征點生成臉部輪廓特征圖,如式(1)所示。以首張表情圖像的臉部輪廓特征圖為基準,對后續所有臉部特征點進行歸一化操作后連接生成臉部輪廓特征圖。最后將整個表情序列圖像的臉部輪廓特征圖疊加在一張空白的同尺寸圖像中,生成表情特征圖。

表1 人臉特征點對應表(face_recognition庫提供)
算法1 生成表情特征圖算法
ALGORITHM1:Generate expression feature graph
Input:expression_file_path
Output:feature_picture
feature_picture=image.new
For每種表情素材
For每個表情序列
For每張圖像
提取每張圖像的特征點且歸一化處理。
將圖像平移到圖像中央。
將特征點連成線畫在空白圖像上并疊加。
End
feature.save(path)
End
End

這是整個算法的核心,也是本文創新點,特征提取過程使用了一個合理高效的方式生成了對于機器來說可識別的表情符號,如圖3所示。

圖3 生成表情特征圖
仿射變換是整個特征提取過程中最關鍵的一步。表情計算依賴于人臉檢測功能的穩定性和標定臉部特征點的準確性。基于圖像序列的表情計算需要處理大批量的臉部圖像。本文使用的數據集約有972*80=77760張圖像,隨著識別圖像數量的提升,標定臉部特征點功能產生的錯誤也越來越多。并且志愿者們的頭部也會有些微的偏轉與變化,因此使用仿射變換來降低這兩個因素帶來的影響,在可接受范圍內校準了表情序列圖像的臉部特征點,舍棄了超出可接受范圍內異常的臉部特征點。
算法2 仿射變換算法
ALGORITHM2:Affine transformation
Input:face_landmarks,cordinate_origin,rotate_radian
Output:new_face_landmarks
For每個特征點
減去鼻梁底部的橫坐標與縱坐標得到新坐標
(x,y)=each.(x,y)-cordinate_origin.(x,y)
計算旋轉角
radian=math.atan(distance.x/y)
distance=math.sqrt(x*x,y*y)
new_y=distance*math.cos(radian-rotate_radian)
new_x=distance*math.sin(radian-rotate_radian)
連接變換后的特征點并平移到圖像中心
new_face_landmarks.appen(each)End
設首張臉部圖像鼻梁上下距離為L,后續臉部圖像的鼻梁上下距離為L',計算縮放比k=L/L'。因為人類的鼻梁不會隨著表情的變化而變化,所以以鼻梁底部為坐標原點建立新坐標系。第一步在原有的坐標系下將所有特征點減去鼻梁底部的橫坐標與縱坐標再乘以縮放比k,得到新坐標系下的特征點坐標。第二步是計算旋轉角,按照表1提供的特征點位置,取鼻梁頂點(x27),y27與坐標原點(x31),y31。以順時針為正,逆時針為負,計算旋轉角q。坐標示意圖如圖4所示。
第三步利用平面距離公式計算每個特征坐標原點的距離rj。
第四步計算每個特征點與x軸正向的夾角b。

第五步根據旋轉角q、距離rj和夾角b計算仿射變換后的特征點坐標M',j為特征點序號。再連接變換后的臉部特征點,平移到圖像中心生成臉部輪廓特征圖,如圖5所示。


圖4 特征點坐標示意圖

圖5 特征點仿射變換示意圖
使用上述方法處理臉部表情序列圖像,生成規范的臉部輪廓特征圖,最終將一個表情序列的臉部輪廓特征圖疊加后得到表情特征圖。
本文構建了專門識別臉部特征圖的卷積神經網絡。該網絡主要分為兩個部分,前端特征提取由卷積層和池化層組成,后端分類器進行預測。整體架構圖如圖6所示。

圖6 ConvNet整體架構圖
輸入層使用單色表情特征圖作為輸入數據。然后使用兩個3×3的卷積層和兩個最大池化層,之后扁平化池化層的輸出。最后使用Softmax回歸分類器進行分類。在特征提取器和輸出層之間,添加一個dropout層來防止過擬合。該問題是一個多分類問題,需要一個具有7個節點(對應七種表情)的輸出層來預測屬于這7個類中每個類的圖像的概率分布。所有層都使用he權重初始化方案。
損失函數使用交叉熵作為損失指標,如式(6)所示,其中概率分布p為期望輸出,概率分布q為實際輸出,H(p,q)為交叉熵。

本實驗的硬件環境如下:Windows10操作系統,16GB DDR3內存,i7-10750H CPU,NVIDIA Ge-Force RTX 2060M 6GB的GPU硬件環境。軟件環境為Python3.6,TensorFlow 2.0.0版本,編譯器為JetBrains PyCharm Community Edition 2020。
本文使用face_recognition工具開發了識別模塊,該模塊能檢測出視頻中的臉部圖像區域并進行人臉識別將圖像區域保存到對應文件夾中。
由于表情強度較弱的低質量圖像對于表情識別的貢獻較少,清洗掉這些圖像對結果不會有太大影響,同時使用實驗室采集的標準圖像也可以對模型進行驗證,因此本文采用公開的表情圖像數據集The MUG Facial Expression Database作為訓練數據并對其進行數據清洗。該數據集由希臘亞里士多德大學的Multimedia Understanding Group創建,克服了其他數據庫分辨率低,照明不均勻主題不明確等問題。數據集由20~35歲的35名女性,51名男性,共86名志愿者的面部表情圖像序列組成。每個圖像以jpg格式保存,896×896,大小范圍為240KB~340KB。每個志愿者根據FACS手冊定義的六種情緒原型,自愿選擇做出相對應的情緒表達[34]。表4為通過不同方式公開發表的各個表情的數量。

表4 MUG Facial Expression Database中每種表情的數量
一個志愿者的七種表情數據壓縮在一個文件夾中,文件夾根據志愿者拍攝順序編號命名。需要以Ekman提出的六種基本表情再加上平靜表情為標簽對原始數據進行分類,重新進行人工標注。經過手動分類,最終獲得憤怒、厭惡、害怕、開心、傷心、驚訝、平靜共七類,954組素材。
雖然算法在特征提取步驟應用仿射變換降低了錯誤的表情特征圖的數量,但是仍有部分表情特征圖具有嚴重的偏差,例如有雙下巴的男性,算法有時會錯誤地把雙下巴區域當成臉部區域,原本的下巴區域則被當成了嘴部區域,從而生成一張部分正確,部分錯誤的表情特征圖。
4.3.1 預處理與特征提取
經過預處理特征提取工作后,最終的表情特征如圖7所示,可以看出不同的表情呈現出較大差異,證明預處理的工作有助于后續卷積神經網絡的分類。

圖7 六種基本表情特征圖
4.3.2 神經網絡
使用tensorflow框架構建的卷積神經網絡進行100輪epoch的訓練,訓練過程如表3和圖8所示。

表3 總體模型評價

圖8 模型訓練過程直方圖
最終在測試集上的準確率為0.881,實驗過程中的混淆矩陣如圖9所示,可以看出在fear、neutral和sadness上的效果較差,誤分類主要出現在anger和surprise上,分析其原因,這三個表情的特征差異不如其他四種表情顯著,有一定的相似性,需要進一步改進模型來提高識別率。

圖9 混淆矩陣
本文使用單張未疊加的特征圖以及未進行仿射變換的特征圖進行對比,前者混淆矩陣如圖10所示,后者混淆矩陣如圖11所示,準確率對比如表4所示。通過對比可以看出,使用經過仿射變換并疊加的特征圖作為表情計算輸入的效果明顯更優,這表明仿射變換和時序圖像疊加是有助于表情識別的。

表4 三種方法對比

圖10 未疊加特征圖的混淆矩陣

圖11 未進行仿射變換征圖的混淆矩陣
本文針對7種基本表情,使用人臉特征點定位算法,捕捉表情序列視頻中的每一幀人臉圖像的特征點,經過仿射變換和簡單疊加后得到表情特征圖。結合卷積神經網絡進行分類識別,得到最終表情結果。實驗結果表明時序圖像包含了豐富的表情信息,有利于提高表情計算的準確率。
本文所使用的訓練集源于實驗室。實驗者在拍攝基本表情視頻時事先經過培訓,拍攝環境有著嚴格的光照控制。而在真實的課堂環境下,很難完整且清晰地捕捉到每位學習者的臉部表情變化。因此下一步的工作需要在教室環境下,利用有限的攝像頭資源捕捉到足夠清晰且是正臉的表情素材,以應用于更復雜的真實課堂環境中。