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