动作迁移(Motion Transfer)是计算机视觉领域的经典任务,目标是把一段源视频中人物的动作,移植到另一个目标人物身上,生成目标人物做出相同动作的新视频。传统方法通常依赖成对训练数据、关键点标注或者针对特定人物的训练,泛化能力非常有限。Monkey-Net(Monkey-Net: Learning Deep Face Representations 之外更准确地说,是"Monkey-Net: Learning to Align Sequences in their Feature Space"同一团队提出的姿势驱动网络)通过自监督学习方式,只需一段目标人物视频就能完成迁移,被称为少样本(one-shot)动作迁移的代表工作。本文将从问题定义、网络结构、训练与推理流程、优缺点分析几个方面展开讲解。

一、动作迁移的任务定义与传统方法的困境
动作迁移的形式化描述是:给定一段源视频,其中包含表演者A的若干连续帧以及每一帧对应的姿态信息(通常是关键点骨架),再给定一段目标人物B的短视频,模型需要输出一段新视频,视频中的角色是B,但动作与A完全一致。这里的关键约束在于,模型事先并不知道B长什么样,只有这一段视频作为唯一参考。
早期的方法大致分为两类。第一类是基于三维重建的方法,例如先重建出表演者的三维人体模型,再把姿态参数化后驱动目标模型渲染。这类方法效果好但流程复杂,对三维标注依赖严重。第二类是基于关键点的图像生成方法,例如Everybody Dance Now,需要针对每个目标人物单独训练一个生成网络,训练成本高且无法即时应用。
Monkey-Net的核心突破在于:它把动作迁移看成“基于运动的视频帧外推”问题。模型在训练阶段只需要无标注的普通视频,通过自监督的方式学习“从当前帧和未来某帧的关键点,生成未来那一帧图像”的能力。推理时,目标人物视频提供一帧外观参考,源视频提供关键点序列,模型即可逐帧合成目标人物的新动作,全程不需要成对数据,也不需要针对新人物重新训练。
二、Monkey-Net网络结构与三阶段生成流程
Monkey-Net的名称来源于论文中展示的猴子跳舞 demo,其整体结构可以分为三个模块:关键点检测模块、密集运动预测模块和图像生成模块。三者串联起来完成从姿态到像素的映射。
第一个模块是关键点检测器。它采用自监督的 RAISE 类检测方式,通过分析视频帧之间的时间一致性来定位关键点,不需要人工标注骨架。具体做法是:对视频中的每一帧提取热力图,热力图的峰值即为关键点位置。训练时用时间差分损失约束相邻帧的关键点要能捕捉到真实运动区域,即关键点位置的变化应当与实际像素运动一致。
第二个模块是密集运动预测模块,也称为光流估计模块。仅有稀疏关键点坐标还不足以生成高质量图像,因为图像每个像素都需要知道“从参考帧的哪个位置采样”。该模块以参考帧与目标帧的热力图为输入,通过一个 U-Net 结构的卷积网络,输出稠密对应场(Dense Correspondence Field),可以理解为一种从关键点运动扩散出来的稠密光流。此外网络还会输出一个遮挡掩码,标记目标帧中哪些区域在参考帧中不可见(例如手臂转动后原来被遮挡的部分),这些区域需要由网络凭空补全而不是采样。
第三个模块是图像生成模块。它利用可变形卷积或者基于网格的采样操作,根据稠密对应场从参考帧中扭曲采样像素,再结合遮挡掩码用卷积网络修复不可见区域,最终输出目标姿态下的完整图像。整体流程可以概括为下面的伪代码:
import torch
import torch.nn as nn
# 三大模块的定义(示意)
keypoint_detector = KeypointDetector(num_keypoints=10) # 自监督关键点检测
motion_net = MotionPredictionNet() # 稠密对应场 + 遮挡掩码
generator = ImageGenerator() # 扭曲采样 + 图像修复
# 推理阶段:动作迁移
ref_frame = target_video[0] # 目标人物的参考帧
kp_ref = keypoint_detector(ref_frame)
generated_frames = []
for src_frame in source_video:
kp_src = keypoint_detector(src_frame)
# 根据参考帧与源帧的关键点差异,预测每个像素的运动
dense_flow, occlusion_mask = motion_net(kp_ref, kp_src, ref_frame)
# 从参考帧扭曲采样,并修复遮挡区域
out = generator(ref_frame, dense_flow, occlusion_mask)
generated_frames.append(out)
video = torch.stack(generated_frames, dim=0)
这段代码展示了完整的推理链路。值得注意的是,关键点检测器对源视频和目标视频共享同一套权重,这保证了两侧提取的姿势表示处于同一语义空间,是少样本迁移能够成立的前提条件。
三、自监督训练策略详解
Monkey-Net 训练时不需要任何人工标注,核心技巧是把问题转化为“视频帧预测”。从大量普通视频中,随机抽取一个当前帧和一个未来帧,用关键点检测器分别提取热力图,然后让网络根据当前帧外观和未来帧的关键点,重建未来帧的图像。由于未来帧是真实存在的,重建损失(L1 损失加上感知损失)可以直接监督整个网络。
除了重建损失,还有两个辅助损失非常重要。一是等变性损失(Equivariance Loss),对输入图像施加已知的几何变换(如随机仿射变换),要求关键点的位置以相同方式变换,这能让关键点具备稳定的几何语义。二是遮挡一致性损失,约束遮挡掩码的预测在不同时间距离的帧对之间保持逻辑一致,避免出现“同一区域时而可见时而不可见”的矛盾。
这种自监督设计的巧妙之处在于:模型学到的是“给定外观和目标姿态,生成图像”这个通用映射,与具体人物无关。因此在推理阶段遇到一个全新的人物时,模型可以直接套用学到的映射能力,这正是“少样本”二字的含义——只需一帧甚至一段短视频作为外观参考即可。
四、优势、局限与后续发展
Monkey-Net 的优势可以归纳为三点。第一是免成对训练,不需要源视频和目标视频内容对应的监督数据;第二是人物无关,对新人物零训练成本;第三是关键点自监督发现,无需人工定义骨架拓扑,理论上可以迁移到人体之外的对象,例如论文中就演示了动画形象的动作迁移。
但它也有明显的局限。首先是时序稳定性问题:模型逐帧独立生成,缺少显式的时序建模,生成的视频容易出现抖动。其次是外观保真度有限,大角度转动或大幅遮挡时,补全区域的画质明显下降。再次是关键点数量固定且语义模糊,自监督发现的关键点不一定对应人体关节,复杂动作下对应关系可能漂移。
后续工作正是在这些痛点上不断改进。First Order Motion Model 在 Monkey-Net 基础上引入仿射变换建模每个关键点附近的局部运动,大幅提升了表情迁移和说话人头像驱动的效果;TPSM 等方法使用薄板样条获得更平滑的稠密对应场;MRAA 则引入运动幅度感知的仿射变换,改进了大动作下的表现。可以说,Monkey-Net 奠定了“关键点驱动 + 稠密对应场 + 图像修复”这一技术路线的基本范式。
五、实践建议与总结
如果想在自己的项目中复现或借鉴 Monkey-Net,有几点建议值得参考。数据方面,尽量使用背景干净、人物占比大的训练视频,自监督关键点在复杂背景下容易学到无关区域。关键点数量建议从 10 到 15 起步,过少无法覆盖复杂关节,过多则训练不稳定。推理时若生成结果抖动明显,可以对关键点序列做轻度平滑,或者参考后续工作加入时序一致性约束。
总体来看,Monkey-Net 的价值不仅在于一个能跑通的模型,更在于它证明了自监督姿势表示可以支撑跨人物的动作迁移,把任务从“针对每个人训练”拉回到了“一次训练、处处使用”的通用范式。理解了它的三阶段结构和自监督训练思想,再去阅读 First Order Motion Model 等后续论文会非常顺畅。对于做虚拟人驱动、动画生成相关应用的开发者来说,这套思路至今仍然是性价比很高的基线方案。
Monkey-Net少样本学习动作迁移修改时间:2026-09-03 06:40:43