| # HunyuanWorld 2.0 — 文档 |
| 本文档提供了 HunyuanWorld 2.0 各组件的详细使用指南、参数参考和输出格式说明。 |
|
|
| ## 目录 |
| - [WorldMirror 2.0(世界重建)](#worldmirror-20世界重建) |
| - [概述](#概述) |
| - [Python API](#python-api) |
| - [`WorldMirrorPipeline.from_pretrained`](#worldmirrorpipelinefrom_pretrained) |
| - [`WorldMirrorPipeline.__call__`](#worldmirrorpipelinecall) |
| - [命令行参考](#命令行参考) |
| - [输出格式](#输出格式) |
| - [文件结构](#文件结构) |
| - [预测字典](#预测字典) |
| - [先验注入](#先验注入) |
| - [相机参数(JSON)](#相机参数json) |
| - [深度图(文件夹)](#深度图文件夹) |
| - [组合先验](#组合先验) |
| - [多卡推理](#多卡推理) |
| - [高级选项](#高级选项) |
| - [禁用预测头](#禁用预测头) |
| - [掩码过滤](#掩码过滤) |
| - [点云压缩](#点云压缩) |
| - [Gradio 应用](#gradio-应用) |
| - [全景生成](#全景生成) |
| - [世界生成](#世界生成) |
|
|
| --- |
| ## WorldMirror 2.0(世界重建) |
| ### 概述 |
| WorldMirror 2.0 是一个统一的前馈模型,用于从多视图图像或视频进行全面的3D几何预测。它能同时生成: |
| - **3D 点云**(世界坐标系) |
| - **逐视图深度图**(相机坐标系) |
| - **表面法线**(相机坐标系) |
| - **相机位姿**(c2w)和**内参** |
| - **3D 高斯点云**属性(均值、尺度、旋转、不透明度、球谐系数) |
|
|
| 相比 WorldMirror 1.0 的关键改进: |
| - **归一化 RoPE** 支持灵活分辨率推理 |
| - **深度掩码预测** 实现稳健的无效像素处理 |
| - **序列并行 + FSDP + BF16** 实现高效多卡推理 |
|
|
| --- |
| ### Python API |
| #### `WorldMirrorPipeline.from_pretrained` |
| 工厂方法,用于加载模型并创建 Pipeline 实例。 |
| |
| ```python |
| from hyworld2.worldrecon.pipeline import WorldMirrorPipeline |
| |
| pipeline = WorldMirrorPipeline.from_pretrained( |
| pretrained_model_name_or_path="tencent/HY-World-2.0", |
| subfolder="HY-WorldMirror-2.0", |
| config_path=None, |
| ckpt_path=None, |
| use_fsdp=False, |
| enable_bf16=False, |
| fsdp_cpu_offload=False, |
| disable_heads=None, |
| ) |
| ``` |
| |
| | 参数 | 类型 | 默认值 | 描述 | |
| |------|------|--------|------| |
| | `pretrained_model_name_or_path` | `str` | `"tencent/HY-World-2.0"` | HuggingFace 仓库 ID 或本地路径 | |
| | `subfolder` | `str` | `"HY-WorldMirror-2.0"` | 仓库内包含 WorldMirror 检查点的子文件夹(`model.safetensors` + 配置文件) | |
| | `config_path` | `str` | `None` | 训练配置 YAML(与 `ckpt_path` 配合用于自定义检查点) | |
| | `ckpt_path` | `str` | `None` | 检查点文件(`.ckpt` / `.safetensors`)。与 `config_path` 一起使用时,从本地检查点加载模型而非 HuggingFace | |
| | `use_fsdp` | `bool` | `False` | 通过完全分片数据并行(FSDP)在多卡间分片参数 | |
| | `enable_bf16` | `bool` | `False` | 使用 bfloat16 精度(数值敏感层除外) | |
| | `fsdp_cpu_offload` | `bool` | `False` | 将 FSDP 参数卸载到 CPU(节省显存但降低速度) | |
| | `disable_heads` | `list[str]` | `None` | 要禁用并释放内存的预测头。可选:`"camera"`、`"depth"`、`"normal"`、`"points"`、`"gs"` | |
|
|
| **说明:** |
| - 分布式模式通过 `WORLD_SIZE` 环境变量(由 `torchrun` 设置)自动检测。 |
| - 使用多卡时,每个 rank 都需要调用 `from_pretrained`——该方法内部处理 `dist.init_process_group`。 |
|
|
| --- |
| #### `WorldMirrorPipeline.__call__` |
| 对一组图像或视频运行推理。 |
|
|
| ```python |
| result = pipeline( |
| input_path, |
| output_path="inference_output", |
| **kwargs, |
| ) |
| ``` |
|
|
| 返回输出目录路径(`str`),如果输入被跳过则返回 `None`。 |
|
|
| **推理参数:** |
|
|
| | 参数 | 类型 | 默认值 | 描述 | |
| |------|------|--------|------| |
| | `input_path` | `str` | *(必填)* | 图像目录或视频文件路径 | |
| | `output_path` | `str` | `"inference_output"` | 输出根目录 | |
| | `target_size` | `int` | `952` | 最大推理分辨率(最长边)。图像将被缩放 + 中心裁剪到最近的 14 的倍数 | |
| | `fps` | `int` | `1` | 从视频输入提取帧的帧率 | |
| | `video_strategy` | `str` | `"new"` | 视频帧提取策略:`"new"`(运动感知)或 `"old"`(均匀 FPS) | |
| | `video_min_frames` | `int` | `1` | 从视频中提取的最少帧数 | |
| | `video_max_frames` | `int` | `32` | 从视频中提取的最多帧数 | |
|
|
| **保存参数:** |
|
|
| | 参数 | 类型 | 默认值 | 描述 | |
| |------|------|--------|------| |
| | `save_depth` | `bool` | `True` | 保存逐视图深度图(PNG 可视化 + NPY 原始值) | |
| | `save_normal` | `bool` | `True` | 保存逐视图表面法线图(PNG) | |
| | `save_gs` | `bool` | `True` | 保存 3D 高斯点云为 `gaussians.ply` | |
| | `save_camera` | `bool` | `True` | 保存相机参数为 `camera_params.json` | |
| | `save_points` | `bool` | `True` | 保存基于深度的点云为 `points.ply` | |
| | `save_colmap` | `bool` | `False` | 保存 COLMAP 格式的稀疏重建(`sparse/0/`) | |
| | `save_conf` | `bool` | `False` | 保存深度置信度图 | |
| | `save_sky_mask` | `bool` | `False` | 保存天空分割掩码 | |
|
|
| **掩码参数:** |
|
|
| | 参数 | 类型 | 默认值 | 描述 | |
| |------|------|--------|------| |
| | `apply_sky_mask` | `bool` | `True` | 从点云和高斯中过滤天空区域 | |
| | `apply_edge_mask` | `bool` | `True` | 过滤边缘/不连续区域 | |
| | `apply_confidence_mask` | `bool` | `False` | 过滤低置信度预测 | |
| | `sky_mask_source` | `str` | `"auto"` | 天空掩码方法:`"auto"`(ONNX + 模型融合)、`"model"`(仅模型预测)、`"onnx"`(仅外部分割) | |
| | `model_sky_threshold` | `float` | `0.45` | 基于模型的天空检测阈值 | |
| | `confidence_percentile` | `float` | `10.0` | 置信度过滤的百分位阈值(移除最低 N%) | |
| | `edge_normal_threshold` | `float` | `1.0` | 法线边缘检测容差 | |
| | `edge_depth_threshold` | `float` | `0.03` | 深度边缘检测相对容差 | |
|
|
| **压缩参数:** |
|
|
| | 参数 | 类型 | 默认值 | 描述 | |
| |------|------|--------|------| |
| | `compress_pts` | `bool` | `True` | 通过体素合并 + 随机采样压缩点云 | |
| | `compress_pts_max_points` | `int` | `2,000,000` | 压缩后的最大点数 | |
| | `compress_pts_voxel_size` | `float` | `0.002` | 点云合并的体素大小 | |
| | `max_resolution` | `int` | `1920` | 保存输出图像的最大分辨率 | |
| | `compress_gs_max_points` | `int` | `5,000,000` | 体素剪枝后的最大高斯数 | |
|
|
| **先验参数:** |
|
|
| | 参数 | 类型 | 默认值 | 描述 | |
| |------|------|--------|------| |
| | `prior_cam_path` | `str` | `None` | 相机参数 JSON 文件路径 | |
| | `prior_depth_path` | `str` | `None` | 深度图文件夹路径 | |
|
|
| **渲染视频参数:** |
|
|
| | 参数 | 类型 | 默认值 | 描述 | |
| |------|------|--------|------| |
| | `save_rendered` | `bool` | `False` | 从高斯点云渲染插值飞行视频 | |
| | `render_interp_per_pair` | `int` | `15` | 每对相机之间的插值帧数 | |
| | `render_depth` | `bool` | `False` | 同时渲染深度可视化视频 | |
|
|
| **其他参数:** |
|
|
| | 参数 | 类型 | 默认值 | 描述 | |
| |------|------|--------|------| |
| | `log_time` | `bool` | `True` | 打印计时报告并保存 `pipeline_timing.json` | |
| | `strict_output_path` | `str` | `None` | 若指定,结果直接保存到该路径下,不创建 `<case_name>/<timestamp>` 子目录 | |
|
|
| --- |
| ### 命令行参考 |
| 所有 `__call__` 参数都可作为命令行参数使用: |
|
|
| ```bash |
| python -m hyworld2.worldrecon.pipeline \ |
| --input_path path/to/images \ |
| --output_path inference_output \ |
| --target_size 952 \ |
| --prior_cam_path path/to/camera_params.json \ |
| --prior_depth_path path/to/depth_dir/ |
| ``` |
|
|
| **布尔标志约定:** |
|
|
| | 启用 | 禁用 | |
| |------|------| |
| | `--save_colmap` | *(省略)* | |
| | `--save_conf` | *(省略)* | |
| | `--save_sky_mask` | *(省略)* | |
| | `--apply_sky_mask`(默认开启) | `--no_sky_mask` | |
| | `--apply_edge_mask`(默认开启) | `--no_edge_mask` | |
| | `--apply_confidence_mask` | *(省略)* | |
| | `--compress_pts`(默认开启) | `--no_compress_pts` | |
| | `--log_time`(默认开启) | `--no_log_time` | |
| | *(默认开启)* `save_depth` | `--no_save_depth` | |
| | *(默认开启)* `save_normal` | `--no_save_normal` | |
| | *(默认开启)* `save_gs` | `--no_save_gs` | |
| | *(默认开启)* `save_camera` | `--no_save_camera` | |
| | *(默认开启)* `save_points` | `--no_save_points` | |
| | `--save_rendered` | *(省略)* | |
| | `--render_depth` | *(省略)* | |
|
|
| **仅命令行参数:** |
|
|
| | 参数 | 描述 | |
| |------|------| |
| | `--config_path` | 用于自定义检查点加载的训练配置 YAML | |
| | `--ckpt_path` | 本地检查点文件路径 | |
| | `--use_fsdp` | 启用 FSDP 多卡分片 | |
| | `--enable_bf16` | 启用 bfloat16 混合精度 | |
| | `--fsdp_cpu_offload` | 将 FSDP 参数卸载到 CPU | |
| | `--disable_heads` | 以空格分隔要禁用的预测头(例如 `--disable_heads camera normal`) | |
| | `--no_interactive` | 首次推理后退出(跳过交互式提示循环) | |
|
|
| --- |
| ### 输出格式 |
| #### 文件结构 |
|
|
| ``` |
| inference_output/ |
| └── <case_name>/ |
| └── <timestamp>/ |
| ├── depth/ |
| │ ├── depth_0000.png # 归一化深度可视化 |
| │ ├── depth_0000.npy # 原始 float32 深度值 [H, W] |
| │ └── ... |
| ├── normal/ |
| │ ├── normal_0000.png # 法线图可视化(RGB) |
| │ └── ... |
| ├── camera_params.json # 相机外参和内参 |
| ├── gaussians.ply # 3D 高斯点云(标准格式) |
| ├── points.ply # 带颜色的点云 |
| ├── sparse/ # COLMAP 格式(使用 --save_colmap 时) |
| │ └── 0/ |
| │ ├── cameras.bin |
| │ ├── images.bin |
| │ └── points3D.bin |
| ├── rendered/ # 渲染视频(使用 --save_rendered 时) |
| │ ├── rendered_rgb.mp4 |
| │ └── rendered_depth.mp4 # (使用 --render_depth 时) |
| └── pipeline_timing.json # 性能计时报告 |
| ``` |
|
|
| #### 预测字典 |
| 使用 Python API 时,`pipeline(...)` 内部生成一个 `predictions` 字典,包含以下键: |
|
|
| ```python |
| # 几何 |
| predictions["depth"] # [B, S, H, W, 1] — 相机坐标系中的 Z 深度 |
| predictions["depth_conf"] # [B, S, H, W] — 深度置信度 |
| predictions["normals"] # [B, S, H, W, 3] — 相机坐标系中的表面法线 |
| predictions["normals_conf"] # [B, S, H, W] — 法线置信度 |
| predictions["pts3d"] # [B, S, H, W, 3] — 世界坐标系中的 3D 点图 |
| predictions["pts3d_conf"] # [B, S, H, W] — 点云置信度 |
| # 相机 |
| predictions["camera_poses"] # [B, S, 4, 4] — 相机到世界(c2w),OpenCV 约定 |
| predictions["camera_intrs"] # [B, S, 3, 3] — 相机内参矩阵 |
| predictions["camera_params"]# [B, S, 9] — 紧凑相机向量(平移、四元数、fov_v、fov_u) |
| # 3D 高斯点云 |
| predictions["splats"]["means"] # [B, N, 3] — 高斯中心 |
| predictions["splats"]["scales"] # [B, N, 3] — 高斯尺度 |
| predictions["splats"]["quats"] # [B, N, 4] — 高斯旋转(四元数) |
| predictions["splats"]["opacities"] # [B, N] — 高斯不透明度 |
| predictions["splats"]["sh"] # [B, N, 1, 3] — 球谐函数(0 阶) |
| predictions["splats"]["weights"] # [B, N] — 逐高斯置信度权重 |
| ``` |
|
|
| 其中 `B` = 批大小(推理时始终为 1),`S` = 输入视图数,`H, W` = 图像尺寸,`N` = 总高斯数(`S × H × W`)。 |
|
|
| --- |
| ### 先验注入 |
| WorldMirror 2.0 接受三种几何先验作为条件输入。先验会从提供的文件中自动检测。 |
|
|
| | 先验类型 | 条件标志 | 输入格式 | |
| |----------|----------|----------| |
| | 相机位姿 | `cond_flags[0]` | c2w 4×4 矩阵(OpenCV 约定) | |
| | 深度图 | `cond_flags[1]` | 逐视图浮点深度图 | |
| | 相机内参 | `cond_flags[2]` | 3×3 内参矩阵 | |
|
|
| #### 相机参数(JSON) |
| 相机参数文件格式与 Pipeline 输出的 `camera_params.json` 一致: |
|
|
| ```json |
| { |
| "num_cameras": 2, |
| "extrinsics": [ |
| { |
| "camera_id": 0, |
| "matrix": [ |
| [0.98, 0.01, -0.17, 0.52], |
| [-0.01, 0.99, 0.01, -0.03], |
| [0.17, -0.01, 0.98, 1.20], |
| [0.0, 0.0, 0.0, 1.0] |
| ] |
| } |
| ], |
| "intrinsics": [ |
| { |
| "camera_id": 0, |
| "matrix": [ |
| [525.0, 0.0, 320.0], |
| [0.0, 525.0, 240.0], |
| [0.0, 0.0, 1.0] |
| ] |
| } |
| ] |
| } |
| ``` |
|
|
| **字段说明:** |
|
|
| | 字段 | 描述 | |
| |------|------| |
| | `camera_id` | 整数索引(`0`、`1`、`2` ...)或图像文件名(不含扩展名,如 `"image_0001"`) | |
| | `extrinsics.matrix` | 4×4 相机到世界(c2w)变换矩阵,OpenCV 坐标约定 | |
| | `intrinsics.matrix` | 3×3 相机内参矩阵(像素单位):`fx, fy` 为焦距,`cx, cy` 为主点坐标 | |
|
|
| **重要说明:** |
| - `extrinsics` 和 `intrinsics` 列表可以独立提供或一起提供。列表为空 `[]` 或缺失字段表示该先验不可用。 |
| - **内参分辨率:** 值应对应**原始图像分辨率**。Pipeline 会根据推理时的 resize + center-crop 自动调整。 |
| - **外参对齐:** Pipeline 会自动将所有外参相对于第一帧归一化,与训练行为一致。 |
| #### 深度图(文件夹) |
| 深度图以独立文件存储在一个文件夹中。文件名应与输入图像文件名对应。支持格式:`.npy`、`.exr`、`.png`(16-bit)。 |
|
|
| ``` |
| prior_depth/ |
| ├── image_0001.npy # float32, shape [H, W] |
| ├── image_0002.npy |
| └── ... |
| ``` |
|
|
| #### 组合先验 |
| 先验可以自由组合。示例: |
|
|
| ```bash |
| # 仅内参 |
| python -m hyworld2.worldrecon.pipeline --input_path images/ \ |
| --prior_cam_path camera_intrinsics_only.json |
| # 仅深度 |
| python -m hyworld2.worldrecon.pipeline --input_path images/ \ |
| --prior_depth_path depth_maps/ |
| # 相机位姿 + 内参 + 深度 |
| python -m hyworld2.worldrecon.pipeline --input_path images/ \ |
| --prior_cam_path camera_params.json \ |
| --prior_depth_path depth_maps/ |
| ``` |
|
|
| --- |
| ### 多卡推理 |
| WorldMirror 2.0 支持跨多卡的**序列并行(SP)**推理,其中 token 序列在 ViT 骨干网络中跨 rank 分片,DPT 预测头并行处理帧。 |
|
|
| > **要求:** 输入图像数量必须 **>= GPU 数量**(`nproc_per_node`)。例如,使用 8 卡时需要提供至少 8 张输入图像。如果不满足此条件,Pipeline 将报错。 |
|
|
| ```bash |
| # 2 卡 + FSDP + bf16 |
| torchrun --nproc_per_node=2 -m hyworld2.worldrecon.pipeline \ |
| --input_path path/to/images \ |
| --use_fsdp --enable_bf16 |
| # 4 卡 |
| torchrun --nproc_per_node=4 -m hyworld2.worldrecon.pipeline \ |
| --input_path path/to/images \ |
| --use_fsdp --enable_bf16 |
| # Python API(在 torchrun 脚本内) |
| from hyworld2.worldrecon.pipeline import WorldMirrorPipeline |
| pipeline = WorldMirrorPipeline.from_pretrained( |
| 'tencent/HY-World-2.0', |
| use_fsdp=True, |
| enable_bf16=True, |
| ) |
| pipeline('path/to/images') |
| ``` |
|
|
| **内部工作原理:** |
| 1. `from_pretrained` 自动检测 `WORLD_SIZE > 1` 并初始化 `torch.distributed`。 |
| 2. 模型在 rank 0 上加载,并通过 `sync_module_states=True` 广播。 |
| 3. FSDP 将参数跨 SP 进程组分片。 |
| 4. DPT 预测头将帧分配到各 rank 并通过 `AllGather` 汇总结果。 |
| 5. 后处理(掩码计算、保存)仅在 rank 0 上运行。 |
|
|
| --- |
| ### 高级选项 |
| #### 禁用预测头 |
| 当只需要特定输出时,可以禁用不需要的预测头以节省显存: |
|
|
| ```python |
| from hyworld2.worldrecon.pipeline import WorldMirrorPipeline |
| |
| pipeline = WorldMirrorPipeline.from_pretrained( |
| 'tencent/HY-World-2.0', |
| disable_heads=["normal", "points"], # 释放约 200M 参数 |
| ) |
| ``` |
|
|
| 可禁用的预测头:`"camera"`、`"depth"`、`"normal"`、`"points"`、`"gs"`。 |
| #### 掩码过滤 |
| Pipeline 支持三种输出过滤方式,以提高点云和高斯质量: |
| 1. **天空掩码**(`apply_sky_mask=True`):使用基于 ONNX 的分割模型移除天空区域,可选与模型预测的深度掩码融合。 |
| 2. **边缘掩码**(`apply_edge_mask=True`):移除深度/法线不连续处(物体边界)的点。 |
| 3. **置信度掩码**(`apply_confidence_mask=False`):移除预测置信度最低的 N% 的点。 |
| 这些掩码独立应用于 `points.ply`(基于深度)和 `gaussians.ply`(基于 GS)输出。GS 输出在可用时使用其自身的深度预测进行边缘检测。 |
| #### 点云压缩 |
| 当 `compress_pts=True`(默认)时,基于深度的点云会经过以下处理: |
| 1. **体素合并**:每个体素内的点(大小由 `compress_pts_voxel_size` 控制)通过加权平均进行合并。 |
| 2. **随机下采样**:如果结果超过 `compress_pts_max_points`,则进行均匀下采样。 |
| 类似地,高斯也会经过体素剪枝(均值、尺度、四元数、颜色、不透明度的加权平均),并可选下采样至 `compress_gs_max_points`。 |
|
|
| --- |
| ### Gradio 应用 |
| WorldMirror 2.0 的交互式 Web 演示。上传图像或视频,即可在浏览器中可视化 3DGS、点云、深度图、法线图和相机参数。 |
| **快速开始:** |
|
|
| ```bash |
| # 单卡 |
| python -m hyworld2.worldrecon.gradio_app |
| |
| # 多卡 |
| torchrun --nproc_per_node=2 -m hyworld2.worldrecon.gradio_app \ |
| --use_fsdp --enable_bf16 |
| ``` |
|
|
| **使用本地检查点:** |
|
|
| ```bash |
| python -m hyworld2.worldrecon.gradio_app \ |
| --config_path /path/to/config.yaml \ |
| --ckpt_path /path/to/checkpoint.safetensors |
| ``` |
|
|
| **创建公开链接(如 Colab 或远程服务器):** |
|
|
| ```bash |
| python -m hyworld2.worldrecon.gradio_app --share |
| ``` |
|
|
| **参数:** |
|
|
| | 参数 | 默认值 | 描述 | |
| |------|--------|------| |
| | `--port` | `8081` | 服务端口 | |
| | `--host` | `0.0.0.0` | 服务主机 | |
| | `--share` | `False` | 创建公开的 Gradio 链接 | |
| | `--examples_dir` | `./examples/worldrecon` | 示例场景目录路径 | |
| | `--config_path` | `None` | 训练配置 YAML(与 `--ckpt_path` 配合使用) | |
| | `--ckpt_path` | `None` | 本地检查点文件(`.ckpt` / `.safetensors`) | |
| | `--use_fsdp` | `False` | 启用 FSDP 多卡分片 | |
| | `--enable_bf16` | `False` | 启用 bfloat16 混合精度 | |
| | `--fsdp_cpu_offload` | `False` | 将 FSDP 参数卸载到 CPU(节省显存) | |
|
|
| > **重要提示:** 在多卡模式下,输入图像数量必须 **>= GPU 数量**。 |
|
|
| --- |
| ## 全景生成 |
| *即将发布。* |
| 本节将记录全景生成模型,包括: |
| - 文本到全景和图像到全景的 API |
| - 模型架构(基于 MMDiT 的隐式透视到 ERP 映射) |
| - 配置参数 |
| - 输出格式 |
|
|
| --- |
| ## 世界生成 |
| *即将发布。* |
| 本节将记录世界生成流水线,包括: |
| - 轨迹规划配置 |
| - 基于记忆驱动的视频生成进行世界扩展 |
| - 世界组合(点云扩展 + 3DGS 优化) |
| - 从文本/图像到可导航3D世界的端到端生成 |
|
|