Tri-World-Model:GAE 新视角生成模型
本仓库存放 GAE 新视角生成项目所需的官方预训练权重、归一化统计,以及本项目的两份完整训练检查点:Top-4 的 24,440-step 版本和全 Source 的 31,418-step 版本。给定同一场景的多张 Source RGB 图像及相机参数,模型在 GAE latent 空间中生成目标视角,再通过 GAE RGB decoder 解码为图像。
900,000 step 是实验的训练目标,两份检查点实际分别训练到 24,440 和 31,418 step。
| 项目 | 共同配置 |
|---|---|
| 输入 | 同一场景的 8 张 Source RGB 及相机参数 |
| 输出 | 6 张目标视角 RGB,图像之间独立预测 |
| 图像分辨率 | 高 × 宽:378 × 672 |
| GAE latent | 每视图 64 × 27 × 48 |
| 代码版本 | c15b8c0 |
| 检查点 | 原训练 Source 数 | 每个目标在 Flow 中读取的 Source | 配置 |
|---|---|---|---|
gae64_source8_top4_6target_900k/step_000024440.pt |
固定 8 张 | 按相机分数选择 4 个 latent | source_views_per_target=4,默认配置 |
gae64_source8_6target_900k/step_000031418.pt |
固定 8 张 | 全部输入 Source latent,不使用 Top-K | source_views_per_target=none |
代码位于 GitHub:jiahaozhang/3dLatent 分支,模型、配置、训练和推理入口均直接放在该分支根目录。
模型结构与数据流
Source RGB [B,S,3,378,672] + Source/Target 相机
│
▼
冻结的官方 DA3-GIANT-1.1:多张 Source 联合编码
│
▼
四层特征 → 分层归一化 → 冻结的官方 GAE encoder
│
▼
Source latents [B,S,64,27,48] → latent 标准化
│
├── Top-4:每个目标按相机位置、朝向选择 4 个 Source latent
└── 全 Source:每个目标读取全部 Source latent
│
目标相机 → Plücker ray map
│
▼
干净 Source latents + 目标 noisy latent + Source/Target ray 条件
│
▼
GAE Flow Transformer:逐目标生成干净 latent
│
▼
目标 latents [B,6,64,27,48] → 反标准化
│
▼
冻结的官方 GAE RGB decoder,逐目标以 num_views=1 解码
│
▼
目标 RGB [B,6,3,378,672]
场景表示由每张 Source 对应的多视图 latent组成,其数量随 Source 数量变化。代码支持不定长 Source 配置,但两份已发布检查点的训练分布都固定为 S=8;31,418-step 全 Source 检查点不是随机 12/14/16 张 Source 训练的结果。其他输入数量的效果尚需单独验证,改变训练分布应新建实验。
Source 与 Target 之间如何交互
Source 图像在 DA3 中进行联合编码。预测时,每个目标在进入 Flow 的第一层 attention 前就拆成独立的 batch 项,独立持有 Source 条件副本;预测图像之间没有 attention,也不会通过被其他目标更新过的 Source hidden states 间接交换信息。RGB decoder 同样逐视图解码。
共享的 Source 表征和相机条件提供跨视角一致性线索,但该实现没有通过预测之间的交互或显式跨目标一致性损失强制保证一致性,仍需要用生成结果进行评估。
Top-4 的含义
对每个目标,按照以下相机分数从小到大选择 4 张 Source:
分数 = 相机中心距离 / Source 典型间距
+ 0.5 × (1 - Source 与 Target 前向方向的余弦相似度)
Source 典型间距取最近非重合相机中心距离的中位数。并列时按原始 Source 顺序稳定选择,选中后保留原始视图编号。该方法是相机位姿启发式,不进行遮挡判断或真实可见区域重叠计算。
Top-4 限制的是 Flow 直接读取的 Source latent 数量。DA3 此前已经联合编码全部 8 张 Source,因此不能把该检查点解释为仅观察了 4 张输入图像。
全 Source 版本关闭上述选择步骤,Flow 直接读取输入列表中的全部 Source latent;六张目标仍然独立预测。
相机约定
使用 OpenCV 相机约定的 camera-to-world 位姿。所有 Source 和 Target 统一以输入列表中的第一张 Source 为锚点,采用 inverse(source_0_c2w) @ c2w 变换到同一坐标系;Top-K 选择不会重新设置锚点。图像中心裁剪、缩放时同步更新内参,随后在 latent patch 网格上生成 Plücker 光线条件。
第一阶段与第二阶段
本项目直接复用官方第一阶段 DA3/GAE 权重,在第二阶段微调 GAE Flow Transformer。
| 模块 | 第二阶段状态 |
|---|---|
| DA3-GIANT-1.1 backbone | 冻结,用于提取四层多视图特征 |
| GAE encoder、特征 decoder、RGB decoder | 冻结,保留官方编解码参数 |
| 特征及 latent 归一化统计 | 固定 |
| Flow 的有效生成、相机及参考条件路径 | 训练,约 7.786 亿个参数 |
| 当前不执行的文本等 Flow 支路 | 冻结,保留官方权重结构以严格加载 |
训练时,Source 条件只由 Source RGB 编码得到。Observed 目标直接复用对应的 Source latent;Novel 目标分别将“全部 Source + 当前这一张目标 GT”送入冻结的第一阶段,提取当前目标的监督 latent。目标 GT 只用于构造监督,不进入 Source 条件。推理入口只读取 Source 图像和目标相机,不读取目标 RGB。
训练设置与损失
| 参数 | 数值 |
|---|---|
| 数据 | DL3DV-10K-Meshed,2K 子集中的项目固定划分 |
| 训练 / 验证场景 | 895 / 99 |
| 每次训练采样 | 8 张 Source;6 张目标由 3 张 Observed 和 3 张 Novel 组成 |
| Scene batch size | 1 |
| Target / codec chunk size | 2 / 2 |
| 优化器 | AdamW,初始学习率 1e-5,weight decay 0 |
| 学习率计划 | warmup 500 step,按 900K 总计划衰减,最低 1e-6 |
| 精度 / EMA | BF16 / 0.9995 |
| Reference dropout | 0.2 |
| Transformer activation checkpointing | 关闭;Ray PE checkpointing 开启 |
| Checkpoint / eval 间隔 | 每 5,000 次有效更新 |
第二阶段在标准化 GAE latent 空间中计算 Flow matching 损失。网络采用 x-prediction,预测干净 latent,再转换为速度计算 MSE:
z_t = (1 - t) × z_0 + t × noise
目标速度 = noise - z_0
预测速度 = (z_t - 预测的干净 latent) / max(t, 0.05)
总损失 = Main Flow MSE + 1.0 × Base Flow MSE
时间步使用 shift 为 6.364 的 logit-normal 采样。Base 是官方 Flow 内部的辅助预测头。本次第二阶段没有额外的 RGB、DINO 或深度监督分支。
默认生成采用 50 步 Euler,参考条件 CFG scale 为 2.0。周期评估默认展示 4 个固定场景;99 是验证划分的场景总数,完整验证需显式启用 --full-validation。本卡未提供独立的完整基准对比结果,不能据此宣称该检查点优于其他方法或已经达到收敛效果。
仓库中的文件
容量使用十进制 GB,包含两份训练检查点的总资产约 37.13 GB。
| 路径 | 用途 | 容量 |
|---|---|---|
ckpts/gae_64.pt |
官方第一阶段 GAE 编解码器及相关头权重 | 1.82 GB |
ckpts/flow_gae64.pt |
官方第二阶段 Flow 初始化权重 | 3.74 GB |
ckpts/da3/model.safetensors |
官方 DA3 backbone 的权重来源 | 5.42 GB |
ckpts/da3/config.json |
DA3 配置 | 约 1.9 KB |
ckpts/latent_stats_gae_64.pt |
64 通道 latent 的均值、标准差 | 约 2 KB |
ckpts/feature_stats/normalization_stats_level0~3.pt |
DA3 四层特征各自的归一化统计 | 每个约 39 KB |
step_000024440.pt |
本项目 Top-4 实验的完整续训检查点 | 13.08 GB |
step_000031418.pt |
本项目全 Source 实验的完整续训检查点 | 13.08 GB |
compatibility/gae64_source8_6target_900k.json |
全 Source 检查点的代码整理兼容性审计 | 约 1.2 KB |
asset_manifest.json、SHA256SUMS |
文件用途、大小、校验值及对应代码版本 | 小文件 |
两份检查点的完整路径为:
outputs/gae_nvs/gae64_source8_top4_6target_900k/ckpts/step_000024440.pt
outputs/gae_nvs/gae64_source8_6target_900k/ckpts/step_000031418.pt
这些文件包含微调后的 Flow 权重、EMA、Adam 状态、学习率调度器、随机状态、更新计数、数据采样位置和训练契约。冻结的 DA3/GAE 从各自官方文件加载,所以恢复训练时仍需下载上述依赖。恢复时,检查点中的 Flow 参数会覆盖官方 flow_gae64.pt 初始化参数。
31,418-step 检查点生成于代码整理之前,本次发布仅迁移了等价的源码路径、模型配置哈希和原来隐含的全 Source 默认项等契约元数据。模型、EMA、优化器、调度器、随机状态及训练进度均已逐项验证保持相同;使用真实检查点权重进行 CPU 前向与反向对比,输出和梯度最大差异均为 0。原始与发布文件的 SHA-256 及审计范围见兼容性报告。
下载与校验
先获取对应代码,并切换到本检查点验证过的版本:
git clone --branch jiahaozhang/3dLatent https://github.com/huanngzh/tri-world-model.git
cd tri-world-model
git checkout c15b8c0f559fd069002b10a2d0a3c8b1676c6bd5
python -m pip install -e . huggingface_hub==0.36.2
使用 Hugging Face CLI,将权重按原目录结构下载到代码根目录;需要身份认证时先执行 hf auth login:
hf download jiahaozhang6/tri-world-model --local-dir . \
--include "ckpts/*" "outputs/*" "compatibility/*" "licenses/*" \
"THIRD_PARTY_NOTICES.md" "asset_manifest.json" "SHA256SUMS"
sha256sum -c SHA256SUMS
校验清单还包含兼容性报告、许可证文件和 THIRD_PARTY_NOTICES.md,上述命令会一并下载。发布时核对全部资产的远端文件大小与 SHA-256。
恢复训练
原训练运行环境为 Python 3.10.21、PyTorch 2.6.0+cu124、CUDA runtime 12.4、NumPy 1.26.4。原生训练后端使用单张 GPU,在 H100 80 GB 上验证。严格续训契约会校验环境、源码、权重与统计文件、数据划分、模型行为、优化器及训练计划。
数据目录由 GAE_DATA_ROOT 指定,程序读取 <root>/2K/<scene>/images/ 和 <root>/2K/<scene>/gw_output/cameras.json;数据文件需要单独准备。目录格式、相机字段、裁剪和训练采样详见 DL3DV 数据与训练说明。
恢复 Top-4 版本:
GAE_DATA_ROOT=/path/to/dl3dv_meshed CUDA_VISIBLE_DEVICES=0 \
python train.py --train \
--resume outputs/gae_nvs/gae64_source8_top4_6target_900k/ckpts/step_000024440.pt
恢复全 Source 版本时,必须显式关闭默认 Top-K:
GAE_DATA_ROOT=/path/to/dl3dv_meshed CUDA_VISIBLE_DEVICES=0 \
python train.py --train \
--resume outputs/gae_nvs/gae64_source8_6target_900k/ckpts/step_000031418.pt \
--set system.params.source_views_per_target=none \
--set tag=gae64_source8_6target_900k
默认配置启用在线 W&B 并继续原 run。使用自己的 W&B 账号时,设置有权限的 entity/project,并加入 --new-wandb-run;该选项只新建日志 run,仍恢复模型、优化器、EMA 和训练进度。修改 Source 分布、Top-K 或损失等训练行为,应作为新的实验处理,不应绕过严格续训检查。
推理
准备一个 views.json,包含 image_directory、source_cameras、target_cameras。每个相机记录包含 img_name、width、height、position、rotation、fx、fy,可选 cx、cy;rotation 和 position 表示 OpenCV c2w。使用与训练一致的 8 张 Source,以及 6 个目标相机;目标图像文件不是推理输入。
CUDA_VISIBLE_DEVICES=0 python sample.py \
--checkpoint outputs/gae_nvs/gae64_source8_top4_6target_900k/ckpts/step_000024440.pt \
--views views.json --output predictions \
--steps 50 --guidance 2.0 --seed 42
使用全 Source 检查点推理:
CUDA_VISIBLE_DEVICES=0 python sample.py \
--checkpoint outputs/gae_nvs/gae64_source8_6target_900k/ckpts/step_000031418.pt \
--set system.params.source_views_per_target=none \
--views views.json --output predictions_allsource \
--steps 50 --guidance 2.0 --seed 42
输出为 target_00.png 至 target_05.png,以及记录实际 Source 选择、相机输入名称和采样参数的 generation.json。推理默认使用检查点中的 EMA 参数。
许可与上游来源
本仓库包含不同来源的资产,不能将全部内容统一解释为 Apache-2.0 许可。
- GAE 相关代码和权重受其官方许可约束,限学术用途;上游为 TencentARC/GAE-GeometricAutoEncoder。
- DA3 官方权重来自 depth-anything/DA3-GIANT-1.1,上游模型标注为 CC-BY-NC-4.0。随附的
licenses/DA3.txt是代码许可证,不能替代模型权重的许可条件。 - DL3DV-10K-Meshed 数据需遵循其数据集条款。本模型仓库不包含训练图像。
微调检查点基于上述预训练资产,使用时仍需遵守对应上游条款。更多来源说明见 THIRD_PARTY_NOTICES.md。