UniMate:让 9 关节的手和 140 关节的龙共用一个听文字指令的动作模型

想象你打开一个动作生成工具,输入"cheetah charges forward",它同时能让 65 关节的人、3 关节的小工具、140 关节的龙都按这个指令动起来。这件事在 2026 年之前并不存在。直到 UniMate 在 SIGGRAPH Asia 2026 上正式落地,跨任意骨骼拓扑的"统一动作模型"才从概念变成能跑的代码。

为什么"一个模型驱动任意骨骼"这件事直到 2026 年才成立

骨骼动画在 3D 行业里其实早就成熟了:一个 kinematic tree(也就是把关节串成父子层级的树状结构)配上权重蒙皮,就能让艺术家手里的网格跟着骨架动起来。但"自动生成动作"这条线一直卡在一个尴尬的地方,模型要么"认骨头",要么"认关节数"。

最早的 SinMDM 走"per-skeleton 范式"。它能从一条 motion sequence 学到内部 motif(动作中反复出现的局部片段,比如跑步里的摆臂、落脚),做到 in-betweening、expansion、style transfer 一堆 inference-time 应用,看着很美。但它的代价是每个 skeleton 都要单独训练一个模型,不能跨骨架共享。论文直接把这个限制写在了 Related Work 里:"train a separate model per skeleton and so do not generalize across structures"。

SinMDM 架构:左半是窄感受野示意图,右半是 shallow UNet 把中间层换成 QnA local attention blocks

图注:SinMDM Figure 2,narrow receptive field(左)+ shallow UNet + QnA local attention(右)。这套架构专为单条 motion 训练场景设计,靠缩小感受野和局部注意力降低过拟合,但代价是无法跨骨架复用。(Raab et al., SinMDM)

另一条路线来自 MDM。它的 transformer encoder-only + classifier-free diffusion(不依赖额外分类器,直接在同一模型上训练有条件/无条件两条路径,采样时按权重插值)把 motion diffusion 拉回了主流框架,HumanML3D 上彻底刷爆了 FID(Fréchet Inception Distance,越低说明生成样本分布越接近真实分布)和 MultiModality。但它锁在 SMPL 22 关节这套模板上,9 关节的手、140 关节的龙它一概不接。 HumanML3D

MDM 架构:左半是 transformer encoder-only 路线(CLIP_text + Random Mask → Linear/MLP → ⊕ → z_tk → +PE → Transformer Encoder → x̂_0),右半是迭代采样循环

图注:MDM fig:overview,左侧显示 CLIP 文本条件经随机 mask 注入的 transformer encoder 架构,右侧是从高斯噪声出发迭代去噪到 clean motion x̂_0 的过程。这套路线奠定了 motion-domain classifier-free diffusion 的范式,但完全不考虑异构骨架。(Tevet et al., MDM)

AnyTop 把这件事往前推了一步:Skeletal-Temporal Transformer 在 Truebones ZOO 上做联合训练,把距离 + 关节关系编码成 attention bias,已经能"跨骨架"生成动作。但它有三个硬限制:无文本条件、训练数据仅 70 个 skeleton(且是单一来源 Truebones)、缺少 graph Laplacian 的谱编码。 UniMate AnyTop UNet UniMate DIMO

到这里,"任意骨骼 + 任意 prompt"还差最后一公里。

UniMate 的核心思路:把骨架拓扑作为显式信号注入三处

UniMate 的回答是:与其让模型"自己学会"理解骨架长什么样,不如把骨架拓扑作为显式信号,直接告诉同一个 diffusion transformer(用 Transformer 做去噪网络的扩散模型)三次。这就是它的 Topology-Aware Diffusion Transformer,也就是 TADiT。

先看整个 pipeline 长什么样:

TADiT 整体 pipeline:joint token 空间(per-frame motion feature + rest-pose skeletal descriptor),graph-structured bias 注入位置编码与 attention,文本条件输入,跨骨骼拓扑 motion 输出

