昝曉菲
(北京交通大學(xué) 計(jì)算機(jī)與信息技術(shù)學(xué)院,北京 100044)
隨著虛擬現(xiàn)實(shí)及動(dòng)畫產(chǎn)業(yè)的高速發(fā)展,人體運(yùn)動(dòng)捕捉技術(shù)扮演著越來越重要的角色。然而,由于人體運(yùn)動(dòng)捕捉設(shè)備價(jià)格昂貴、設(shè)備的使用對(duì)場(chǎng)地及人員的要求過高等因素,人體運(yùn)動(dòng)捕捉數(shù)據(jù)的獲取是一件成本很大、門檻很高的事情。這大大制約了相關(guān)產(chǎn)業(yè)的發(fā)展。人體運(yùn)動(dòng)捕捉數(shù)據(jù)的重用技術(shù)則是解決運(yùn)動(dòng)數(shù)據(jù)獲取成本較高的有效手段。通過人體運(yùn)動(dòng)捕捉數(shù)據(jù)的重用技術(shù),可以利用運(yùn)動(dòng)數(shù)據(jù)庫(kù)中已經(jīng)存在的運(yùn)動(dòng)捕捉數(shù)據(jù)生成逼真的新的指定運(yùn)動(dòng)序列,從而提高數(shù)據(jù)的利用率,擺脫運(yùn)動(dòng)捕捉設(shè)備的限制。
在動(dòng)畫制作中,虛擬角色的運(yùn)動(dòng)往往需要具有鮮明的風(fēng)格。但是,傳統(tǒng)的人體運(yùn)動(dòng)捕捉技術(shù)很難滿足眾多的人體運(yùn)動(dòng)風(fēng)格需求;如果依靠動(dòng)畫師進(jìn)行人工處理,這項(xiàng)工作也十分繁瑣,需要耗費(fèi)大量的精力。
本文所研究的人體運(yùn)動(dòng)風(fēng)格轉(zhuǎn)換這一運(yùn)動(dòng)數(shù)據(jù)重用技術(shù),可以通過計(jì)算機(jī)自動(dòng)地將一段普通的運(yùn)動(dòng)序列轉(zhuǎn)換為具有指定的鮮明運(yùn)動(dòng)風(fēng)格的新運(yùn)動(dòng)。例如,把一段正常行走的運(yùn)動(dòng)序列轉(zhuǎn)換成具有垂頭喪氣行走風(fēng)格的運(yùn)動(dòng)序列。人體運(yùn)動(dòng)非常復(fù)雜,人體運(yùn)動(dòng)捕捉數(shù)據(jù)由大量的骨骼關(guān)節(jié)數(shù)據(jù)組成,這些對(duì)生成自然且符合期望的新運(yùn)動(dòng)帶來了很大的挑戰(zhàn)。
本文將功能強(qiáng)大的深度學(xué)習(xí)網(wǎng)絡(luò)應(yīng)用到人體運(yùn)動(dòng)數(shù)據(jù)重用領(lǐng)域,構(gòu)建出一個(gè)基于深度卷積自編碼器的模型來解決人體運(yùn)動(dòng)風(fēng)格轉(zhuǎn)換問題。
在人體運(yùn)動(dòng)合成領(lǐng)域,Kovar等[1]最早提出運(yùn)動(dòng)圖的合成方法。運(yùn)動(dòng)圖是由大量的運(yùn)動(dòng)數(shù)據(jù)生成的表示運(yùn)動(dòng)數(shù)據(jù)之間相關(guān)關(guān)系的一種數(shù)據(jù)結(jié)構(gòu)。根據(jù)用戶的需求可以在所構(gòu)造的運(yùn)動(dòng)圖中搜索最優(yōu)的運(yùn)動(dòng)路徑,最后生成具有獨(dú)特風(fēng)格的新運(yùn)動(dòng)。但是,這類方法容易產(chǎn)生腳步滑動(dòng)、運(yùn)動(dòng)不自然等問題。參數(shù)化的合成方法可以有效地解決這些問題。Kwon[2]等將運(yùn)動(dòng)速度、加速度、落腳點(diǎn)等因素構(gòu)造為參數(shù),添加到合成模型中。通過這樣的控制可以使新合成的運(yùn)動(dòng)大大減少腳步滑動(dòng)、漂移等問題。Min等[3]使用主成分分析法對(duì)運(yùn)動(dòng)數(shù)據(jù)進(jìn)行降維,得到與人體運(yùn)動(dòng)緊密相關(guān)的低維參數(shù),然后通過對(duì)低維參數(shù)的修改達(dá)到合成的目的,最后將處理后的數(shù)據(jù)恢復(fù)到原來的空間。
近年來,各種深度學(xué)習(xí)模型的出現(xiàn)對(duì)圖像處理及自然語言處理等領(lǐng)域的發(fā)展有很大的推動(dòng)作用。深度學(xué)習(xí)模型重要的優(yōu)點(diǎn)之一就是它可以自動(dòng)地從數(shù)據(jù)集中學(xué)習(xí)到數(shù)據(jù)的特征,這為數(shù)據(jù)的編輯和處理提供了新的研究方向。Gatys等[4]利用深度網(wǎng)絡(luò)模型分別在隱層提取圖像的風(fēng)格特征和內(nèi)容特征,然后通過在隱層的編輯處理,最后可以得到保持原來圖像的內(nèi)容但風(fēng)格不同的新圖像。在運(yùn)動(dòng)數(shù)據(jù)重用領(lǐng)域,Taylor等[5]構(gòu)建出一個(gè)受限玻爾茲曼機(jī)的模型,通過提取運(yùn)動(dòng)的相關(guān)參數(shù)來進(jìn)行運(yùn)動(dòng)混合,以生成新的運(yùn)動(dòng)。Holden等[6]提出一種基于深度網(wǎng)絡(luò)框架的模型,該方法通過對(duì)大量運(yùn)動(dòng)數(shù)據(jù)的學(xué)習(xí)得到一個(gè)關(guān)于數(shù)據(jù)集的運(yùn)動(dòng)特征空間,在特征空間進(jìn)行特征編輯最后達(dá)到運(yùn)動(dòng)合成的目的。
運(yùn)動(dòng)流形是大量有效的自然運(yùn)動(dòng)所構(gòu)成的一個(gè)子空間,它也是由大量人體運(yùn)動(dòng)數(shù)據(jù)提取構(gòu)造出的特征空間。在本文中,運(yùn)動(dòng)流形由深度卷積自編碼器的隱層單元所表示。該隱層單元可以表示運(yùn)動(dòng)數(shù)據(jù)時(shí)序與姿態(tài)的高度相關(guān)性。經(jīng)此深度卷積自編碼器的隱層單元處理重新生成的運(yùn)動(dòng)序列具有生動(dòng)自然、流暢逼真的特點(diǎn)。
本文使用的人體運(yùn)動(dòng)捕捉數(shù)據(jù)來自于卡內(nèi)基梅隆大學(xué)運(yùn)動(dòng)捕捉數(shù)據(jù)庫(kù)(CMU Motion Capture Datebase)[7]。該數(shù)據(jù)庫(kù)共有2605組人體運(yùn)動(dòng)序列。其運(yùn)動(dòng)數(shù)據(jù)所對(duì)應(yīng)的人體骨骼架構(gòu)如圖1所示。為了處理方便,把原來120幀每秒的數(shù)據(jù)調(diào)整為60幀每秒,同時(shí)對(duì)所有的數(shù)據(jù)進(jìn)行歸一化處理。
圖1 人體骨骼架構(gòu)
為了得到運(yùn)動(dòng)的流形空間和提取運(yùn)動(dòng)數(shù)據(jù)的特征,本文構(gòu)建了一個(gè)具有三個(gè)隱層的卷積自編碼器[8]。自編碼器的網(wǎng)絡(luò)結(jié)構(gòu)如圖2所示。在此卷積網(wǎng)絡(luò)中,網(wǎng)絡(luò)的每一個(gè)隱層都表示了不同層次的運(yùn)動(dòng)流形。網(wǎng)絡(luò)的L1、L2、L3隱層對(duì)應(yīng)的濾波器的大小分別設(shè)置為3063、3064、30128。此卷積自編碼器提供了前向操作和反向操作。前向操作就是自編碼器的編碼過程,把輸入的運(yùn)動(dòng)序列X編碼成在隱層空間的值H;反向操作就是自編碼器的解碼過程,把在隱層的值H進(jìn)行解碼生成運(yùn)動(dòng)序列。
圖2 深度卷積自編碼器的網(wǎng)絡(luò)結(jié)構(gòu)
在對(duì)網(wǎng)絡(luò)的每一層進(jìn)行前向操作時(shí),首先對(duì)輸入的數(shù)據(jù)進(jìn)行卷積操作;然后再用一維最大池化方法來進(jìn)行時(shí)域約減;最后,再對(duì)約減后的數(shù)據(jù)進(jìn)行非線性映射操作ReLu[9]。這樣,就得到了運(yùn)動(dòng)數(shù)據(jù)在隱層的運(yùn)動(dòng)流形。
對(duì)于第k層網(wǎng)絡(luò),給定卷積操作*、最大池化操作Ψ、權(quán)重矩陣Wk和偏置bk,前向操作的定義如下式所示:
Φk(X)=ReLu(Ψ(X*Wk+bk))
(1)
其中,矩陣在對(duì)每一層進(jìn)行反向操作時(shí),只需要把前向操作反轉(zhuǎn)即可。需要特別注意的是反池化操作。在單獨(dú)訓(xùn)練每一層網(wǎng)絡(luò)時(shí),反池化操作就是在每個(gè)隱層單元所對(duì)應(yīng)的兩個(gè)單元中隨機(jī)選取一個(gè)賦予池化值,然后把另一個(gè)單元置零;在最后進(jìn)行網(wǎng)絡(luò)的微調(diào)訓(xùn)練階段或者是使用網(wǎng)絡(luò)生成新的運(yùn)動(dòng)序列時(shí),反池化操作和平均池化一樣將兩個(gè)對(duì)應(yīng)的單元都設(shè)為池化值。這樣,新生成的運(yùn)動(dòng)序列會(huì)更加流暢。
(2)
權(quán)重矩陣Kk初始化[10]為一些小的數(shù)值,偏置bk初始化為0。
網(wǎng)絡(luò)模型的訓(xùn)練通過輸入的運(yùn)動(dòng)序列X經(jīng)過前向操作和反向操作來完成。訓(xùn)練分為兩個(gè)階段。首先對(duì)網(wǎng)絡(luò)的每一層進(jìn)行單獨(dú)訓(xùn)練,然后再對(duì)整個(gè)網(wǎng)絡(luò)進(jìn)行微調(diào)訓(xùn)練。網(wǎng)絡(luò)訓(xùn)練可以視為一個(gè)最優(yōu)化問題,通過最小化下面的損失函數(shù)可以求得網(wǎng)絡(luò)對(duì)應(yīng)的參數(shù)θ={W,b}。
(3)
在這個(gè)式子中,第一項(xiàng)度量的是生成運(yùn)動(dòng)序列與輸入運(yùn)動(dòng)序列誤差的平方;第二項(xiàng)是對(duì)網(wǎng)絡(luò)參數(shù)數(shù)量的限制,用來保證盡可能使用最少數(shù)目的參數(shù)來構(gòu)建網(wǎng)絡(luò)。
在使用CMU運(yùn)動(dòng)捕捉數(shù)據(jù)庫(kù)的2605組運(yùn)動(dòng)序列完成網(wǎng)絡(luò)的訓(xùn)練后[11],這些濾波器可以表示運(yùn)動(dòng)庫(kù)中各種運(yùn)動(dòng)的時(shí)序與姿態(tài)的強(qiáng)相關(guān)特征。網(wǎng)絡(luò)中隱層的層級(jí)越深,得到的這種運(yùn)動(dòng)特征就越抽象、越具有概括性。
在進(jìn)行運(yùn)動(dòng)風(fēng)格轉(zhuǎn)換時(shí),需要輸入一段具有鮮明運(yùn)動(dòng)風(fēng)格的運(yùn)動(dòng)序列,即運(yùn)動(dòng)風(fēng)格序列;同時(shí),還需要輸入期望它的運(yùn)動(dòng)風(fēng)格發(fā)生轉(zhuǎn)換的序列,即運(yùn)動(dòng)內(nèi)容序列。在進(jìn)行運(yùn)動(dòng)風(fēng)格轉(zhuǎn)換之后,新生成的運(yùn)動(dòng)序列同時(shí)具有前者的運(yùn)動(dòng)風(fēng)格和后者的運(yùn)動(dòng)內(nèi)容。因此,在轉(zhuǎn)換時(shí)需要先使用訓(xùn)練好的深度卷積自編碼器把運(yùn)動(dòng)內(nèi)容序列的內(nèi)容特征和運(yùn)動(dòng)風(fēng)格序列的風(fēng)格特征分別提取出來;然后,在深度卷積自編碼器的隱層單元對(duì)隨機(jī)初始化生成的運(yùn)動(dòng)數(shù)據(jù)建立約束進(jìn)行訓(xùn)練;最后,再通過反向操作輸出風(fēng)格轉(zhuǎn)換后的新運(yùn)動(dòng)序列。
根據(jù)深度卷積網(wǎng)絡(luò)的特性,運(yùn)動(dòng)序列的內(nèi)容特征可以定義為運(yùn)動(dòng)序列在深度卷積網(wǎng)絡(luò)中的隱層值。由于池化操作減小了運(yùn)動(dòng)數(shù)據(jù)在時(shí)域上的分辨率,所以層級(jí)越淺的隱層對(duì)運(yùn)動(dòng)內(nèi)容的完成性的保持就越好。由于網(wǎng)絡(luò)的層級(jí)越深,隱層值所表達(dá)的內(nèi)容就越抽象。所以,層級(jí)越深對(duì)運(yùn)動(dòng)風(fēng)格的概括性就越好。運(yùn)動(dòng)序列的風(fēng)格特征具體可以使用Gram矩陣來計(jì)算。
利用訓(xùn)練好的深度卷積自編碼器,可以分別提取運(yùn)動(dòng)內(nèi)容序列的內(nèi)容特征和運(yùn)動(dòng)風(fēng)格序列的風(fēng)格特征。根據(jù)網(wǎng)絡(luò)層級(jí)與特征的關(guān)系,本文使用深度卷積自編碼器的L1隱層也就是最淺的隱層來提取運(yùn)動(dòng)序列的內(nèi)容特征,使用L3隱層也就是最深的隱層來提取運(yùn)動(dòng)序列的風(fēng)格特征。這樣會(huì)得到更為準(zhǔn)確的內(nèi)容及風(fēng)格特征。
對(duì)運(yùn)動(dòng)風(fēng)格轉(zhuǎn)換建立的約束包括運(yùn)動(dòng)內(nèi)容約束和運(yùn)動(dòng)風(fēng)格約束兩個(gè)部分。首先,為了避免生成的轉(zhuǎn)換后的運(yùn)動(dòng)序列偏向于運(yùn)動(dòng)內(nèi)容或者是偏向于運(yùn)動(dòng)風(fēng)格,在網(wǎng)絡(luò)的L2隱層利用白噪聲初始化得到得隱層值Ht。網(wǎng)絡(luò)最后輸出的轉(zhuǎn)換后的運(yùn)動(dòng)序列就是由Ht通過反向操作生成的。對(duì)于運(yùn)動(dòng)內(nèi)容約束,即是Ht在L1隱層的值與運(yùn)動(dòng)內(nèi)容序列在L1隱層的值建立的約束。內(nèi)容約束的定義如下:
(4)
對(duì)于風(fēng)格約束,即是Ht在L3隱層的值與運(yùn)動(dòng)風(fēng)格序列在L3隱層的值建立的約束。風(fēng)格約束的定義如下:
(5)
其中,Φ3(S)是輸入的運(yùn)動(dòng)風(fēng)格序列由式(1)進(jìn)行三次前向操作傳到網(wǎng)絡(luò)L3隱層的值,Φ3(Ht)是由網(wǎng)絡(luò)L2隱層的初始值Ht由式(1)進(jìn)行一次前向操作傳到網(wǎng)絡(luò)L3隱層的值。函數(shù)G用來計(jì)算格萊姆矩陣,表示為隱層單元的內(nèi)積。函數(shù)G的定義如下式所示:
(6)
其中,H是網(wǎng)絡(luò)隱層單元的值。
為了進(jìn)行運(yùn)動(dòng)風(fēng)格轉(zhuǎn)換,本文將式(4)中的運(yùn)動(dòng)內(nèi)容約束和式(5)中的運(yùn)動(dòng)風(fēng)格約束合并成整體轉(zhuǎn)換約束進(jìn)行訓(xùn)練。這樣,通過不斷變換L2隱層值Ht使整體轉(zhuǎn)換約束達(dá)到最小。最后,可以得到使整體轉(zhuǎn)換約束最小時(shí)對(duì)應(yīng)的Ht。把Ht進(jìn)行反向操作就可以得到轉(zhuǎn)換后的新運(yùn)動(dòng)序列。整體轉(zhuǎn)換約束定義為:
Ltranster=cLcontent+sLstyle
(7)
其中,參數(shù)c和s是約束系數(shù),用來調(diào)節(jié)運(yùn)動(dòng)內(nèi)容和運(yùn)動(dòng)風(fēng)格的相對(duì)重要性。在本文中,c和s分別設(shè)置為1.00和0.01。
本文的目標(biāo)是通過深度卷積自編碼器,在運(yùn)動(dòng)內(nèi)容序列的基礎(chǔ)上生成具有另一種風(fēng)格的新的運(yùn)動(dòng)序列。這段新的運(yùn)動(dòng)序列同時(shí)具有原來的運(yùn)動(dòng)內(nèi)容和指定的運(yùn)動(dòng)風(fēng)格。例如,輸入一段具有老人行走風(fēng)格的運(yùn)動(dòng)序列S作為運(yùn)動(dòng)風(fēng)格序列,再輸入另一段普通行走的運(yùn)動(dòng)序列C作為運(yùn)動(dòng)內(nèi)容序列。經(jīng)過深度卷積自編碼器處理,可以把普通行走的運(yùn)動(dòng)序列C轉(zhuǎn)換成也具有老人行走風(fēng)格的新運(yùn)動(dòng)序列T。
實(shí)驗(yàn)中,分別使用了老人行走風(fēng)格的運(yùn)動(dòng)序列、僵尸行走風(fēng)格的運(yùn)動(dòng)序列、沮喪行走風(fēng)格的運(yùn)動(dòng)序列等分別作為運(yùn)動(dòng)風(fēng)格序列與普通運(yùn)動(dòng)序列相結(jié)合,把沒有鮮明風(fēng)格的普通運(yùn)動(dòng)序列轉(zhuǎn)換成了具有不同鮮明風(fēng)格的新運(yùn)動(dòng)序列。部分實(shí)驗(yàn)結(jié)果如圖3、圖4、圖5所示。
(a) (b)圖3 老人行走風(fēng)格轉(zhuǎn)換
(a) (b)圖4 僵尸行走風(fēng)格轉(zhuǎn)換
(a) (b)圖5 沮喪行走風(fēng)格轉(zhuǎn)換
圖3(a)是具有老人行走風(fēng)格的運(yùn)動(dòng)序列,圖中的動(dòng)畫角色以佝僂的姿態(tài)慢慢行走;將圖3(b)左側(cè)普通的運(yùn)動(dòng)序列進(jìn)行對(duì)應(yīng)的轉(zhuǎn)換后,生成的圖3(b)右側(cè)轉(zhuǎn)換后的運(yùn)動(dòng)序列同樣也具有了老人行走的運(yùn)動(dòng)風(fēng)格。圖4(a)是具有僵尸行走風(fēng)格的運(yùn)動(dòng)序列,圖中的動(dòng)畫角色手臂伸直、走路搖擺,將圖4(b)右側(cè)普通的運(yùn)動(dòng)序列進(jìn)行對(duì)應(yīng)的風(fēng)格轉(zhuǎn)換后,生成的圖4(b)左側(cè)轉(zhuǎn)換后的運(yùn)動(dòng)序列同樣也具有僵尸行走風(fēng)格。圖5(a)是具有沮喪風(fēng)格的運(yùn)動(dòng)序列,圖中的角色垂頭喪氣地行走著,將圖5(b)右側(cè)的普通運(yùn)動(dòng)序列進(jìn)行對(duì)應(yīng)的風(fēng)格轉(zhuǎn)換后,生成的圖5(b)左側(cè)轉(zhuǎn)換后的運(yùn)動(dòng)序列同樣也具有明顯的沮喪風(fēng)格。
風(fēng)格轉(zhuǎn)換后的運(yùn)動(dòng)序列具有了新的運(yùn)動(dòng)風(fēng)格,同時(shí)保留著原來的運(yùn)動(dòng)內(nèi)容,比如運(yùn)動(dòng)的類型和運(yùn)動(dòng)軌跡。但是,這些運(yùn)動(dòng)內(nèi)容也會(huì)發(fā)生一些微小的變化。這是因?yàn)檫\(yùn)動(dòng)風(fēng)格的改變會(huì)對(duì)運(yùn)動(dòng)的類型和軌跡帶來影響。具體來說,運(yùn)動(dòng)步伐的大小和頻率也是運(yùn)動(dòng)風(fēng)格的一部分,它們的改變會(huì)對(duì)運(yùn)動(dòng)類型和運(yùn)動(dòng)軌跡有一定影響??梢酝ㄟ^調(diào)節(jié)式(7)中c和s的相對(duì)大小來調(diào)節(jié)轉(zhuǎn)換后的運(yùn)動(dòng)序列,通過調(diào)節(jié)可以使它偏向于特定的運(yùn)動(dòng)風(fēng)格或是特定的運(yùn)動(dòng)內(nèi)容。
本文將近幾年發(fā)展迅猛的深度學(xué)習(xí)技術(shù)應(yīng)用到人體運(yùn)動(dòng)捕捉數(shù)據(jù)重用領(lǐng)域,提出了基于深度卷積自編碼器的運(yùn)動(dòng)風(fēng)格轉(zhuǎn)換模型。該模型可以有效地實(shí)現(xiàn)對(duì)運(yùn)動(dòng)序列的運(yùn)動(dòng)風(fēng)格的轉(zhuǎn)換。不同于傳統(tǒng)的人體運(yùn)動(dòng)捕捉數(shù)據(jù)重用技術(shù),該模型在操作時(shí)無需對(duì)運(yùn)動(dòng)數(shù)據(jù)進(jìn)行大量的人工處理,具有很高的工作效率。另外,它不僅具有良好的轉(zhuǎn)換效果,該模型還有著較強(qiáng)的泛化能力。未來將考慮把此模型推廣到視頻人體運(yùn)動(dòng)研究領(lǐng)域。