视频世界模型近年来成为生成式 AI 里被讨论最多也最容易被误解的方向之一。它不只是视频生成模型还承担着预测物理运动、理解空间关系、模拟交互结果的任务。比如给定一段车辆行驶视频视频世界模型要能预测下一秒障碍物是否靠近给定一段机器人操作视频它要能判断杯子是否被碰倒。腾讯开源的 SCoPE 从一个很底层的问题切入模型在计算位置关系时到底应该相信像素网格还是相信三维射线空间。像素网格是图像的天然形态但它不是世界的天然形态。SCoPE 尝试用射线空间重写视频帧之间的位置关系让模型不再“困在像素网格里”。下文会从问题原理、表示对比、最小复现、验证方式和常见排错几个层面展开。1. 为什么视频世界模型绕不开“位置关系”这个底层问题1.1 视频世界模型到底在预测什么视频世界模型的核心目标不是“把下一帧画出来”而是让模型具备对物理世界的心智模拟能力。模型需要在没有完整规则输入的情况下从视频序列中学习到场景里有哪些物体、物体之间如何运动、遮挡如何变化、光照为什么改变。传统的视频预测模型往往把问题简化成像素回归输入若干帧图像输出未来若干帧图像损失函数用 L1 或 L2 距离衡量。这种模型在简单场景里可以工作但一旦场景中包含明显的三维运动和视角切换输出视频就会出现“看起来像但空间位置关系完全错误”的问题。SCoPE 关注的位置关系恰好是这一类问题的根因。视频世界模型要完成的不只是补全像素而是维护一个可预测的状态空间。在这个状态空间里一辆车应该知道前面的树比自己离相机更近还是更远一个杯子被越过时应该先被遮挡再出现。要表达这些信息模型必须先有一种稳定的空间位置表示。如果这个表示本身和相机视角强绑定模型就很容易把相机运动误解为物体运动。这也是为什么很多研究开始把视频世界模型和三维视觉、图形学结合起来。视频帧里只有二维观测但二维观测背后的世界是三维的。模型能不能学到“哪个像素对应空间中哪个位置”决定了它能不能真正理解动态场景。SCoPE 选择射线空间作为位置关系的底层表示相当于在二维图像和三维世界之间建立了一条更直接的几何通道。1.2 像素网格坐标是一种“观察者相关”的表示像素网格是图像的天然形态。一张宽度为 W、高度为 H 的图像会被切分成 H×W 个规则格子每个格子用二维坐标 (i,j) 定位。绝大多数视觉模型都直接使用这类坐标作为位置信号。对于图像分类、目标检测这类任务像素网格坐标已经足够因为任务关心的是“图像里的目标在哪里”而不是“目标在物理世界中的绝对位置”。但视频世界模型面对的情况不一样。同一个世界点在不同帧中的像素坐标会随着相机移动而改变。假设桌面上放着一个玻璃杯固定机位拍摄时玻璃杯可能出现在像素坐标 (100, 300)。相机右移 10 厘米后玻璃杯可能出现在 (80, 280)。如果模型只看到像素坐标它会认为杯子发生了位移而实际上杯子根本没有动移动的是相机。这里的关键问题是像素网格坐标是观察者相关的。它由成像平面、相机内参、相机外参共同决定。相同的一组世界坐标经过不同相机参数投影后会得到完全不同的像素网格位置。如果视频世界模型把像素网格坐标当作位置关系的基本单位那模型就必须在训练中隐式学会“如何把像素坐标转换回世界坐标”。这个转换本身不是容易学到的尤其是在训练数据里相机运动模式和物体运动模式混淆在一起时网络很可能学到一种错误的解耦方式。SCoPE 的做法则是从表示层面直接修改这个前提。它不再让模型从像素网格里猜测三维位置关系而是利用相机参数构造出每条像素对应的射线让模型在射线空间里处理位置关系。射线空间里的坐标与相机参数有一定关联但它表达的是三维几何信息而不是单纯的成像平面位置。1.3 位置关系错乱在生成结果里如何暴露位置关系错误在视频生成结果中并不隐蔽只是很多评测指标没有专门暴露它。最常见的问题有以下几类。第一类是物体边缘拖影。当物体快速移动时模型输出的下一帧里物体边缘会出现模糊残影。这往往不是动作预测不准而是模型不确定物体的三维位置只能生成多个可能的像素位置再平均。第二类是相机摇动时背景扭曲。固定相机拍摄时模型可能学得很好一旦训练数据里出现较多镜头运动模型就会把背景里的静止物体生成成扭曲形状。这是因为网格坐标变化被模型误读成物体自身形变。第三类是物体相对位置不稳定。比如场景中有近处的一把椅子和远处的一扇门模型可能在前几帧保持“椅子在左、门在右”但到了后续帧两个物体的左右关系或者前后关系发生颠换。这说明模型没有学到跨视角的空间关系。第四类问题是遮挡关系错误。一个球滚到箱子后面正确结果应该是球逐渐被箱子遮住。如果模型只依赖像素网格它可能生成出球从箱子表面穿过的画面因为网格坐标里缺少深度信息遮挡关系只能靠像素边缘猜测。这些现象都指向同一个结论视频世界模型需要一种不依赖具体视角的空间位置表示。射线空间就是针对这一需求设计的表示方式之一。2. 射线空间不把图像当格子而是当一束光线2.1 从像素到射线的完整构造过程射线空间这个名词听起来抽象但它背后的几何非常直观。可以用一句话解释图像中每个像素并不是一个孤立的二维点而是空间中一条射线的采样结果。相机成像时光线从场景中的点出发经过相机光心最终落在感光元件上。像素坐标 (u,v) 对应的是这条光线在成像平面上的落点。因此给定相机内参和外参可以反推出每个像素对应的三维射线。射线由一个起点 o 和一个方向 d 组成空间中的任意采样点可以表示为r(t) o t·d其中 t 是沿射线的深度通常有一个范围 [near, far]。这样二维像素坐标就转换成了三维射线几何。在实际代码中像素转射线是最基础的工具模块。下面是一段 PyTorch 风格的概念验证代码用来把一批图像的 H×W 像素坐标转换成相机坐标系下的射线方向再转换到世界坐标系import torch import torch.nn.functional as F def build_rays(height, width, intrinsics, c2w): # intrinsics: [B, 3, 3] 相机内参 # c2w: [B, 4, 4] camera-to-world 矩阵 B intrinsics.shape[0] device intrinsics.device # 生成像素坐标 ys, xs torch.meshgrid( torch.arange(height, devicedevice), torch.arange(width, devicedevice), indexingij, ) xs xs.reshape(-1).float() ys ys.reshape(-1).float() # 扩成 batch 维度 xs xs.unsqueeze(0).expand(B, -1) ys ys.unsqueeze(0).expand(B, -1) # 内参 fx intrinsics[:, 0, 0].unsqueeze(1) fy intrinsics[:, 1, 1].unsqueeze(1) cx intrinsics[:, 0, 2].unsqueeze(1) cy intrinsics[:, 1, 2].unsqueeze(1) # 相机坐标系下的射线方向 cam_dir torch.stack([ (xs - cx) / fx, (ys - cy) / fy, torch.ones_like(xs), ], dim-1) # [B, H*W, 3] # 转换到世界坐标系 rot c2w[:, :3, :3] trans c2w[:, :3, 3] dir_world torch.einsum(bij,bkj-bki, rot, cam_dir) dir_world F.normalize(dir_world, dim-1) # 射线起点 相机中心 origins trans.unsqueeze(1).expand(B, height * width, 3) return origins.reshape(B, height, width, 3), dir_world.reshape(B, height, width, 3)这段代码解决了两个问题。第一它把像素坐标 (u,v) 通过内参归一化成了相机坐标系下的方向向量。第二它通过 c2w 矩阵的旋转部分把方向向量从相机坐标系转换到世界坐标系并把相机位置作为射线起点。实际项目中c2w 可能是从位姿文件或 SLAM 系统读取的。内参矩阵则来自相机标定。要特别注意不同数据集对像素坐标的约定可能不一样有的以左上角为原点有的以中心为原点使用前需要统一。2.2 射线空间里的位置关系是什么射线空间并不等于把二维坐标改成三维坐标那么简单。它的价值在于位置关系在射线空间里有明确几何含义。首先射线方向携带了方位信息。两条射线是否相交、夹角大小、是否共面这些都可以直接反映物体之间的大致空间关系。其次深度 t 携带了遮挡和距离信息。如果在同一条射线上有两个采样点离相机近的点会遮挡离相机远的点。这个性质在渲染和生成中非常有用因为它让模型可以在前向计算时自然处理遮挡关系。在 SCoPE 的语境下射线空间重写位置关系可以理解为模型不再把视频帧看成一系列二维格子而是把每一帧看成一组射线以及射线上的观测值。基于这组射线模型可以建立跨帧的三维位置对应关系。某个世界坐标点在当前帧位于射线 A 上相机移动后它可能位于射线 B 上。如果模型能够在射线空间里预测这个对应它就不会把相机运动误判为物体运动。这种思路和神经辐射场、三维重建技术有相似之处但应用对象不同。SCoPE 不是只做单帧重建而是把射线空间作为视频世界模型的位置关系表示用来预测未来帧、生成新视角或模拟物理交互。2.3 像素网格表示与射线空间表示的核心差异为了更清楚地看出两种表示的区别可以从几个维度对比如下对比维度像素网格表示射线空间表示基本单元(i, j) 二维格子位置射线起点 o、方向 d、深度 t是否依赖相机参数不依赖依赖内参和外参是否观察者相关强相关与观察者位置有关联但表达的是连续几何遮挡信息缺失可通过深度排序表达视野变化需要隐式学习通过射线几何自然变换可解释性较弱强便于可视化调试工程复杂度低高需要位姿和标定从表格可以看出射线空间不是零成本改进。它需要额外的相机参数也需要更复杂的数据管线。但它的收益在于位置关系从“网格上的坐标”变成了“三维空间中的几何关系”这让模型更容易理解物体运动。3. SCoPE 的核心设计思路与最小复现框架3.1 整体流程视频输入、相机参数、射线编码、隐空间预测SCoPE 的完整实现细节需要以官方仓库为准但从“用射线空间重写位置关系”这个核心思路出发可以理解它的整体流程。第一步是输入准备。模型接收连续多帧视频同时接收每一帧对应的相机内参和外参。第二步是特征提取。可以用一个 2D 或 3D 骨干网络提取视频帧特征。第三步是像素到射线的映射。利用相机参数为每个像素构造射线。第四步是射线编码。把射线原点、射线方向和深度信息编码成特征向量再和图像特征融合。第五步是空间预测。在射线空间里执行跨帧匹配、运动估计或未来帧预测。第六步是重投影。把预测结果重新映射到像素网格生成新一帧图像。这个流程中最关键的是第三步和第四步。传统模型会直接给特征图加上二维网格位置编码射线空间方案则用射线原点、方向编码替代网格位置编码。这样一来模型内部拿到的每个位置特征都带有三维几何语义。下面给出一个概念验证框架的目录结构scope_demo/ ├── config.yaml ├── data/ │ └── dataset.py ├── models/ │ ├── position_encoding.py │ └── predictor.py ├── utils/ │ └── camera.py ├── train.py └── evaluate.py这个结构不是官方实现只是用来演示核心思路。实际复现时需要根据官方仓库的代码结构替换。3.2 编写像素转射线的工具模块在上一章已经给出了build_rays的实现。在完整项目中这个函数应该放在utils/camera.py里并补齐深度采样逻辑。深度采样决定了模型沿射线要观察哪些位置。常见的做法是在 [near, far] 区间内均匀采样或者按照线性深度、逆深度采样。逆深度采样更适合相机透视模型因为近处空间需要更密的采样。def sample_points(origins, directions, near, far, num_samples): # origins: [B, N, 3], directions: [B, N, 3] # 返回 [B, N, num_samples, 3] 的三维采样点 B, N, _ origins.shape t torch.linspace(near, far, num_samples, deviceorigins.device) t t.reshape(1, 1, num_samples) # 采样点坐标 points origins.unsqueeze(2) directions.unsqueeze(2) * t.unsqueeze(-1) return points采样点数量直接影响显存和计算量。学习阶段可以用 64 到 128 个采样点生产环境如果对延迟敏感需要减少采样点或者使用由粗到细的采样策略。3.3 把网格位置编码替换成射线位置编码视频世界模型里位置编码的输入通常是像素网格坐标 (i,j)。SCoPE 的思路是用射线空间信息替代这组坐标。射线信息包括起点、方向和隐式深度通常需要做傅里叶特征编码让模型能够学习高频几何细节。下面是一段射线位置编码的示意代码import torch import torch.nn as nn class RayPositionalEncoding(nn.Module): def __init__(self, num_frequencies10): super().__init__() self.num_frequencies num_frequencies def encode(self, x): # x: [..., C] freq 2.0 ** torch.arange(self.num_frequencies, devicex.device) * torch.pi out [x] for f in freq: out.append(torch.sin(x * f)) out.append(torch.cos(x * f)) return torch.cat(out, dim-1) def forward(self, origin, direction): # origin: [..., 3], direction: [..., 3] return torch.cat([self.encode(origin), self.encode(direction)], dim-1)这段代码的输入是一个像素对应的射线起点和方向输出是一个高维位置特征向量。与普通网格位置编码相比它多包含了射线方向角度信息。实际使用中编码后的维度会很高需要再接一个线性层压缩到模型隐藏维度。需要注意网格位置编码本身不是错误它简单、稳定且不需要相机参数。射线位置编码的优势只体现在相机运动明显、需要跨视角建模的任务里。如果任务场景固定射线位置编码不一定能带来明显提升。3.4 数据结构、参数表和配置示例在最小复现框架里需要把训练配置统一管理。下面是一个 YAML 风格配置文件示例data: video_root: ./data/example_videos height: 256 width: 256 num_frames: 4 camera: use_ray_space: true near: 0.1 far: 10.0 num_samples: 64 model: position_encoding: ray num_frequencies: 10 hidden_dim: 512 train: batch_size: 4 learning_rate: 1e-4 max_epochs: 100关键参数建议如下表参数含义备注num_samples每条射线上的采样点数量越大几何表达越细但显存越高near / far射线采样深度范围需要根据场景尺度设置num_frequencies射线编码频率数频率越高越容易表达高频细节use_ray_space是否启用射线空间位置编码用于对比实验height / width图像分辨率射线数量等于 H×W影响显存如果原始项目没有给出明确版本落地前要先确认依赖版本。常见依赖包括 PyTorch、einops、numpy、opencv-python具体以实际环境为准。4. 如何验证射线空间真的改善了位置关系4.1 最小实验预测同一场景在两个视角下的下一帧验证射线空间是否有效不能只比较生成画面的清晰度。更合理的做法是设计一个与位置关系强相关的对比实验。建议使用一个带相机位姿的合成视频数据集。场景可以很简单比如一个桌面上放着几个不同颜色的立方体。相机围绕场景拍摄多段轨迹每段轨迹包含连续帧和对应的相机位姿。把数据分成训练集和验证集保证验证集里包含训练时没有出现过的视角。然后训练两个模型一个使用普通网格位置编码一个使用射线位置编码。除了位置编码方式不同外骨干网络、损失函数、优化器、训练步数都保持一致。在验证阶段输入相同的前几帧和相机位姿让两个模型分别预测下一帧。这个实验能回答一个明确问题在未见过的视角下哪种位置关系表示能让模型生成更稳定、更符合几何关系的结果。4.2 定量指标几何一致性与生成质量分开看定量评估需要把“图像质量”和“几何关系质量”分开。图像质量指标常用 PSNR、SSIM、LPIPS但它们只能衡量画面接近程度不能判断空间位置是否正确。几何关系质量需要额外设计指标。一个常见做法是轨迹误差在场景中放置已知三维坐标的关键点通过渲染得到每个关键点在预测帧中的二维投影再去和真实投影比较。如果射线空间表示有效模型在相机位姿变化很大的情况下关键点投影误差应该明显更小。另一个指标是遮挡关系正确率。选取一前一后两个物体记录真实遮挡关系再判断预测帧中的遮挡关系是否保持一致。这个指标可以暴露位置关系错乱问题。视频级指标还常用 FVD它衡量生成视频在特征分布上的接近程度能反映时序一致性但也不能单独作为位置关系正确性的依据。4.3 可视化验证轨迹、深度、遮挡与长视频漂移可视化验证比数值指标更直观。可以输出三组图像对比真实帧、网格位置编码模型预测帧、射线位置编码模型预测帧。重点关注物体边缘、重叠关系和背景纹理。更有效的可视化方式是画运动轨迹。选取物体上的一个点把真实轨迹和模型预测轨迹画在同一张图上。如果真实轨迹是一条直线而网格模型预测成了弯曲轨迹说明模型把视角变化错误地解释成了物体运动。长视频漂移测试也很必要。让模型连续自回归生成 20 到 50 帧观察物体是否会逐渐漂移、变形。射线空间表示因为引入了三维几何通常能更长时间保持物体形状稳定但这也依赖相机参数和深度估计的精度。4.4 学习环境与生产环境的验证差异学习环境里可以使用合成数据因为合成数据有真实相机位姿、真实深度遮挡关系也是精确的。生产环境则完全不同真实视频的相机位姿通常来自视觉里程计或 IMU 融合存在噪声和累积漂移。对比关系如下对比项学习环境生产环境相机位姿精确已知估计结果有误差深度可获取真实深度通常没有可靠深度场景规模简单、可控复杂、开放评估重点算法可行性鲁棒性和稳定性额外保障不需要需要异常处理、回滚、监控生产环境落地时建议在训练阶段加入相机位姿噪声模拟推理阶段的位姿估计误差。否则模型会在真实数据上表现严重退化。5. 复现和落地时的典型问题排查5.1 训练损失下降但预测画面模糊现象是训练过程中损失函数持续下降但生成的预测帧看起来很模糊特别是物体边缘和纹理区域。常见原因是损失函数过于简单。视频预测任务里L1 或 L2 损失会对多个可能结果取平均导致画面出现重影和模糊。射线空间表示本身不会解决这个问题需要配合感知损失、GAN 损失或扩散模型目标使用。另一种原因是射线采样点不足。如果 num_samples 设置得太小模型没有足够的三维位置采样点来还原精细结构。可以逐步增大 num_samples 观察画面变化。处理顺序先检查损失函数是否合适再检查采样点数量最后检查是否因为输入图像分辨率过低导致细节丢失。5.2 相机参数有误差时结果更差射线空间表示强依赖相机参数。如果相机内参和外参不准确构造出来的射线就是错误的。模型在一个错误的三维几何上学习很难得到好结果。实际项目中真实视频的相机位姿往往来自 SLAM 或 SfM 系统这些系统在弱纹理区域容易产生漂移。可以在训练时对相机位姿做数据增强比如在位移和旋转上加入高斯噪声。这样模型会对位姿误差更鲁棒。如果推理时输入的是估计位姿还要保持训练和推理的噪声分布一致。如果训练时使用精确位姿推理时使用含噪声位姿模型会产生明显的性能下降。5.3 显存占用爆炸射线采样数量失控射线空间的显存消耗非常大。假设一帧图像分辨率为 256×256那么有 65536 条射线。如果每条射线采样 64 个点单个 batch 为 4 帧总采样点数为 65536×64×4约 1677 万个点。这些点需要经过特征提取和空间编码显存占用会迅速上升。解决方案有几种。第一是降低分辨率比如先用 128×128 验证流程。第二是减少每条射线的采样点数量采用由粗到细采样。第三是随机采样部分射线而不是对整张图像的所有像素都构造射线。实际排查时可以先打印张量的 shape检查采样点数量是否符合预期。如果发现内存溢出优先调整 batch_size、num_samples 和图像分辨率而不是直接更换大显存显卡。5.4 训练与推理分布不一致导致崩溃有些模型在训练时会使用真实相机位姿但推理阶段相机位姿来自在线估计存在延迟和噪声。这会导致模型在离线测试里指标很好线上推理时画面崩溃。处理方式是在训练阶段引入位姿扰动并且让扰动强度与真实误差水平匹配。另一个做法是增加相机位姿校准模块在线修正输入位姿再送入模型。建议在模型评估阶段增加一个鲁棒性测试给测试集的相机位姿加入不同程度噪声画出性能曲线。这样能直观看到模型对相机参数误差的敏感度。下面是常见问题的汇总表问题现象常见原因检查方式处理建议画面模糊损失函数不合适、采样点不足调整损失函数、查看分辨率增加感知损失、提高采样密度位姿误差导致退化相机标定不准、训练推理不一致对比加入噪声前后的指标训练时加入位姿噪声、在线校正显存溢出采样点数量失控打印采样张量 shape降低分辨率、减少采样数视角切换后变形位置编码不包含几何信息做未见视角对比实验改用射线位置编码长视频漂移自回归误差累积连续生成 30 帧以上观察引入时序损失、深度正则6. 从 SCoPE 到可落地的视频世界模型最佳实践与扩展方向6.1 位置关系表示不是唯一的改进点但优先级很高视频世界模型的改进方向很多包括更好的时序建模、更强的生成骨干、更复杂的损失函数、更大规模的数据集。位置关系表示往往容易被忽略因为它属于底层设计不直接体现在表面指标上。但位置关系表示会影响所有上层能力。如果模型不知道物体在空间中的位置它就很难正确预测碰撞、遮挡和运动轨迹。SCoPE 选择从射线空间入手等于是在修正模型理解世界的基础坐标系。在实际项目中建议先确认当前系统的核心问题是否来自位置关系错乱。可以通过固定相机的基线模型和带相机运动的基线模型对比如果相机运动后性能显著下降就值得考虑射线空间表示。6.2 工程落地需要额外考虑的事情从研究原型到生产环境需要考虑的问题比论文实验更多。射线空间方案依赖相机参数因此必须建立一套完整的相机参数管理机制。首先是配置外置化。相机内参、深度范围、采样策略这些内容不应该硬编码在代码里而应该放到配置中心或配置文件中。其次是日志和监控。每次训练的射线分布、采样点数量、显存占用、位姿误差都需要记录。异常处理也要提前设计。真实视频的某些帧可能没有位姿信息或者位姿估计结果明显异常。管线里需要设置过滤和回退机制不能因为一帧位姿错误导致整个训练任务中断。模型版本和数据版本同样重要。射线空间模型对相机参数很敏感如果训练集使用的坐标系和线上请求使用的坐标系不一致可能出现完全不可预测的生成结果。6.3 可复用的检查清单在发布或复现 SCoPE 类项目时可以按以下清单检查相机内参和外参是否经过校验坐标系是否统一。射线深度范围 near/far 是否覆盖场景中所有物体。射线采样点数量是否和显存容量匹配。位置编码是使用了射线空间还是仍然只有网格坐标。训练集和验证集是否包含不同的相机视角。推理阶段输入相机位姿的误差是否被训练阶段覆盖。是否设置了遮挡关系、轨迹误差、长视频漂移等专项测试。是否记录训练日志、显存曲线和异常样本。是否准备回滚方案和模型版本管理。是否评估过采样点数量、分辨率和推理延迟的平衡关系。6.4 下一步学习与扩展方向SCoPE 提供的思路可以沿多个方向扩展。第一个方向是把射线空间表示和生成式骨干网络结合。当前很多视频生成模型使用扩散模型或自回归模型如果能在这些模型的位置编码层面引入射线几何理论上可以提升视频生成的空间一致性。第二个方向是接入更精确的三维场景表示。射线空间只是位置关系的描述方式还可以进一步结合深度估计、点云、三维高斯表示让模型在训练时获得更多几何监督。第三个方向是用于具身智能和自动驾驶仿真。这类场景对空间位置关系要求极高相机运动频繁物体遮挡和碰撞预测是关键能力。射线空间能够为模型提供更清晰的几何先验。对新手来说最有价值的练习不是立刻复现 SCoPE 的完整系统而是先在自己的视频预测模型里替换位置编码使用合成数据做对比实验。这个过程会让人真正理解位置关系表示对视频世界模型的影响。