图注:UniMate 主架构图。骨架 token 与动作 token 拼成 (T+1)×J×d 的联合空间,每个 block 走"joint branch + temporal branch"的 factorized attention(把时空两个轴的注意力拆开计算,大幅降低开销)。骨架信息三处注入:graph bias 加到 attention logits、谱坐标加到 rotary 位置编码、global token 经 AdaLN-Zero(自适应层归一化,初始化为零让残差支路起步为恒等映射)做条件调制。(Mou et al., UniMate)

第一处注入是 graph-aware attention bias。两个关节之间有拓扑距离 G_S(i,j)(图上相隔几条边)和关系类型 R_S(i,j)(如 parent / child / sibling / ancestor 等层级与功能关系,具体取值详见论文主文与补充材料),UniMate 把这两个量查表得到 embedding,再为每个 attention head 投影成 per-head scalar bias,加到 attention logits 上。直观地说:当 attention 在算"手腕关节的 query 该不该关注肩关节"时,这个 bias 会根据两者间的距离和父子关系自动加分或减分。这一招 AnyTop 已经做过,UniMate 的关键改进是强调这个 bias 跨 frames 共享、按"距离+关系"而非绝对 joint index 参数化,所以模型能迁移到训练时从没见过的拓扑——意味着即便在推理时给一根从没出现过的 dragon 骨架,bias 也能正确告诉模型"翼尖应该更关注肩而不是脚踝"。

第二处注入是 Spec-RoPE(Spectral Rotary Position Embedding,用骨架图谱分解得到的旋转位置编码)。骨骼不是自然语言,没有天然的 canonical joint ordering(你不能说"手腕是第 7 号关节",因为不同骨架编号规则完全不同),所以 1D joint index 当不了位置编码。UniMate 改用骨架图的 Laplacian(一种把"图上相邻关系"写成矩阵的经典工具)特征向量当作位置。具体做法是先从邻接矩阵 A 构造图 Laplacian L_S = D − A(D 是对角的"度"矩阵,记录每个关节连了几根骨头),再取前 8 个非平凡特征向量作 spectral coordinate。

但这里有个坑:特征向量的符号是任意的。同一根骨架的两个朝向相反的 Laplacian 解,在数学上都对,但会让模型看见"两个不同的骨架"。论文用 SignNet 把 +u 和 −u 各过一个共享 MLP 再相加,消除符号歧义。这之后再映射成 rotary angle(旋转角度)驱动标准 RoPE 旋转,attention 内积就只依赖谱坐标的差,而不是绝对值,因此具有 translation invariance(移动无关);joint 重排时 Laplacian 做相似变换,编码具有 permutation equivariance(排列不变性,骨架关节怎么重新编号都不影响结果)。

为什么要用谱坐标?直觉是这样:低频特征向量描述整根骨架的宏观结构("这是一条腿,那是一只尾"),高频特征向量抓局部细节("这两个相邻关节的相对角度")。下面这个可视化就是这层物理意义的视觉入口:

Spec-RoPE 谱模式可视化:多列骨架节点着色,列方向对应 Laplacian eigenvector frequency 从低到高

图注:论文 fig-spectral-visualization,从左到右 Laplacian 特征向量频率递增。低频模式捕捉全局运动学结构,高频模式表达更细的局部关系。这正是 Spec-RoPE 能跨拓扑迁移的物理基础:位置编码关注的是骨架的"形状特征"而不是关节编号。(Mou et al., UniMate)

第三处注入是 global topological conditioner。一根骨架有 9 个关节,另一根有 140 个关节,关节数完全不同,怎么办?UniMate 用 n_q 个可学习 query 对骨架 token 做 cross-attention pooling(用注意力机制把不定长度的骨架压缩成固定向量),再对 query outputs 求均值,得到不依赖 joint count、最终也不依赖 joint order 的固定尺寸 c_topo。它跟 timestep embedding c_τ、文本 embedding c_text 相加,一起通过 AdaLN-Zero 注入每个 transformer 子层和输出头。AdaLN-Zero 初始化时调制参数全为 0,这意味着整个 block 在训练第一步近似 identity,残差加回去不会破坏预训练行为,训练稳定性比简单的 sum injection 好得多——这点对异构 batch 训练尤其关键,因为不同关节数导致 padding 长度差异大,传统注入方式容易让模型"分心"。

