單張A100,50億步訓(xùn)練!英偉達(dá)開源最強(qiáng)虛擬角色定制模型,超逼真動(dòng)作零樣本生成,游戲動(dòng)畫行業(yè)要變天
8月8日深夜,英偉達(dá)CEO黃仁勛,再次登上了世界頂級(jí)計(jì)算機(jī)圖形學(xué)會(huì)議SIGGRAPH的舞臺(tái),用一系列重磅更新展示了在AI和元宇宙方向上的野心。
而就在最近,被SIGGRAPH 2023收錄的CALM模型的正式開源,也讓游戲和動(dòng)畫開發(fā)直接飆上了AI加持的快車道。
CALM可以自學(xué)「人類的動(dòng)作」,無需額外訓(xùn)練就能自由合成和控制虛擬角色的動(dòng)作,效果逼真自然。
也許很快整個(gè)游戲、動(dòng)畫工業(yè)的格局就要徹底改變,而VR場(chǎng)景中的人物和角色也將從此不再生硬,元宇宙可能真的要加速到來了!
AI控制角色蹲行靠近目標(biāo),當(dāng)距離足夠近時(shí)踢腿,最后舉起雙臂慶祝
具體來說,英偉達(dá)聯(lián)合以色列理工學(xué)院、巴伊蘭大學(xué)和西蒙菲莎大學(xué),共同提出了一種全新的條件對(duì)抗?jié)撃P停–onditional Adversarial Latent Models,CALM)。
通過模仿學(xué)習(xí),CALM學(xué)習(xí)到了一種可以捕捉人類動(dòng)作復(fù)雜性和多樣性的動(dòng)作表征,并能直接控制角色的動(dòng)作。
該方法可以聯(lián)合學(xué)習(xí)控制策略和動(dòng)作編碼器,對(duì)給定動(dòng)作的關(guān)鍵特征進(jìn)行重建,而不僅僅是復(fù)制。
結(jié)果表明,CALM可以通過學(xué)習(xí)語義動(dòng)作表征,對(duì)生成的動(dòng)作進(jìn)行控制,并且為更高層的任務(wù)訓(xùn)練提供風(fēng)格調(diào)整。
訓(xùn)練完成后,用戶就可以利用像電腦游戲一樣的界面,非常直觀地對(duì)角色進(jìn)行控制了。
論文地址:https://arxiv.org/abs/2305.02195
項(xiàng)目地址:https://github.com/NVlabs/CALM
實(shí)現(xiàn)方法
CALM以對(duì)抗性技能嵌入為基礎(chǔ),并借鑒了其代碼。
研究人員利用單張A100 GPU,通過在4096個(gè)Isaac Gym環(huán)境上進(jìn)行并行訓(xùn)練,共計(jì)50億步。
項(xiàng)目地址:https://xbpeng.github.io/projects/ASE/index.html
為了實(shí)現(xiàn)零樣本任務(wù)解決方案,CALM由3個(gè)階段組成:
(1)動(dòng)作編碼器和底層策略(解碼器)聯(lián)合訓(xùn)練,將動(dòng)作捕捉序列映射為控制模擬角色的動(dòng)作。
(2)使用潛空間調(diào)節(jié)訓(xùn)練高層策略,從而實(shí)現(xiàn)對(duì)執(zhí)行動(dòng)作方向的控制,同時(shí)保留所需的風(fēng)格。
(3)將步驟1和2結(jié)合起來,使用簡(jiǎn)單的有限狀態(tài)機(jī)來解決任務(wù),無需進(jìn)一步訓(xùn)練,也無需精心設(shè)計(jì)獎(jiǎng)勵(lì)/終止條件。
階段1:底層訓(xùn)練
在底層訓(xùn)練階段,CALM學(xué)習(xí)了一個(gè)編碼器和一個(gè)解碼器。
編碼器接收來自動(dòng)作參考數(shù)據(jù)集的動(dòng)作,即關(guān)節(jié)位置的時(shí)間序列,并將其映射到低維潛表征(low-dimensional latent representation)。
解碼器是一個(gè)底層策略,通過與模擬器進(jìn)行交互,來生成類似于參考數(shù)據(jù)集的動(dòng)作。
這個(gè)策略能夠按需產(chǎn)生各種行為,但不受動(dòng)作方向性的影響。例如,它可以被指示走路,但無法本能的地控制行走的方向。
為了評(píng)估學(xué)習(xí)到的動(dòng)作表征能力,研究人員測(cè)試了在潛空間中在動(dòng)作之間進(jìn)行插值的能力。
在這里,初始的潛表征是「沖刺」,最終的潛表征是「蹲下不動(dòng)」。
在整個(gè)過程中,潛表征會(huì)隨著時(shí)間進(jìn)行線性插值,而角色則會(huì)通過語義上有意義的轉(zhuǎn)換來平穩(wěn)過渡,逐漸減慢速度并傾斜上半身。
階段2:方向控制
為了控制動(dòng)作方向,研究人員訓(xùn)練了一個(gè)高層任務(wù)驅(qū)動(dòng)策略來選擇潛變量。
其中,這些潛變量被提供給底層策略,并讓后者生成所需的動(dòng)作。
為了實(shí)現(xiàn)這一點(diǎn),研究人員首先通過動(dòng)作編碼器來獲取動(dòng)作潛表征。
然后,根據(jù)高層策略所選的潛變量與代表所需風(fēng)格的潛變量之間的余弦距離成比例,給它一個(gè)額外的獎(jiǎng)勵(lì),從而引導(dǎo)高層策略采用所期望的行為風(fēng)格。
而訓(xùn)練好的方向控制器,就可以控制角色所執(zhí)行的動(dòng)作形式和方向了。
比如下面的「蹲下行走」、「舉盾行走」和「奔跑」。
蹲行
舉盾
奔跑
階段3:推理
最后,把之前訓(xùn)練過的模型結(jié)合起來(底層策略和方向控制器),以在沒有額外訓(xùn)練的情況下組合出復(fù)雜的動(dòng)作。
為此,用戶創(chuàng)建一個(gè)包含標(biāo)準(zhǔn)規(guī)則和指令的有限狀態(tài)機(jī)(finite-state machine,F(xiàn)SM)。
這些規(guī)則和指令確定要執(zhí)行哪種動(dòng)作,類似于用戶控制游戲角色的方式。
例如,它們決定角色是否應(yīng)該執(zhí)行簡(jiǎn)單的動(dòng)作,直接使用底層策略進(jìn)行執(zhí)行,或者是否需要高層控制來進(jìn)行定向動(dòng)作。
比如,F(xiàn)SM可以構(gòu)建如下的動(dòng)作流程:
(1)轉(zhuǎn)身,
(2)向著目標(biāo)蹲行,直到距離<1m,
(3)慶祝。
以下是更多的效果展示:
測(cè)試結(jié)果
可控動(dòng)作生成
研究人員首先分析了CALM的三個(gè)方面:(1)編碼器質(zhì)量,(2)底層控制器的多樣性,以及(3)組合系統(tǒng)的可控性。
編碼器質(zhì)量
使用之前研究中的類別分離性(separability)測(cè)試,研究人員在編碼器學(xué)習(xí)的表示上衡量了潛空間內(nèi)動(dòng)作類別之間的分離性,將動(dòng)作類別定義為單個(gè)動(dòng)作文件(motion file)中的子動(dòng)作。
如上表所示,CALM將動(dòng)作編碼為具有更好分離性的表征。
多樣性
研究人員使用參考數(shù)據(jù)集訓(xùn)練了一個(gè)分類器,將動(dòng)作序列映射到原始動(dòng)作索引(originating motion index)。
當(dāng)從隨機(jī)采樣的潛變量?? ~ Z生成時(shí),研究人員記錄了生成動(dòng)作的Inception Score。
如上表所示,CALM顯著改善了生成動(dòng)作的多樣性。
可控性
最后,研究人員通過用戶調(diào)研來量化了CALM生成所要求動(dòng)作的能力。
為了進(jìn)行評(píng)估,研究人員給用戶提供了一個(gè)參考動(dòng)作和一個(gè)文本描述,然后詢問用戶對(duì)生成的動(dòng)作是否和描述相似進(jìn)行分類。
對(duì)于每個(gè)模型,研究人員向用戶呈現(xiàn)了40個(gè)參考動(dòng)作,每個(gè)參考動(dòng)作生成了3個(gè)版本。
記錄下準(zhǔn)確性——由控制器生成的準(zhǔn)確版本所占的百分比。
結(jié)果顯示,與ASE相比,CALM使生成的動(dòng)作更易控制,將感知生成的準(zhǔn)確率從35%提高到78%。
這些改進(jìn)和提高是通過使用條件鑒別性目標(biāo)來對(duì)表示(編碼器)和生成動(dòng)作模型(底層策略)進(jìn)行端到端學(xué)習(xí)來實(shí)現(xiàn)的。
一系列的結(jié)果表明,CALM學(xué)習(xí)了將動(dòng)作編碼為語義上有意義的表示,能夠生成與示范具有類似特征動(dòng)作的控制器。
在整個(gè)過程中,條件動(dòng)作(conditional motion)發(fā)生了改變,從而生成了向被要求的動(dòng)作之間類似人類動(dòng)作的過渡。
此外,為了說明潛空間的語義結(jié)構(gòu),研究人員將兩個(gè)語義相關(guān)的動(dòng)作「沖刺」和「蹲下空閑」進(jìn)行編碼,并在時(shí)間上在編碼之間進(jìn)行插值。
如上圖e所示,CALM在兩個(gè)動(dòng)作之間平穩(wěn)過渡,同時(shí)不間斷地執(zhí)行連貫的行走動(dòng)作,同時(shí)降低了速度和高度。
解決下游任務(wù)
使用編碼器和底層策略,研究人員展示了如何使用類似于視頻游戲控制的命令來為解決未見過的任務(wù)組合動(dòng)作。
方向運(yùn)動(dòng)控制
首先,研究人員展示了在給定一個(gè)參考動(dòng)作??和一個(gè)方向???的情況下,一個(gè)高層策略可以學(xué)會(huì)控制底層策略。
研究人員將這個(gè)任務(wù)稱為Heading。角色應(yīng)該在請(qǐng)求的方向上產(chǎn)生具有相似特征的動(dòng)作。
研究人員在上中展示了學(xué)到的動(dòng)作,并在下表的Heading列中對(duì)它們進(jìn)行了量化。高層策略被設(shè)定為同時(shí)學(xué)習(xí)「奔跑」,「持盾行走」和「蹲下行走」的條件。
在評(píng)估過程中,高層策略被設(shè)定為一個(gè)固定的風(fēng)格,并且在隨機(jī)時(shí)間步驟上更改方向。
研究人員記錄了生成請(qǐng)求風(fēng)格的成功程度,使用人工評(píng)估員進(jìn)行評(píng)估,并且測(cè)量動(dòng)作的方向——請(qǐng)求動(dòng)作方向與實(shí)際動(dòng)作方向之間的余弦距離。
結(jié)果表明,通過將潛變量約束在接近參考動(dòng)作編碼(reference motion encoding)的范圍內(nèi),高層策略能夠在指定的風(fēng)格中生成動(dòng)作,同時(shí)確保它在要求的方向上移動(dòng)。
在沒有進(jìn)一步訓(xùn)練的情況下解決任務(wù)
在研究人員的最終實(shí)驗(yàn)中,研究人員將可定向的底層控制器與高層動(dòng)作策略結(jié)合在一起,為新的任務(wù)提供零樣本解決方案。
研究人員設(shè)計(jì)了兩個(gè)任務(wù),位置和打擊。
對(duì)于位置任務(wù),人物應(yīng)該達(dá)到并保持在目標(biāo)位置內(nèi)——以圍繞旗桿的圓圈來表示。
更復(fù)雜的任務(wù)要求人物到達(dá)目標(biāo)并擊倒目標(biāo)。
在這兩種任務(wù)中,人物都受到一系列參考動(dòng)作的控制。
為了實(shí)現(xiàn)這一點(diǎn),將方向向量設(shè)定到目標(biāo)位置,在人物的本地坐標(biāo)框架中表示。
一旦在范圍內(nèi),底層策略直接提供相應(yīng)于所請(qǐng)求動(dòng)作(例如踢、持盾沖刺或劍揮)的潛在變量。
如上圖所示,CALM可以用于解決任務(wù),具體數(shù)值見之前方向運(yùn)動(dòng)控制部分中的表一。
就像一個(gè)人類玩家用手柄控制人物一樣,由于CALM的可控性很好,在沒有任何進(jìn)一步的訓(xùn)練或設(shè)計(jì)了任務(wù)特定的獎(jiǎng)勵(lì)的條件下,F(xiàn)SM按順序地命令人物在動(dòng)作之間進(jìn)行過渡。
角色以一種類似人類的動(dòng)作組合,完成了任務(wù)。
項(xiàng)目開源
準(zhǔn)備工作
下載安裝Isaac Gym,并安裝外部依賴項(xiàng):
pip install -r requirements.txt
預(yù)訓(xùn)練
首先,可以使用以下命令對(duì)CALM模型進(jìn)行訓(xùn)練,從而模仿數(shù)據(jù)集中的動(dòng)作片段:
python calm/run.py --task HumanoidAMPGetup --cfg_env calm/data/cfg/humanoid_calm_sword_shield_getup.yaml --cfg_train calm/data/cfg/train/rlg/calm_humanoid.yaml --motion_file calm/data/motions/reallusion_sword_shield/dataset_reallusion_sword_shield.yaml --headless --track
要測(cè)試訓(xùn)練好的模型,請(qǐng)使用以下命令:
python calm/run.py --test --task HumanoidAMPGetup --num_envs 16 --cfg_env calm/data/cfg/humanoid_calm_sword_shield_getup.yaml --cfg_train calm/data/cfg/train/rlg/calm_humanoid.yaml --motion_file calm/data/motions/reallusion_sword_shield/dataset_reallusion_sword_shield.yaml --checkpoint [path_to_calm_checkpoint]
精確訓(xùn)練
在訓(xùn)練完CALM底層控制器之后,就可以使用它來訓(xùn)練運(yùn)動(dòng)控制器了。
以下命令將使用預(yù)訓(xùn)練的CALM模型執(zhí)行目標(biāo)朝向任務(wù):
python calm/run.py --task HumanoidHeadingConditioned --cfg_env calm/data/cfg/humanoid_sword_shield_heading_conditioned.yaml --cfg_train calm/data/cfg/train/rlg/hrl_humanoid_style_control.yaml --motion_file calm/data/motions/reallusion_sword_shield/dataset_reallusion_sword_shield_fsm_movements.yaml --llc_checkpoint [path_to_llc_checkpoint] --headless --track
要測(cè)試訓(xùn)練好的模型,請(qǐng)使用以下命令:
python calm/run.py --test --task HumanoidHeadingConditioned --num_envs 16 --cfg_env calm/data/cfg/humanoid_sword_shield_heading_conditioned.yaml --cfg_train calm/data/cfg/train/rlg/hrl_humanoid.yaml --motion_file calm/data/motions/reallusion_sword_shield/dataset_reallusion_sword_shield_fsm_movements.yaml --llc_checkpoint [path_to_llc_checkpoint] --checkpoint [path_to_hlc_checkpoint]
任務(wù)解決(只用推理,無需訓(xùn)練)
CALM底層控制器和高層運(yùn)動(dòng)控制器可以結(jié)合起來,無需進(jìn)一步訓(xùn)練即可解決任務(wù)。
此階段僅進(jìn)行推理:
python calm/run.py --test --task HumanoidStrikeFSM --num_envs 16 --cfg_env calm/data/cfg/humanoid_sword_shield_strike_fsm.yaml --cfg_train calm/data/cfg/train/rlg/hrl_humanoid_fsm.yaml --motion_file calm/data/motions/reallusion_sword_shield/dataset_reallusion_sword_shield_fsm_movements.yaml --llc_checkpoint [path_to_llc_checkpoint] --checkpoint [path_to_hlc_checkpoint]
內(nèi)置任務(wù)及其各自的配置文件為:
HumanoidStrikeFSM: calm/data/cfg/humanoid_sword_shield_strike_fsm.yaml
HumanoidLocationFSM: calm/data/cfg/humanoid_sword_shield_location_fsm.yaml
任務(wù)訓(xùn)練
除了精確訓(xùn)練外,還可以訓(xùn)練高層控制器直接解決任務(wù)。
以下命令將使用預(yù)訓(xùn)練的CALM模型執(zhí)行目標(biāo)朝向任務(wù):
python calm/run.py --task HumanoidHeading --cfg_env calm/data/cfg/humanoid_sword_shield_heading.yaml --cfg_train calm/data/cfg/train/rlg/hrl_humanoid.yaml --motion_file calm/data/motions/reallusion_sword_shield/RL_Avatar_Idle_Ready_Motion.npy --llc_checkpoint [path_to_llc_checkpoint] --headless --track
內(nèi)置任務(wù)及其各自的配置文件為:
HumanoidReach: calm/data/cfg/humanoid_sword_shield_reach.yaml
HumanoidHeading: calm/data/cfg/humanoid_sword_shield_heading.yaml
HumanoidLocation: calm/data/cfg/humanoid_sword_shield_location.yaml
HumanoidStrike: calm/data/cfg/humanoid_sword_shield_strike.yaml
要測(cè)試訓(xùn)練好的模型,請(qǐng)使用以下命令:
python calm/run.py --test --task HumanoidHeading --num_envs 16 --cfg_env calm/data/cfg/humanoid_sword_shield_heading.yaml --cfg_train calm/data/cfg/train/rlg/hrl_humanoid.yaml --motion_file calm/data/motions/reallusion_sword_shield/RL_Avatar_Idle_Ready_Motion.npy --llc_checkpoint [path_to_llc_checkpoint] --checkpoint [path_to_hlc_checkpoint]
AMP
同時(shí),項(xiàng)目還提供了Adversarial Motion Priors的實(shí)現(xiàn)。使用以下命令可以訓(xùn)練模型模仿給定的參考動(dòng)作:
python calm/run.py --task HumanoidAMP --cfg_env calm/data/cfg/humanoid_sword_shield.yaml --cfg_train calm/data/cfg/train/rlg/amp_humanoid.yaml --motion_file calm/data/motions/reallusion_sword_shield/sword_shield/RL_Avatar_Atk_2xCombo01_Motion.npy --headless --track
訓(xùn)練好的模型可以通過以下方式進(jìn)行測(cè)試:
python calm/run.py --test --task HumanoidAMP --num_envs 16 --cfg_env calm/data/cfg/humanoid_sword_shield.yaml --cfg_train calm/data/cfg/train/rlg/amp_humanoid.yaml --motion_file calm/data/motions/reallusion_sword_shield/sword_shield/RL_Avatar_Atk_2xCombo01_Motion.npy --checkpoint [path_to_amp_checkpoint]
動(dòng)作數(shù)據(jù)
可以使用以下命令對(duì)動(dòng)作片段進(jìn)行可視化:
python calm/run.py --test --task HumanoidViewMotion --num_envs 2 --cfg_env calm/data/cfg/hum