你有没有试过用手机随手拍一段自己跳舞、走路或者弹吉他的视频,然后突然想,要是能像玩 3A 游戏那样,把镜头绕到自己身后看看后脑勺和背影会是什么样子,那该多好。
这听起来像是科幻电影里的场景,但其实已经有人在认真研究怎么把这件事变成现实。浙江大学、Robbyant、蚂蚁集团和香港科技大学的一群研究者最近做了一件挺有意思的事:他们造了一个叫 4DAnyone 的系统,输入一段普通手机拍的单目视频,就能生成一整圈从不同角度看这个人的视频,然后拿这些视频重建出一个可以自由旋转、缩放、甚至冻结在任意时刻观察的 4D 人像。
这事听起来简单,做起来却踩了不少坑。我们先聊聊这件事到底难在哪。
** 从一段视频到一个能 360 度旋转的人,中间隔着什么 **
先说说传统方法是怎么干这件事的。想要重建一个能自由观看的动态人像,业界通常的做法是搭一个专业影棚,四面八方架几十个相机同步拍摄,比如 DNA-Rendering 数据集用的就是 48 个相机组成的阵列。这种方式效果确实好,但门槛高得离谱,普通人不可能在家里搭这么一套设备。
那能不能只用一部手机拍的单个视角视频来搞定呢?这条路此前也有人尝试过,直接从单目视频重建 4D 人体模型。但问题是,这类方法通常需要提前知道拍摄时相机的精确参数,而且最要命的是,视频里没拍到的地方,比如你转身背对镜头时后背的样子,它压根就没见过,很难合理地 " 脑补 " 出来,结果往往是背面模糊一片或者衣服褶皱对不上。
于是就有了另一条更聪明的路子:先用一个能理解相机视角的视频生成模型,把单目视频 " 想象 " 出很多个不同角度的视频,再拿这些生成出来的多视角视频去做 3D 重建。这个思路听起来挺美,问题是现有的相机可控视频生成模型,比如 implicit camera-conditioned models
*implicit camera-conditioned models:一类不依赖精确几何计算,而是让模型通过学习隐式理解相机运动和视角变化的视频生成技术 *
在只生成少数几个新视角时表现还不错,画面看着挺真实。但研究者发现,一旦把生成的视角数量拉到 4DGS 重建所需要的规模,比如十几到几十个视角,这些模型就开始 " 翻车 " 了:不同视角生成出来的人物外观对不上,衣服颜色、身材比例、甚至面部特征都可能产生漂移,导致最终重建出来的 3D 人像变形走样。
*4DGS,全称 4D Gaussian Splatting:一种用大量微小的高斯 " 点云 " 来表示动态场景的技术,能实现实时、逼真的动态渲染,是目前生成 4D 内容的主流重建方式之一 *
这就是研究团队真正想解决的核心矛盾:不是能不能控制视角,而是当视角数量多到重建所需的规模时,怎么让这些生成出来的视频保持前后一致。
** 为什么视角一多,画面就崩了 **
研究者们深挖了一下,发现问题的根源其实是一个很朴素的工程限制:单次神经网络前向计算能处理的信息量是有上限的。
这里涉及一个叫 DiT 的东西。
*DiT,全称 Diffusion Transformer:一种把 Transformer 架构和扩散模型结合起来的生成模型骨架,目前主流的视频生成大模型基本都基于这个架构 *
DiT 模型内部有个 " 注意力机制 ",简单理解就是模型在生成每一帧画面时,会去 " 参考 " 其他相关的画面信息来保持连贯性。但这种参考的范围是有限的,受限于显存和算力,一次前向计算能塞进去的视角数量是有天花板的。
当你需要生成的目标视角数量超过这个天花板时,比如要生成 16 个甚至更多角度的视频,模型就不得不把这些视角拆分成好几组,分批处理。这一拆分就带来了两个连锁问题。
第一个问题出在参考信息这一侧。理想情况下,每一组新生成的视角都应该参考之前所有已经生成的视角,这样才能保证外观统一。但如果每次都要把之前生成的全部视角塞进参考上下文里,这个参考信息的长度会随着已生成视角数量 N 线性增长,很快就会超出模型能处理的容量。换句话说,你想让模型 " 看得全 ",就得让它 " 记得多 ",但记忆容量是有限的,这是个死结。
第二个问题出在目标视角这一侧。既然视角被拆成了互不相干的几组,分别独立去生成,那么不同组之间就没法直接交换信息。第一组生成的人物细节,第二组完全不知道,各组画各画的,结果就是不同组之间的人物结构出现漂移,衣服款式、姿态细节对不上,拼在一起看起来像是好几个人的合成体。
这就好比你请了四个画师,每人负责画这个人的一个侧面,却不让他们互相看对方画了什么,也不给他们足够的参考照片。第一个画师画正面时手里只有一张模糊的原始照片,画完之后第二个画师想参考第一个人的画作,却发现如果把所有已经画完的画都摊开给他看,他要看的东西太多,根本消化不过来。如果减少给他看的参考画作数量,他画出来的人物外观又会和前面对不上。这就是研究者说的两个耦合瓶颈,一边是参考信息不够用,一边是各组之间互不通气。
**Reference Context Packing:把越滚越大的雪球压扁 **
针对第一个 ? 值颈,也就是参考上下文随着视角数量线性膨胀的问题,研究团队设计了一个叫做 Reference Context Packing(简称 RCP)的机制。
这个设计的核心观察是:不同视角之间的外观信息其实存在大量冗余。
想想看,如果你已经生成了一个人左侧 45 度和左侧 50 度两个视角的视频,这两段视频里绝大部分信息其实是高度重叠的,衣服颜色、身材轮廓、发型基本一致,只有细微的角度差异。既然如此,与其把每一个生成过的视角都原封不动地塞进参考上下文,不如做一次 " 压缩 ",把这些冗余信息浓缩成一个固定长度的表示。
具体的做法是,RCP 借鉴了 FramePack 这个思路,用一种多尺度的图像切片方式(patchify layer)来处理参考视频。标准的处理方式是用固定大小的小块(kernel 和 stride 都是 1 × 2 × 2)去切分画面,生成对应数量的 token(也就是模型能处理的最小信息单元)。而 RCP 设计了压缩比率更高的切片层,比如 2 倍压缩或 4 倍压缩,这样同样一段参考视频经过处理后,产生的 token 数量会大幅减少,只有标准处理方式的四分之一甚至十六分之一。
这样一来,无论你已经生成了多少段参考视频,最终打包进模型的参考上下文长度是固定的,不会随着视角数量增加而线性膨胀。研究者把这称为把参考上下文复杂度从 O ( N ) 降低到 O ( 1 ) ,也就是说,无论 N 有多大,处理成本都保持恒定。
这就像你要给一个新来的同事介绍公司过去十年做过的所有项目,如果每个项目都事无巨细讲一遍,讲到第五十个项目时他已经彻底记不住前面的内容了。聪明的做法是把早期做过的项目压缩成一句话摘要,把最近的几个重要项目讲得详细一点,这样新同事既能了解全貌,又不会被信息量淹没。如果不这样压缩,要么参考信息不断膨胀到系统扛不住,要么干脆砍掉大部分参考信息导致外观参考质量骤降,这两种结果都会让生成出来的多视角人像不一致。
实际操作中,团队采用了一种渐进式的推理策略,先用源视频生成 4 个稀疏分布的参考视角(这一步用 farthest-point sampling,也就是每次挑选和已选视角角度差最大的候选视角,尽量让参考视角覆盖更广的范围),然后把这些参考视角和源视频一起打包成固定的 RCP 上下文,供后续所有目标视角组共享使用。这样即使最终要生成 16 个甚至更多的目标视角,参考上下文的开销始终维持在一个可控的水平。
**Target Context Routing:让分组不再各自为战 **
解决了参考信息膨胀的问题,还剩下第二个瓶颈:不同目标视角组之间互不通气导致的结构漂移。
研究团队为此设计了 Target Context Routing(简称 TCR),这个设计的灵感来自扩散模型去噪过程本身的特点。
扩散模型生成图像或视频的过程,是从一堆随机噪声开始,一步一步 " 去噪 ",逐渐显现出清晰画面的过程。研究者观察到一个规律:在去噪的早期阶段,也就是噪声还很强的时候,这个阶段主要决定的是画面的整体结构,比如人物的姿态骨架大致是什么样、身材比例大概如何;而到了去噪的后期阶段,噪声已经很弱,这时候模型主要在打磨细节,比如衣服褶皱的纹理、面部表情的微调。
基于这个规律,TCR 把整个去噪过程分成了两个阶段来处理分组问题。
在高噪声阶段,也就是决定整体结构的关键时期,TCR 会不断轮换目标视角的分组方式。举个例子,本来 16 个目标视角按顺序分成四组,第一次去噪时是 1 到 4 一组、5 到 8 一组,下一步去噪时就循环移位变成 2 到 5 一组、6 到 9 一组,这样不断轮换。这么做的目的是让不同的视角在时间维度上有机会被分到同一组里,从而间接地交换彼此的结构信息,即便它们没法在同一次前向计算里直接看到对方,也能通过这种 " 轮岗 " 的方式慢慢对齐整体结构。
到了低噪声阶段,也就是打磨细节的阶段,TCR 就不再频繁调换分组了,而是固定让相邻的视角始终待在同一组里,这样相邻视角可以专心地互相参照,稳定衣服纹理、边缘细节这些精细的东西,避免因为分组频繁变动而导致细节忽明忽暗、忽有忽无。
这个设计其实很像一个大型项目团队的工作模式。项目刚启动、方向还没定型的时候,最需要的是让各个小组的人多串门、多交流,今天你去隔壁组听听思路,明天他来你这边看看进展,这样才能保证整个项目的大方向不会走偏,不至于最后拼起来发现东一榔头西一棒子。可一旦大方向定了,进入具体执行和打磨细节的阶段,这时候反而不适合再频繁换组了,因为频繁换人会打断专注度,让本来已经磨得差不多的细节又被打乱重新调整。如果自始至终都固定分组不换人,项目大方向很可能各组各干各的,拼不到一起去;但如果自始至终都在换组,细节永远打磨不精细。TCR 做的就是在这两者之间找到一个转换的时间点。
论文里提到这个转换时间点是通过实验调出来的,最终定在整个去噪过程的 20% 处,也就是说前 80% 的步骤用来轮换分组传播结构信息,后 20% 的步骤固定相邻分组精修细节。团队还做了对比实验,尝试了随机轮换和跳跃式轮换两种其他策略,结果发现只有保持局部视角相邻性的轮换方式(也就是像滑动窗口一样平滑地移位)才能真正提升一致性,随机轮换基本没有效果,跳跃式轮换反而会让指标变差。这说明轮换分组这件事不是随便换换就行,得讲究章法,保持视角之间的空间邻近关系才有意义。
** 骨骼比深度更可靠:3D-Aware Skeleton Conditioning**
除了解决视角一致性的问题,研究团队还面临另一个挑战:怎么给模型提供关于人物姿态和几何结构的引导信息,让它知道要在哪个角度画出人物的哪个部位。
之前一些同类方法喜欢用密集的深度图或者精确的相机参数来做几何引导,思路是深度图信息越密集,模型能参考的几何细节就越多。但研究者反其道而行之,提出了一个叫 accuracy over density 的原则,也就是准确性比密度更重要。
*accuracy over density:论文提出的核心设计原则,意思是与其追求密集但容易出错的几何信号,不如用稀疏但可靠的几何信号来引导生成,因为错误的密集信号会带来相互冲突的约束,反而让生成结果更混乱 *
为什么这么说?因为深度图这种密集几何信号,在从随手拍的、没有约束条件的野外视频里估计出来时,往往误差很大,尤其是遇到复杂动作或者遮挡的时候。而这些误差一旦传进模型里,就会变成相互矛盾的几何约束,导致不同视角生成出来的内容互相打架,越描越乱。
相比之下,3D 骨骼信息虽然稀疏,只有几十个关键点,但现代的人体姿态估计算法(比如论文里用到的 GVHMR)在处理普通视频时反而能相对可靠地估计出这些关键点的位置。稀疏但准确,胜过密集但可能出错。
团队具体用的是一个精简版的骨骼点集合,从一个叫 Goliath 的 308 个关键点词汇表里,只挑了 40 个最核心的点,包括 17 个身体关键点、6 个脚部关键点、10 个手掌关键点(每只手 5 个指关节),再加上 7 个辅助的颈部、肩部、肘部关键点,而把 238 个面部关键点和 30 个手指关节都排除在外了。这么做是因为面部表情和手指的细微动作交给视频模型本身去从源视频里学习和保留会更自然,硬用检测出来的、往往不太准的细粒度关键点去强行约束,反而容易带来生硬的瑕疵。
这里还有一个很巧妙的细节,叫做 depth-buffered skeleton rendering(深度缓冲骨骼渲染)。
*z-buffer,也叫深度缓冲:图形学里一种处理遮挡关系的技术,简单说就是给每个像素记录它离相机的远近,近的物体自动挡住远的物体 *
如果只是简单地把 3D 骨骼投影成一张普通的 2D 关键点图,会遇到一个天然的歧义问题:比如一只手臂放在身体前面和放在身体后面,投影到 2D 平面上,看起来可能长得一模一样,因为 2D 图看不出前后遮挡关系。这就会导致不同视角生成出来的结果出现姿态上的前后颠倒,比如从这个角度看手臂在身前,从那个角度看却变成了在身后,逻辑上根本对不上。
团队的解决办法是给 3D 骨骼渲染加上一个像素级的深度缓冲,让离相机更近的身体部位在渲染时正确地遮挡住更远的部位,这样每个角度渲染出来的骨骼图就自带了清晰的前后关系信息,不再依赖额外的输入通道,也彻底消除了这个歧义问题。论文里的消融实验图(Fig.5)也验证了这一点,没有深度缓冲的版本在侧面视角会出现肢体穿模、前后错乱的问题,加上深度缓冲之后这个问题就消失了。
** 数据从哪来:游戏引擎里长出的训练素材 **
要训练出这样一个模型,光有巧妙的架构设计还不够,还得有海量、多样、高质量的训练数据。
研究团队专门搭建了一个叫 MVGameHuman 的数据集,用他们自研的游戏引擎渲染生成,一共包含 38000 段视频,覆盖 318 个不同的虚拟角色,每段视频由 24 个虚拟相机同步拍摄,分辨率达到 2560 × 1440。这个数据集的最大好处是,游戏引擎渲染出来的画面天然就有丰富多样的背景、光照条件和角色动作,而且相机参数是精确已知的,不存在真实拍摄中标定误差的问题。
除了游戏引擎数据,团队还结合了真实拍摄的光场数据(比如 DNA-Rendering,用 48 台相机的专业影棚采集的真实人物数据)和大量野外单目视频(比如从视频网站收集的 Pexels 和 TedTalk 数据集)。之所以要把这三类数据混在一起训练,是因为游戏渲染数据虽然精确但和真实世界的画面质感有差异,光场数据虽然真实但场景相对受限,而野外单目视频虽然场景丰富多样但缺乏精确的多视角标注。三者取长补短,才能让模型既学到精确的几何对应关系,又具备在真实世界随手拍视频上的泛化能力。
整个训练过程分成三个阶段进行,有点像学一门手艺,先打基础再逐步加难度。第一阶段只用背景干净的 DNA-Rendering 数据训练,让模型先学会跟随骨骼姿态生成人物、同时保留源视频的外观特征,这一阶段还特意以 20% 的概率让源视频片段和目标视频片段来自不同的时间窗口,逼着模型学会把姿态和外观解耦开,不能偷懒地直接照抄源视频的每一帧。第二阶段把所有多视角数据集都加进来,而且不再对背景做遮罩处理,因为之前的同类方法在训练时习惯把背景全部抠掉换成绿幕纯色背景,这样虽然简化了任务,却导致模型学不会处理复杂背景下的光照和阴影关系,边缘处也容易产生噪声。第三阶段再加入野外单目视频数据,进一步提升模型在真实场景下的适应能力,同时把手指关键点从骨骼输入里去掉,让模型更多依赖源视频自身的手部细节,而不是不靠谱的手指检测结果。
** 效果到底怎么样:数字说话 **
说了这么多设计思路,最终还是要看实际效果。研究团队在 DNA-Rendering 和 DyMVHumans 两个测试数据集上,从三个维度做了评测:生成视频之间的一致性、最终 4DGS 重建的质量、生成视频本身和真实视频的匹配程度。
对比的三个基线方法分别是:MV-Performer,一个专门针对人体、用显式几何条件训练的新视角合成模型;TrajectoryCrafter,一个基于深度图扭曲的相机控制视频生成模型;还有 ReCamMaster,一个基于隐式相机条件的视频生成模型,为了公平对比,团队还专门用相同的数据和训练流程对它做了微调,并且给它也配上了 RCP 和 TCR 模块。
结果显示,在 DNA-Rendering 数据集上,4DAnyone 在 4DGS 重建质量这一项的 PSNR 指标(一种衡量图像重建保真度的常用指标,数值越高说明和真实画面越接近)达到了 24.15,而排名第二的 ReCamMaster 微调版只有 20.55,MV-Performer 是 20.38,TrajectoryCrafter 更是只有 14.81。在生成视频一致性这一项上,4DAnyone 的 PSNR 是 24.33,同样明显领先其他方法。在 DyMVHumans 这个训练时完全没见过的数据集上,4DAnyone 依然保持了这种领先优势,说明它的泛化能力经得起考验。
从论文展示的对比图(Fig.4)来看,差距也是肉眼可见的。MV-Performer 在侧面和背面视角容易出现身材比例失真的问题,因为它的训练数据多样性有限;TrajectoryCrafter 在前后视角切换较大时会出现明显的几何扭曲甚至完全失败;ReCamMaster 生成的画面看着还算合理,但由于相机控制不够精确,不同视角之间容易出现错位,导致 4DGS 渲染出来的画面有噪点和模糊。相比之下,4DAnyone 在各个角度都能保持几何结构的准确和细节的清晰,甚至能合理地 " 脑补 " 出源视频完全没拍到的背面内容,比如根据正面看到的服装款式和身材,合理推断出背面衣服的褶皱走向应该是什么样子。
消融实验(也就是把某个模块拿掉看效果变化)也验证了两个核心设计的必要性。去掉 RCP 之后,PSNR 从 22.63 掉到 22.03,模型因为缺少足够的外观参考,在没见过的视角上容易产生不合理的幻觉内容;去掉 TCR 之后,PSNR 掉到 22.21,不同分组之间的结构和外观出现不一致;如果两个都去掉,PSNR 直接掉到 21.09,效果明显最差。这组对比清楚地说明,RCP 和 TCR 这两个设计各自解决不同的问题,而且是互补的,缺一个效果都会打折扣。
团队还测试了几个比较棘手的场景,比如源视频本身就是从背面拍摄的、人物穿着复杂的服饰、动作幅度很大等情况,4DAnyone 基本都能保持稳定的生成质量。不过论文也很坦诚地指出了两个还没解决好的问题。第一个是宽松飘动的衣物,比如大幅摆动的裙摆或者披风,因为骨骼引导信息对这类远离身体的布料运动几乎没有约束力,不同视角生成出来的飘动轨迹容易对不上,导致重建效果打折扣。第二个是姿态估计本身出错的情况,如果输入视频里的人物摆出了不常见的姿势,比如芭蕾舞的脚尖站立动作,姿态估计模型(GVHMR)有可能误判成平脚站立,一旦这个错误的骨骼信息被传进去,后续生成的所有视角都会忠实地继承这个错误,因为模型是严格按照给定的骨骼来生成画面的。
** 写在后面 **
读完这篇论文,最让我意外的其实不是那些具体的技术细节,而是这个团队处理问题的态度:他们没有去死磕 " 怎么让几何信号更精确 " 这条已经被很多人卷过的路,反而退一步问,我们真的需要那么精确密集的几何信号吗?
这种 " 做减法 " 的思路在深度学习领域其实挺少见的。大部分论文的叙事逻辑是 " 我们用了更多数据、更复杂的模型、更精细的条件信号 ",但 accuracy over density 这个原则反过来说:信号密度不是越高越好,如果密集信号本身不可靠,那还不如用稀疏但可信的信号。这个判断背后其实藏着一种对 " 信息质量 " 和 " 信息数量 " 关系的重新审视,值得在别的领域也想一想,比如做数据分析时,是不是也经常陷入 " 更多字段更多维度就一定更准 " 的误区。
另一个让我反复琢磨的细节是 TCR 里那个 20% 的分界点。为什么是 20% 而不是 50% 或者 10%?论文附录里给出了一张扫描表(Table 7),显示随着轮换步数增加,一致性指标一直在提升,直到轮换 16 步(也就是整个 20 步去噪过程的 80%)时达到饱和,再往后几乎没有提升甚至有轻微波动。这说明模型的 " 结构决策 " 真的是在去噪早期就基本定型了,后面更多是在做局部微调。这个发现某种程度上呼应了人类做事的一个规律:很多重大决策其实是在信息还不完整的早期阶段就已经拍板了,后面投入的大量精力更多是在打磨执行细节,而不是推翻重来。
还有一件事挺打动我的,是关于失败案例的坦诚。很多论文写到最后都在报喜不报忧,但这篇论文专门用一整节篇幅讲了两个没解决的问题,飘动的裙摆和姿态估计出错时的连锁反应。这种诚实其实比堆砌漂亮数字更有价值,因为它给后来者指明了具体还能往哪个方向继续推进。
如果哪天你随手拍的一段视频真的能变成一个可以 360 度自由旋转的立体影像,你会想拿这项技术做什么?是给自己留一个能从任何角度回看的青春纪念,还是让屏幕那头的虚拟形象,第一次拥有了背影?
Q&A
Q1:4DAnyone 是什么?
A:4DAnyone 是浙江大学、Robbyant 等机构联合研发的一套系统,能把一段普通手机拍摄的单目视频,转换成可以从任意角度自由观看的 4D 动态人像,核心是先生成多视角一致的视频,再用这些视频重建出 3D 高斯模型。
Q2:4DAnyone 和普通的多视角相机重建有什么区别?
A:传统的 4D 人像重建需要几十台相机组成的专业影棚同步拍摄,成本高、门槛高。4DAnyone 只需要一段普通的单目视频,通过 AI 生成出多个虚拟视角的视频,再拿这些生成的视频去做重建,不需要昂贵的拍摄设备。
Q3:4DAnyone 目前还有哪些做不好的地方?
A:论文里提到两个明显的局限,一是宽松飘动的衣物,比如裙摆和披风,因为骨骼引导对这类布料运动约束不足,容易在不同视角生成不一致的效果;二是如果姿态估计模型本身判断错误,比如把芭蕾舞的脚尖站立误判成平脚,生成的所有视角都会继承这个错误。


登录后才可以发布评论哦
打开小程序可以发布评论哦