劉春平,高翔,張建偉,陳虎
(四川大學計算機學院,成都 610065;四川川大智勝軟件股份有限公司,成都 610065)
計算機視覺即使用計算機及相關設備對生物視覺的一種模擬,模擬人類視覺處理和反饋的過程。隨著人工智能熱潮,計算機視覺也融入了人工智能的強大新技術,進而發展迅猛,應用廣泛。其中就有大家熟知的人臉檢測[1]、人臉識別[2]、人臉表情遷移[3]等對于人臉的計算機視覺研究。通過攝像頭獲取人臉信息,計算機對這些信息進行檢測、跟蹤和識別,再對這些結果進行分析和應用。攝像頭相當于電腦的眼睛,計算機就是處理從攝像頭獲取的信息的大腦,用以模擬人的視覺全過程,完成相關的動作和任務。二維人臉表情遷移,就是讓一個目標人臉圖片,根據攝像頭所獲取的目標人臉表情的變化而改變其表情、神態和面部動作。人臉表情的動態遷移的相關應用很廣泛,例如加入人工智能設計成可視化人工智能客服、虛擬遠程老師、動畫設計、影視演員特效和可視化人機交互等。正是未來應用的廣泛和計算機視覺技術的發展,吸引了國內外大量的研究者對人臉表情遷移的研究。現有的二維人臉表情遷移[1],是基于一張人臉圖片到另一張人臉圖片的,沒有動態實時的效果,沒有神態和面部動作的變化。還有一種二維人臉表情的遷移是基于gan生成對抗網絡的face2face[4],雖然可以實時動態生成表情遷移視頻,但是,生成的視頻的每一幀都很模糊和變型,而且算法實現過程較為復雜,需要硬件來支持訓練模型。本文介紹了一種讓靜態的人臉跟著動態的視頻或者攝像頭生動流暢地動起來的方法,即表情的實時動態遷移。就是在dlib[5]的人臉關鍵點[3]檢測模型的基礎上,利用二維人臉有效的信息,實時動態逼真展現人臉表情動態遷移,算法簡單,表情動態遷移的結果比較準確自然。本文將從以下四個方面來介紹基于人臉關鍵點的表情實時動態遷移核心方法:
(1)利用dlib人臉檢測,提高人臉識別和關鍵點[6]檢測精度和速度。
(2)實時視頻獲取,實時生成,實現動態人臉表情遷移顯示。
(3)紋理映射時對關鍵點進行Delaunay三角剖分[7],提高紋理映射效果。
(4)關鍵點的優化調整,利用曲線擬合方法調整關鍵點的個數和位置,使臉部細節表現更準確。
首先從攝像頭或者本地視頻獲取幀,然后通過dlib的人臉檢測檢測出人臉,從人臉上獲取68個關鍵點存入shapes。68個關鍵點獲取后通過本文的嘴部曲線擬合調整嘴部關鍵點的個數和位置,生成最終72個關鍵點。連續捕獲三幀,獲取幀間變化量dx,然后將目標圖片人臉上獲取的關鍵點作為基本點,融合dx,生成目標關鍵點,從目標圖片獲取紋理信息,以目標關鍵點為基礎進行紋理映射最后顯示。連續如上處理,即可獲得表情動態遷移效果。總體算法描述請看圖1。總體算法要求每一步的處理效率高,使得最后的視頻流暢性和實時性好,而且關鍵點的檢測準確度必須很好,所以本文選用了關鍵點檢測準確度高的dlib庫,在其公開的人臉關鍵點檢測模型的基礎上進行實驗和研究。

圖1 總體算法描述圖
dlib是一個現代的C++工具包,包含機器學習算法和工具,它廣泛應用于工業界和學術界,在C++中創建復雜的軟件來解決實際問題,例如嵌入式設備、機器人、人工智能和大型高性能計算環境等。本文使用dlib的人臉檢測和人臉關鍵點的檢測,在準確率和效果上明顯優于OpenCV的人臉檢測算法,但是在單純的人臉檢測方面,后者稍微快一些,為了提人臉檢測和人臉關鍵點的精度,本文采用dlib庫,使用dlib官方提供的特征提取器預訓練模型,用于獲取人臉的68個關鍵點,如圖2。檢測效果如圖3。

圖2 dlib 68個關鍵點分布

圖3 關鍵點的檢測
對于人臉表情遷移來說,嘴部動作的細節表現能夠影響到整個臉部的表情逼真程度,所以嘴部輪廓的處理需要細化處理。由于原始獲得的68個關鍵點嘴部只有20個關鍵點,而且在分布上有4個點對于嘴部動作的表示粗略,所以,本文首先對20個嘴部關鍵點進行分組,然后進行曲線擬合實驗,最終找到一個簡單而且誤差較小的擬合方式,請看圖4嘴部輪廓曲線擬合。
由于dlib的嘴部20個點密度太低,嘴部連線不光滑,在嘴部動作模擬的時候,細節表現不好。所以,本文在處理嘴部貼圖的時候,進行了嘴部曲線擬合。通過已有的20個嘴部關鍵點,擬合出6條平滑曲線,效果如上圖所示。經過分析和實驗,將上嘴唇分成4條曲線,下嘴唇分為兩條曲線。
曲線①②⑤⑥擬合的方程為y=Ax2+Bx+C;
③④最后擬合的曲線為y=Ax3+Bx2+Cx+D。