把三处放一起看:pairwise bias 处理局部关系、Spec-RoPE 处理全局位置编码、global conditioner 处理 joint-count-invariant 的骨架摘要。三个机制各自解决一种性质不同的难题,且任意去掉一个都会让 FID 退化(消融实验 0.757 → 0.773/0.798/0.825)。这也回答了一个常见疑问:为什么不把这三处合并成一个统一算子?答案是它们处理的信号性质不同——局部的关节关系、全局的频率结构、整根骨架的语义摘要——合并会丧失这种结构对应性。

UniML3D:让一份数据集同时容纳人、狗、蛇和章鱼

要让上面那三处注入真正学到"和具体骨骼无关的动作先验",光有 Truebones ZOO 那种 70 skeleton、1219 motion 的小数据集不够。UniMate 的作者干脆自己攒了一份 UniML3D。

三个数据源的关节数和分布天差地别:

来源Clips (exported)SkeletonsJoints 范围特征
Truebones1,097749–140商业包,关节数跨度最广
Mixamo2,3171(单 rig)65(固定)单 rig 模板,长度足但形态单一
Objaverse-XL10,3557,3553–117长尾采集,铰接工具/道具把小关节数拉得很低

合计 13,769 exported clips(按 UniML3D 数据卡)、约 18.5 小时、跨 7,430 个 unique skeleton。论文正文给出的训练集规模是 11,850 clips / 9.9 小时(剔除了 skip list 上的 1,355 条 + 质量过滤掉的 564 条)。两套数字差异源自不同统计口径,本文以 HF 数据卡为准。

那三份原始数据骨骼命名、关节数、facing 约定都不一样。UniML3D 的工作就是把它们统一成一份可联合训练的数据集。

规范化分 5 步过滤、4 步规范化、4 种 on-the-fly augmentation。过滤环节包括:保留累计 skinning weight 最大的主骨架、root realign(把根关节对齐到原点)、删掉无 skinning weight 的 phantom joints、删除静态片段、按 root velocity 与 joint angular jitter 过滤 implausible 片段。规范化环节:canonical frame(y-up、初始 root 在原点)、初始 facing 对齐正 z、相对 rest pose 的 joint rotation、全局 root + 局部 non-root 特征归一化。骨架表示环节则用 BFS 序列化(Breadth-First Search,广度优先遍历,给骨架关节一个稳定顺序)解决 joint ordering 不一致(属于 §3.1 skeleton representation,而非 §4 canonicalization)。训练时还有 joint removal / addition、skeleton pooling、bone-length perturbation 四种 on-the-fly augmentation(训练时随机扰动,不是离线处理),人为制造拓扑变化以提升泛化。这套规范化的核心动机是:把 Truebones、Mixamo、Objaverse-XL 三种骨骼命名、关节数、facing 约定都不同的数据,强行压成同一份可联合训练的数据集。换句话说,没有 UniML3D 的数据规范化,TADiT 的三处注入就无从学起。

文本标签由 Qwen3.5-9B 从四视角渲染图自动生成,每条一句、object-relative、无外观描述。论文正文提到有 3,584 unique text prompts(HuggingFace 数据卡未独立核验这一数字)。facing canonical frame 的来源则来自 face_joint_names.json——对每个 skeleton 记录一对左右对称关节(如髋关节对、肩膀对),用其左-右向量决定 facing 方向;没有左右对称的蛇形骨架则退化用头尾 body axis。

UniML3D 数据集样本拼贴:灰白棋盘格地面,七类形态学多帧运动序列,每序列叠加骨骼骨架线框、下方英文 prompt

图注:项目页 dataset_overview,呈现 human kick、dragon flap、crab strike、snake spin、octopus stretch、cheetah charge、hand curl 七组示例。注:这是样本拼贴,不是处理流程图;图中存在 "raw"/"snack" 两处拼写错误和一处句末截断,引用时保持原样。avian(鸟)类在图中没有清晰对应,dragon 在语义上接近但严格属 fantasy。(UniMate 项目页 Dataset 章节)

