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