圖4 嘴部輪廓曲線擬合
三角剖分的目的是為了在仿射變換的過程中確定紋理坐標點和目標坐標點之間的一一對應關系,當然,三角剖分的方法很多,本文利用Delaunay三角剖分算法,提高貼圖的準確性和貼圖細節表現。Delaunay三角剖分算法的特性[8]:以最近的三點形成三角形,且各線段(三角形的邊)皆不相交。不論從區域何處開始構建,最終都將得到一致的結果。任意兩個相鄰三角形形成的凸多邊形的對角線如果可以互換的話,那么兩個三角形六個內角中最小的角度不會變大。如果將三角網中的每個三角形的最小角進行升序排列,則Delaunay三角網的排列得到的數值最大。新增、刪除、移動某一個頂點時只會影響臨近的三角形。三角網最外層的邊界形成一個凸多邊形的外殼。
本文將獲取的68個關鍵點進行了Delaunay三角剖分,發現嘴部的4個點有問題,沒有將嘴唇和牙齒分開,如圖5為原始68個點的Delaunay三角剖分,圖6為嘴部有缺陷的4個點。于是本文對68個關鍵點進行處理后獲得的72個關鍵點的Delaunay三角剖分,圖7所示,增加了4個點。如圖7是調整后嘴部的點的Delaunay三角剖分結果,解決了原來關鍵點的嘴部缺陷。圖8為整個臉部的三角剖分最后的圖,圖9為紋理映射效果對比圖。

圖5 68個關鍵點的Delaunay三角剖分結果

圖6 嘴部有缺陷的關鍵點Delaunay三角剖分結果

圖7 調整后嘴部的點的Delaunay三角剖分結果

圖8 最終紋理三角剖分效果
最后,每一幀的紋理映射結果如圖9所示。

圖9紋理映射結果
由于本文是二維表情的動態遷移,所以利用了一些動態遷移的實現過程算法。首先,需要解決的問題是,視頻(攝像頭)的兩幀之間關鍵點的動態捕獲需要準確及時,獲取之后兩幀之間的變化差d(xi,yi)需要進行疊加到目標關鍵點上。公式如下:

Gj(xi,yi)是目標當前關鍵點坐標,Gj-1(xi,yi)表示前一幀的坐標,Dj(xi,yi)表示兩幀的變化量。為了讓Dj(xi,yi)更能表現目標前后兩幀的變化量,采用了幀間平滑處理,本文的Dj(xi,yi)是通過捕獲源視頻的連續3幀的關鍵點坐標,然后進行加權平均作平滑。減少了關鍵點的抖動和誤差,提高了輸出視頻的流暢性。算法演示如圖10所示。由于不同的人臉的臉型差別很大,所以,在關鍵點運動的時候,每個點的移動量Dj(xi,yi)不同步,需要對每一個點的Dj(xi,yi)加一個偏移量,這個偏移量需要準確計算。

圖10 D(x,y)和G(x,y)
圖11所示,第二張圖片里面的關鍵點時目標關鍵點經過計算后生成的結果,未改變原有目標人臉的臉型。

圖11 源幀關鍵點和處理后目標關鍵點對比圖
根據圖12可知,在68個關鍵點和本文通過曲線擬合方法擴展的點的區域內,表情遷移的效果準確和真實。包括源視頻(攝像頭)中的頭的便宜和旋轉。但是,由于二維圖像的局限性,使得源人臉的旋轉角度過大,如果偏轉過于明顯,臉部表情會有一些誤差。由于表情遷移過程中牙齒的變化很大,不能單一的通過紋理變換貼圖的方式表現牙齒變化,可以通過深度學習和圖像融合的方式進行下一步設計和實驗。

圖12 動態人臉表情遷移效果演示
該程序運行的界面效果如圖13所示,在Qt平臺上作的可視化界面,左上角為源視頻(攝像頭)獲取的幀的顯示,左下角為源視頻(攝像頭)關鍵點的實時顯示,右下角為目標人臉紋理,右上角為動態表情遷移的結果顯示,軟件上面有4個按鈕,getImage是獲取紋理,camara是打開攝像頭,video獲取本地視頻。

圖13 動態演示程序界面
本文在dlib人臉檢測和關鍵點獲取的基礎上擴展了其他關鍵點,通過動態獲取視頻(攝像頭)人臉關鍵點,設計了二維人臉表情的動態遷移。達到了實時的流暢的人臉表情的變化和仿真,實時生動。將二維靜態的表情遷移進行了動態展示,為了提高流暢性,使用了幀間平滑處理,效果明顯。最后把動態表情遷移效果用Qt、C++進行了實現和展現。在后續的研究中,將對人臉背景和人物說話時嘴巴牙齒部分的研究,使得遷移效果更加逼真和準確。二維人臉信息的二維局限使得表情遷移和動作的表現不能很好表示三維的信息,例如,深度和旋轉角度,但是本文在二維有限的信息量的基礎上,利用了紋理映射的變化,例如,壓縮、拉伸、位移、二維旋轉、仿射變換等,比較生動地遷移了視頻(攝像頭)的表情、神態和臉部動作。