caption、关节清理标签、facing 对、体型分类、skip list、索引表全部由 UniMate 自己的 pipeline 生成,许可证为 ODC-BY 1.0。但要小心:Truebones 的 motions 目录因商业授权原因不随 HF 公开,需要自己买 Truebones ZOO 并重跑 pipeline 才能拿到。

效果:FID 从 2.711 压到 0.757,四种 zero-shot 应用

数字本身在 UniMate 论文的 Tab. 1 / Tab. 2 / Tab. 3 里都有,但单独看一行数字读者容易没感觉。把它和"为何重要"绑在一起读就清楚了。

第一组对比:UniMate 把 AnyTop 的 FID 从 2.711 压到 0.757(接近 3.6× 提升),Diversity 从 8.139 提到 9.200。这是 UniMate 在自己 benchmark 上对 AnyTop 的复评测,跑在 held-out Truebones skeleton 上。FID 越低表示生成 motion 的分布越接近真实 motion 的分布,能从 2.7 压到 0.7 是一个非常实质的提升。Diversity 更高意味着生成的运动变化更丰富。

消融实验对应"三处注入缺一不可"。去掉 graph-aware attention bias:FID 0.773 / Diversity 8.799;去掉 Spec-RoPE:0.798 / 8.424;去掉 global conditioner:0.825 / 9.475。三个模块缺谁都明显退化,而 conditioner 缺失尤其影响多样性。论文把这三个数字与上一节的三处注入严格对应起来,等于在实验上把"显式注入骨架拓扑"这件事钉死了。

第二组对比是相对 mesh baseline。对 18 个 mesh 跑 VBench(视频生成常用 benchmark):UniMate 0.186 / 0.993 / 0.833 / 0.544 / 1.214s,AnimateAnyMesh 0.151 / 0.995 / 0.352 / 0.498 / 15.542s,V2M4 0.167 / 0.991 / 0.667 / 0.506 / 1.641h。UniMate 在 motion 复杂度(DD)上把 0.352 推到 0.833(AnimateAnyMesh 在论文中被指出 smoothness 高分主要来自近静态输出,所以分高但其实没在动)。

定性对比直观:

狮子 leap-and-bite 和蟒蛇 upward coil 两个 case 的多帧定性对比:UniMate vs AnimateAnyMesh vs V2M4,按方法排列

图注:论文 fig-skeleton-free-comparison,两个 case 各 4 帧裁剪显示。AnimateAnyMesh 两个案例都几乎不动;V2M4 把狮子鬃毛弄变形,且蟒蛇只抬头不做 coil;UniMate 在两个 case 上都执行了 prompt 要求的完整动作。两个 case 不能外推为通用结论。(Mou et al., UniMate)

32 人用户研究里 UniMate 的 TA(Text Alignment)/ MP(Motion Plausibility)/ ME(Motion Expressiveness)/ SP(Shape Preservation,形状保持)/ Avg 四项 Likert 1–5 评分(分越高越好)分别为 4.617 / 4.568 / 4.646 / 4.630 / 4.615,均为最高。

UniMate 真正的卖点是它一次训练 + sampling-time token mask(采样时给某些 token 强行赋值,模型只补全其余部分)就能做四种 zero-shot 应用,模型本体不动、不微调、不加辅助网络。这也是它作为 foundation model 主张的核心证据:跨拓扑泛化的真正考验不在 benchmark 分数,而在同一个模型能否不重训就完成新任务。

  1. Motion transfer:把 source motion 抽象成 text prompt,再用 target skeleton 直接生成,不需要 joint correspondence、不需要 exemplar alignment,也不需要 per-skeleton 优化。这是 UniMate 独有的能力,因为 AnyTop 没接文本。
  2. In-betweening:固定起止 pose tokens,中间帧由 classifier-free text guidance 约束语义生成。
  3. Expansion:逐段串联 text prompts,每段以上一段末 pose 为 boundary condition。
  4. Editing:固定未修改部分,仅重采样选定 joints,在新 prompt 下实现局部动作变化。

