视频生成模型这两年卷得厉害,但很多人会发现一个奇怪现象:画面可以越来越清晰,细节可以越来越丰富,一旦涉及空间位置关系,模型经常犯低级错误。两个人擦肩而过会互相穿模;镜头绕到桌子另一侧,杯子和桌子的前后关系会乱掉;物体靠近又远离,尺度感飘忽不定。发生这些问题的原因有很多,最底层的那个根源往往出在表征方式上:视频世界模型把世界压缩成了二维像素网格,然后在这个离散网格上预测下一个时刻的颜色变化。
腾讯最近开源的视频世界模型 SCoPE,就是针对这个问题的一次直接回应。从项目定位看,SCoPE 的核心动作是绕开传统像素网格这条路径,改用射线空间去表达场景中的位置关系。射线这个词在计算机图形学和光线追踪里很常见,把它引入视频世界模型,相当于给模型补上了一种更接近三维几何直觉的位置语言,而不是继续在像素坐标里硬猜遮挡和深度。
这篇文章会做三件事:先把像素网格的局限讲透,再解释射线空间到底是什么,最后给出从数据准备、训练验证到本地复现的完整思路。如果你正在做视频生成、世界模型、空间感知或相关方向,这篇文章值得收藏。由于 SCoPE 目前公开的官方细节有限,文中会明确区分哪些是项目层面的信息,哪些是在此基础上的合理推断。先给结论:SCoPE 不是现成的一键视频生成工具,它更像一个研究型的开源项目。价值在于提出了一种新的空间表征思路,能否落地到具体业务,还要看后续的仓库代码和实验效果。
1. 核心能力速览
在展开分析之前,先用一张表格把 SCoPE 的定位说清楚。
| 能力项 | 说明 |
|---|---|
| 项目名称 | SCoPE(腾讯开源视频世界模型方向项目) |
| 项目类型 | 视频生成 / 视频世界模型 / 空间表征研究 |
| 核心创新 | 用射线空间(Ray Space)重写视频中的位置关系,替代纯像素网格表征 |
| 解决的核心问题 | 像素网格下遮挡关系不稳定、相机视角变化后一致性差、位置关系理解脆弱 |
| 主要能力 | 面向视频世界模型的空间感知表征;更强调位置关系的视频建模思路 |
| 开源情况 | 腾讯开源 |
| 硬件需求 | 官方未给出统一门槛;视频类模型一般建议高性能 GPU,具体以仓库 README 为准 |
| 启动方式 | 未公开一键包;需要按官方 README 创建环境、准备数据、运行训练或推理脚本 |
| 接口 API | 未公开统一 API;需要看仓库是否提供推理脚本 |
| 批量任务 | 取决于仓库实现;本文会给出通用批量验证方案 |
| 适合人群 | 视频生成研究者、世界模型方向开发者、对空间表征感兴趣的技术人员 |
这里特别说明一下:SCoPE 目前能确认的信息,主要是它来自腾讯、是开源项目、核心方向是用射线空间重写视频世界模型的位置关系。表格里的显存需求、启动方式、API 支持更多需要以官方仓库 README 为准。下面先解决一个问题:为什么像素网格会限制视频世界模型。
2. 视频世界模型为什么困在像素网格里
要理解 SCoPE 的动机,先得理解像素网格给视频世界模型带来了什么限制。这个限制不是某一层网络的问题,而是从输入表征开始就埋下了隐患。
2.1 像素网格是离散的二维采样
图像在计算机里本质上是一个二维数组,每个格子叫像素,记录颜色和亮度。视频则是多帧二维数组在时间轴上的排列。视频世界模型在这个基础上做预测、做生成,等于默认了世界的表达方式是“二维格子里的颜色场”。
这种表达对显示和传输很友好,但对理解物理世界并不友好。因为真实世界是三维的,位置关系包含远近、前后、遮挡、穿行。二维网格把这些关系全部压到了一次投影里,靠颜色、边缘和遮挡形成的图案去表达。模型要理解“杯子在桌子前面”这件事,只能从像素层面死记硬背各种遮挡模式的统计特征,而不是真正掌握三维空间里的几何关系。换句话说,像素网格保存的是“拍下来的样子”,而不是“场景本来的结构”。
2.2 遮挡和深度全靠隐式学习
在像素网格表征下,遮挡关系是隐式的。一个物体挡在另一个物体前面,在像素层面表现为前面物体的像素覆盖了后面物体的像素。模型需要从大量视频数据里学到“这种覆盖意味着什么”。
问题是,隐式学习在处理简单场景时还可以,遇到复杂场景就很容易失效。比如旋转镜头下遮挡关系不断变化,或者新物体进入画面形成新的遮挡边界,模型没有足够训练样本时,就会生成出错误的覆盖关系。这也是为什么很多视频生成结果里,物体边缘会出现粘连、破损、穿模。模型并不知道“谁在谁前面”,它只是统计上学会了某种颜色覆盖模式,一旦场景结构超出训练分布,这种模式就崩了。
2.3 相机视角变化是硬伤
像素网格还有一个问题:它和相机视角强绑定。同一场景换一个相机角度,像素坐标全部变化,模型相当于面对一个全新的输入分布。视频世界模型如果要支持视角运动,必须在训练数据里见过足够多视角变化,否则镜头一转,物体结构就崩了。
日常视频里,镜头往往在运动,前景、背景的相对位置会持续变化。模型要在像素坐标上追这些东西,负担很大。尤其是一个物体从画面左侧移动到右侧,再由近到远,所对应的像素坐标变化并不线性,模型要学的是这种非线性映射背后的三维几何。直接从像素网格学,效率低而且容易过拟合到特定镜头运动模式。
2.4 像素网格消耗大量算力
还有一个工程层面的问题。像素网格的分辨率直接决定计算量,视频模型通常要在时空维度同时做注意力计算,复杂度和分辨率高度相关。高分辨率下显存压力很大,低分辨率又容易丢失细节。而且为了建模位置关系,模型往往需要更大的感受野,注意力窗口一扩,计算量又往上翻。
射线做采样时,理论上可以只在关键位置采样,不一定每个像素都那么重。这给优化留下了空间,也让“更高分辨率但更节省计算”成为可能。当然,这只是理论上的可能性,具体还要看实现方式。
2.5 误差容易在时序上累积
视频世界模型通常是一帧帧生成或迭代预测的。像素网格下的每个预测误差会带进下一步推理,误差不断累积,最终表现为长视频里的拖影、闪烁、结构漂移。位置关系一旦错了,后面的预测就更容易错。
这个问题的本质是:模型没有稳定的几何锚点。如果它只是预测颜色贴图,那么每一帧都可能出现微小偏差;但如果有射线方向、距离这一类几何量作为锚点,即使颜色预测有偏差,结构框架仍然是稳定的。这也能解释为什么 SCoPE 选择从表征层动手,而不是简单在损失函数上加几个约束。
3. 射线空间是什么:一种更接近三维几何的位置关系表达
射线空间对很多做图像算法的人来说,可能比像素网格陌生。它其实不是一个新概念,图形学和三维视觉里已经用了很久,只是把它引入视频世界模型,是一个新动作。
3.1 从图形学里的射线说起
在计算机图形学中,光线追踪的基本操作就是投射射线。一条射线由起点和方向决定,延伸到场景中,碰到表面后记录交点信息。这里的关键是:射线天然携带“从哪来、往哪去、走多远”的信息,并且可以在三维空间里自由定义方向。
NeRF 这类神经渲染方法也大量使用了类似思路。相机每个像素对应一条从光心出发的射线,沿射线采样三维点,推断密度和颜色,再合成该像素。射线在这里起到了连接二维图像和三维空间的作用。SCoPE 把射线引入视频世界模型,思路本质上是一脉相承的:先定义观察路径,再沿路径理解场景,而不是只盯着二维投影猜。
3.2 像素网格与射线空间的定位差异
用表格对比两者,差异会更清楚:
| 对比维度 | 像素网格 | 射线空间 |
|---|---|---|
| 基本单元 | 二维像素 (x, y, rgb) | 射线 (origin, direction, distance) |
| 空间维度 | 图像平面 | 三维空间采样路径 |
| 遮挡关系 | 隐式,靠覆盖模式表达 | 显式,深度可以编码在射线上 |
| 相机视角 | 与视角强绑定 | 可以显式建模相机位置和方向 |
| 生成方式 | 直接预测像素颜色 | 先学习空间结构,再合成像素颜色 |
| 物理可解释性 | 较低 | 更高 |
3.3 为什么叫“射线空间”
射线空间可以理解为一个所有可能射线的集合。给定一个相机位姿,它会投射出大量射线;每条射线对应像素网格中的一个像素位置,但又带有方向、深度、交点的三维信息。把视频中的位置关系放到这个空间里表达,等于让模型每时每刻都在处理“从观察点到场景表面”的几何关系,而不是只处理“屏幕上哪里亮哪里暗”。
这样做的一个好处是,射线和射线之间的几何关系可以计算。比如两条射线是否相交、沿同一方向上的深度排序、物体表面在射线上的连续线段,这些都可以成为模型训练时的显式监督信号,帮助模型建立空间结构。
3.4 对视频世界模型的意义
如果用一句话总结:像素网格描述的是“看到什么”,射线空间描述的是“沿着什么视线看到什么”。后者保留了三维几何线索。视频世界模型如果能在训练中同时学会射线方向和距离的变化,就更有机会在生成视频时保持遮挡关系、视角变化和物体运动的物理一致性。
说白了,SCoPE 想解决的是“模型懂不懂空间”的问题。以前模型靠遮挡图案硬猜,现在可以在射线上直接写出“谁在谁前面”“距离多远”“从哪里看向哪里”。位置关系从隐式猜测变成了显式结构,这是最大的变化。
4. 腾讯 SCoPE 的技术思路分析
注意,目前 SCoPE 公开的技术细节有限。下面这部分是基于“SCoPE 用射线空间重写位置关系”这个核心信息所做的合理推断,不是对官方技术报告的完整转述。等仓库代码和论文公开后,再以官方内容为准。
4.1 信息载体从像素变成射线
SCoPE 最直观的改动应该发生在信息载体层面。传统视频模型把输入视频编码成 token 或 latent map,再在 latent space 里做预测。SCoPE 如果要“用射线空间重写位置关系”,大概率是在编码阶段就把视频帧像素映射成射线参数,或者额外维护一组射线特征,用于表达深度、方向和空间位置。
这样做的效果,是让模型不再只看着像素网格去猜测位置关系,而是有了一组更直接的几何信号。从工程角度看,这意味着网络结构里可能要加入相机参数、坐标变换层、射线采样模块,整体架构会比纯像素模型复杂一些。
4.2 位置关系在射线空间里如何表达
在射线空间里,“两个物体的前后关系”可以转化为沿同一条射线上的距离比较。物体 A 在物体 B 前面,意味着沿某条观察射线方向,先碰到 A,后碰到 B。这个关系如果用距离值编码,就非常干净。
换句话说,SCoPE 可能不是简单地把像素坐标换成射线坐标做计算,而是把“位置关系”单独建模成射线上的层次结构。模型训练时学习的不只颜色变化,还包括射线段落的前后顺序、端点位置、遮挡长度等。这样位置关系就不再是像素覆盖的副产品,而是模型真正要预测的目标之一。
4.3 这样改可能带来哪些收益
如果上述思路成立,SCoPE 至少在四个维度上会有改进。
第一,遮挡关系更稳定。因为遮挡关系不再靠像素覆盖的统计规律表达,而是直接来自射线上的几何排序。第二,视角变化一致性更好。相机角度发生改变时,射线方向会跟着几何关系重新计算,而不是让模型凭空想象旋转后的网格样子。第三,长视频生成中的结构漂移更小。位置关系一旦用几何量建立起来,单帧预测错误对整体结构的破坏会更有限。第四,可解释性更好。射线方向、距离这些量可以可视化和分析,这对研究和调试很有帮助。
4.4 也要正视挑战
射线空间不是免费午餐。它带来的成本也很明显:射线采样需要更多计算;生成视频时需要从射线合成回像素,这一步要做坐标变换和渲染;数据准备也变难了,训练射线空间表征通常需要相机参数,普通视频数据集不一定自带。
所以,SCoPE 更适合作为研究框架来验证“射线空间到底能不能提升视频世界模型的空间一致性”,而不是直接变成一个开箱即用的傻瓜型生成工具。如果你的目标是快速做短视频生成,那 SCoPE 现阶段不一定是最优选择;如果你关心视频模型的空间理解边界,那它值得重点关注。
5. 数据准备与训练流程的通用设计思路
如果想复现一个类似 SCoPE 的项目,或者评估这套思路在自己任务上的效果,数据是第一步。射线空间的训练数据和普通视频模型不太一样,它更需要几何信号。
5.1 多视角与深度类视频数据
射线空间要发挥效果,训练数据最好包含多视角视频或带深度信息的视频。这类数据能让模型学会从不同视角推断射线方向、距离和遮挡关系。如果只有普通单视角 RGB 视频,射线空间的优势会打折扣。
可以参考的数据来源包括:
- 带相机位姿的合成场景视频,比如用三维渲染引擎生成的连续镜头。
- 已有的多视角视频数据集,适合做视角一致性测试。
- 用 SLAM、结构光或深度相机采集的带深度数据,能直接给射线提供距离标签。
5.2 相机参数是关键
如果项目需要把像素映射为射线,单张图像不够,至少需要内参矩阵和外参矩阵。内参描述焦距、光心;外参描述相机在世界坐标系中的位置和朝向。没有相机参数的视频,只能在训练时采用近似估计,效果会打折扣。
如果你的数据集没有相机参数,也可以先用 COLMAP、ORB-SLAM 这类工具估算,但要注意估算误差。射线空间对相机位姿误差比普通视频模型更敏感,因为射线方向和位置都依赖位姿。数据准备阶段多花一点时间做相机标定,后面训练会省很多事。
5.3 预处理管线
建议按以下流程做数据预处理:
- 视频抽帧,统一帧率和分辨率。
- 读取或估算相机参数。
- 将像素坐标映射为射线方向。
- 生成射线样本,作为模型输入。
- 按训练需要组织成批量数据。
抽帧这一步不要偷懒。射线空间模型对帧间一致性比较敏感,抽帧时尽量保持时间连续,不要让跳帧太明显,否则模型很难学到稳定的运动关系。
5.4 伪代码示例:像素坐标转射线
这里给一个通用参考实现,表示“像素到射线”的核心逻辑。它不一定是 SCoPE 官方实现,如果要做实际复现,建议直接看仓库代码。
# 伪代码:像素坐标 -> 射线参数 import torch def pixels_to_rays(K, c2w, height, width): """ K: 相机内参 (3, 3) c2w: 相机到世界变换矩阵 (4, 4) """ ys, xs = torch.meshgrid( torch.arange(height), torch.arange(width), indexing="ij", ) pixels = torch.stack([xs, ys, torch.ones_like(xs)], dim=-1).float() inv_K = torch.inverse(K) ndc = pixels @ inv_K.T # (H, W, 3) rays_d = (c2w[:3, :3] @ ndc.unsqueeze(-1)).squeeze(-1) rays_o = c2w[:3, 3].expand(height, width, -1) return rays_o, rays_d5.5 训练配置示例
训练配置可以先用一套保守参数起步,重点是验证射线空间能否学会位置关系,而不是一开始就追求高分辨率。
data: data_root: ./data/scope_dataset precision: bf16 model: type: ray_world_model num_ray_samples: 64 train: batch_size: 1 learning_rate: 1e-4 max_steps: 50000 checkpoint_dir: ./checkpoints注意,num_ray_samples是每条射线上采样的点数。这个值决定了几何信息的粒度。从 64 起步比较稳妥,等显存和效果评估后再往 128、256 调。
6. 本地部署与复现参考
SCoPE 目前没有公开一键包,实际部署必须等官方仓库给出具体启动方式。下面的流程是一条通用参考路径,适合多数本地模型项目的搭建习惯。
6.1 环境准备清单
先确认基础环境:
- 操作系统:Linux 首选,Windows 次之。
- GPU:NVIDIA 显卡,显存越大越好。
- CUDA 和 cuDNN:按 PyTorch 版本匹配。
- Python:建议使用 3.9 到 3.11 区间。
- 磁盘空间:视频数据、模型权重、缓存占用量都不小,至少预留几十 GB 比较稳。
这里不建议用太老的 CUDA,也不要盲目装最新版。先看仓库 requirements 里指定的 PyTorch 版本,再反推 CUDA 版本,这样最省事。
6.2 环境初始化示例
# 创建虚拟环境 conda create -n scope python=3.10 -y conda activate scope # 安装 PyTorch,注意根据本机 CUDA 版本调整 --index-url pip install torch torchvision --index-url <你的CUDA对应的IndexURL># 克隆项目,路径以官方仓库为准 git clone https://github.com/tencent/scope.git cd scope # 安装项目依赖 pip install -r requirements.txt如果仓库还没有公开,也可以用git clone你自己的 fork,或者等官方发布后再拉取。依赖里的torch版本和 CUDA