Motion Editing 演示:左 Source Motion、右 Edited Motion,顶部 prompt "A robot turns its head to left."

图注:项目页 editing.jpg,source vs edited 并列对比框架。注:图中没有 held vs resampled 关节的颜色编码,caption 中提到的"walks forward"动作并非图片可见内容(两图都是静态站立)。(UniMate 项目页 Applications 章节)

训练目标用 conditional flow matching。它的思路比传统 DDPM(每一步都预测一点噪声、然后迭代去噪)更简洁:直接学一个"速度场",告诉模型在任意时刻该往哪个方向走多远就能从噪声滑到真实数据。在这条轨迹上,一端 x_0 是纯噪声 x_0 ∼ N(0,I)(即高斯噪声端),另一端 x_1 是真实 motion(数据端),τ ∈ [0,1] 控制插值位置。每个 noised motion x_τ 由 x_0 和 x_1 插值得到,模型学的速度是 v_θ(x_τ, τ, c, S),目标是两端差值 v* = x_1 − x_0。把"学差值"换成"逐步预测噪声"之后,整个训练目标就只剩一项 L_mse,概念上比 diffusion 干净得多。

UniMate 在这之上叠了两项正则:L_mse 含 heterogeneous batch validity mask(异构骨架 batch 里不同骨架关节数不同,padding 位置要被 mask 掉);L_geo 是把 6D rotation 还原成 SO(3)(3D 旋转群)后的测地线角度偏差,让关节旋转落回到合法的旋转流形上;L_smooth 是对 denoised velocity channels 的时序加速度惩罚,抑制抖动。实现上 hidden 512、batch 256、8×H100、推理约 50 FPS。

它做不到什么:4D 数据长尾、缺空间控制、作者的下一步

论文 §6 Limitations 自己列了三条局限。

第一是数据监督受限。artist-authored 4D animation data 相对图像/视频语料仍小,且形态学长尾。稀有拓扑和 OOD 动作更容易出现静态、抖动或语义错误。

第二是条件通道有限。当前只接 rigged skeleton 加 text prompt,不支持 monocular video、exemplar motion、无 rig mesh 或 partial skeletal demonstrations。这跟第一作者 Mou 的前序工作 DIMO(ICCV 2025 Highlight)形成鲜明对比:DIMO 从单张图像出发做 single-image-to-4DGS(4D Gaussian Splatting,把 3D 高斯泼溅扩展到时间维度),自带 rigging 和 motion;UniMate 把 rigging 从模型职责中剥离,专注于 motion 本身。

第三是缺细粒度空间控制。文本很难精确指定脚/手轨迹、接触和环境约束。论文同时承认 contact-rich 动作可能出现 foot sliding、drift、hovering 或 ground penetration,因为没有统一 contact model。

UniMate 团队在 DIMO 阶段已经探索过 physics-aware / 解剖学先验与 fine-grained spatial control 等方向(DIMO 论文自陈局限是否逐字使用 anatomy-aware priors 一词未独立核验)。UniMate Limitations 提到的三条未来方向,正是同一作者在相邻工作中的延续线索。这意味着论文和作者相邻工作提示的优先方向包括补数据、补控制通道、补物理先验,是否还需架构改进仍未由本文证明。

回到开头那个画面。UniMate 不是"任意骨骼任意动作任意控制"的终点,它做的是把"一个统一模型跨任意骨骼拓扑"这件事从不可能推到可能、且推理速度足够实用。下一步要落地到生产管线,还需要更多数据、更多控制通道和物理先验。但作为论文自陈的 foundation model 定位,它第一次让 9–140 关节范围内的异构骨骼、65 关节的 Mixamo 人体、超过百关节的幻想生物在同一份文字 prompt 下有了同一种动作语言——这件事本身就是这篇论文给出的核心贡献。

想深入可以读原文:UniMate: One Unified Model to Animate Diverse Skeletons — arXiv:2609.05415

参考文献

UniMate:让 9 关节的手和 140 关节的龙共用一个听文字指令的动作模型