☰
Infinigen 相机配置完全指南:从立体匹配、多视角布点到 RRT* 动态视频轨迹
2026/9/29 5:39:44 网站建设 项目流程
  • 计算机视觉
  • 数据增强
  • 媒体生成

【免费下载链接】infinigen

Infinite Photorealistic Worlds using Procedural Generation

项目地址:https://gitcode.com/gh_mirrors/in/infinigen
点击查看免费下载

导读

本文是 Infinigen(Infinite Photorealistic Worlds using Procedural Generation)官方文档 ConfiguringCameras.md 的深度展开,系统讲解如何为各种计算机视觉任务配置相机:立体匹配(Stereo Matching)、基于 RRT* 的动态相机视频、随机游走视频、多视角环形布点(MVS / NeRF)以及完全自定义的相机排列与动画。读完本文,你将能够直接使用manage_jobs生成可训练/可评测的数据集,并理解相机位姿提议、校验、动画策略背后的源码级原理,从而按需调整速度、旋转、天空占比等参数。


1. 相机系统基础:Rig 结构、提议与校验

在进入命令行示例之前,先理解 Infinigen 的相机抽象。从 src/infinigen/core/placement/camera.py 可以看到,相机以Rig(刚体组)为单位组织:

  • spawn_camera_rigs(camera.py)为每个 rig 创建一个名为camrig.{i}的空父对象,并为每个 rig 按camera_rig_config生成若干子相机,命名为camera_{rig}_{subcam},子相机通过loc与rot_euler配置相对位置;
  • 每个 rig 代表一个"视点组",例如立体相机 rig 内含左右两个子相机,多视角 rig 内含多个朝向目标的子相机;
  • 单目场景的默认配置见 configs_nature/monocular.gin,其中camera.spawn_camera_rigs.camera_rig_config只有一个位于原点、零旋转的子相机。

相机位姿的产生遵循提议(proposal)→ 校验(keep/validate)两步:

  • camera_pose_proposal(camera.py)负责采样候选位置:支持围绕center_coordinate以随机半径环形采样、按altitude/roll/yaw/pitch分布采样,并通过向场景 BVH 射线检测保证视线不被遮挡;
  • keep_cam_pose_proposal(camera.py)负责拒绝坏位姿:离 placeholder 太近、离地形太近、地形覆盖率不在terrain_coverage_range、或某类语义像素占比(如 CloseUp、标签占比)超出camera_selection_ratio范围的候选都会被丢弃;
  • compute_base_views(camera.py)批量搜索并打分排序候选,返回最优的n_views个基视图。min_candidates_ratio控制候选池大小(默认 20 倍),这正是命令中经常出现该参数的原因。

2. 立体匹配(Stereo Matching)

2.1 自然场景:每场景 1 个立体相机

python -m infinigen.datagen.manage_jobs --output_folder outputs/stereo_nature --num_scenes 30 \ --pipeline_config stereo.gin local_256GB.gin cuda_terrain.gin blender_gt.gin --configs high_quality_terrain

2.2 室内场景:每房间 20 个立体相机

python -m infinigen.datagen.manage_jobs --output_folder outputs/stereo_indoors --num_scenes 30 \ --pipeline_configs local_256GB.gin stereo.gin blender_gt.gin indoor_background_configs.gin --configs singleroom \ --pipeline_overrides get_cmd.driver_script='infinigen_examples.generate_indoors' \ --overrides camera.spawn_camera_rigs.n_camera_rigs=20 compute_base_views.min_candidates_ratio=2 compose_indoors.terrain_enabled=False compose_indoors.restrict_single_supported_roomtype=True

参数速查:

参数作用示例值
--output_folder数据输出目录outputs/stereo_indoors
--num_scenes生成场景数30
--configs场景内容配置(逗号分隔的 gin 文件名)singleroom、high_quality_terrain
--pipeline_configs渲染/地形/标注管线配置local_256GB.gin stereo.gin blender_gt.gin
--pipeline_overrides覆盖管线层 gin 参数get_cmd.driver_script=...
--overrides覆盖场景层 gin 参数camera.spawn_camera_rigs.n_camera_rigs=20

关键设计考量(官方文档明确建议):

  • 室内场景建议每房间 20+ 个相机:房间生成与视角无关(view-independent),可以从很多角度渲染同一房间,因此"每场景渲染更多帧"能显著提高 GPU 利用率;
  • 自然场景不要盲目加大n_camera_rigs:当前相机代码会在自然场景中把相机放置得相距很远,导致可见内容几乎不重叠,单纯增加 rig 数量收益甚微;若想从每个自然场景提取更多立体帧,官方推荐改用下面 "Random Walk Videos" 的低帧率视频方案。

3. 基于 RRT* 的动态相机视频(Dynamic Camera Videos with RRT*)

3.1 示例命令

自然场景视频(动态、有趣的相机运动):

python -m infinigen.datagen.manage_jobs --output_folder outputs/video_dynamic_nature --num_scenes 30 --configs high_quality_terrain.gin rrt_cam_nature.gin --pipeline_configs local_256GB.gin blender_gt.gin monocular_video --pipeline_overrides manage_datagen_jobs.num_concurrent=15 iterate_scene_tasks.cam_block_size=24 iterate_scene_tasks.frame_range=[1,200] --overrides fine_terrain.mesher_backend=OcMesher --warmup_sec 2000 --cleanup big_files --overwrite

室内视频(动态、有趣的相机运动):

python -m infinigen.datagen.manage_jobs --output_folder outputs/video_dynamic_indoor --num_scenes 30 \ --configs singleroom.gin rrt_cam_indoors.gin \ --pipeline_configs local_256GB.gin indoor_background_configs.gin monocular_video \ --overrides compute_base_views.min_candidates_ratio=2 compose_indoors.terrain_enabled=False compose_indoors.restrict_single_supported_roomtype=True \ --pipeline_overrides get_cmd.driver_script='infinigen_examples.generate_indoors' iterate_scene_tasks.frame_range=[1,200] \ --warmup_sec 2000 --cleanup big_files --overwrite

要点解读:

  • rrt_cam_indoors.gin(configs_indoor/rrt_cam_indoors.gin)与rrt_cam_nature.gin(configs_nature/extras/rrt_cam_nature.gin)分别用于室内与自然场景,两者都将animate_trajectories.animation_mode设为"rrt",并挂载rrt/validate_cam_pose_rrt作为位姿校验函数;
  • iterate_scene_tasks.frame_range=[1,200]指定动画的帧范围,cam_block_size=24控制并行渲染的帧块大小;
  • --warmup_sec 2000设置任务预热时间,--cleanup big_files清理大文件,--overwrite覆盖已有输出。

3.2 三个可定制组件(源码级原理)

相机动画策略实现在 src/infinigen/core/util/rrt.py,由三个组件协作:

(1)RRT类 —— RRT路径规划* 在 rrt.py 中,RRT在场景包围盒内用 RRT* 算法为起终点生成避障路径:sample_free以 0.1 的偏置向目标采样,steer按步长扩展新节点,neighborhood/wireup实现邻近节点的最小代价连接与重布线(rewire)。关键构造参数包括step_range(步长)、stride_range(两个目标点之间的节点跨度)、min_node_dist_to_obstacle(默认 0.2,控制与障碍物的最小间距)以及max_iter(默认 2000)。室内与自然配置差异明显:

参数rrt_cam_indoors.ginrrt_cam_nature.gin
RRT.step_range(1, 2)(4, 8)
RRT.stride_range(60, 80)(100, 200)
RRT.validate_noderrt/validate_node_indoorsrrt/validate_node_nature
rrt/AnimPolicyRRT.speed('uniform', 1, 2)('uniform', 6, 10)
rrt/AnimPolicyRRT.rot('normal', 0, [20, 20, 20], 3)('normal', 0, [15, 15, 15], 3)

其中validate_node_indoors与validate_node_nature(rrt.py)分别用"是否在房间包围体内 / 是否在物体外"的射线奇偶性测试判断节点合法性。自然场景步长更大、速度更快,是为了在开阔地形上产生更长距离的运动。

(2)AnimPolicyRRT—— 动画策略AnimPolicyRRT(rrt.py)持有RRT实例,逐帧消耗路径节点:reset()生成一条完整路径;__call__依次把路径节点作为关键帧位置,旋转rot与关键帧间隔时长time从用户指定的分布中采样(time = 距离 / speed,插值方式为 BEZIER)。若某个位姿校验失败,策略会retry()回退一个节点重试旋转;若整条路径无法通过校验(PolicyError),则触发完整重试,用 RRT 重新生成路径。

(3)validate_cam_pose_rrt—— 位姿校验validate_cam_pose_rrt(rrt.py)按两个条件判断相机位姿是否合法:

  • 天空像素(sky):穿过该像素的射线未与任何物体相交;
  • 近距离像素(proximity):射线与物体相交且距离小于min_obj_dist(未显式设置时取焦距平面距离)。

任一类型的像素占比超过阈值即判定位姿无效。默认参数为max_sky_percent=0.7、max_proxim_percent=0.5、min_pixels_check=100;室内配置放宽为max_sky_percent=1、max_proxim_percent=0.8、min_obj_dist=1.0,自然配置为max_sky_percent=0.7、max_proxim_percent=0.9、min_obj_dist=1.0。

3.3 调节运动难度

想让运动更容易/更难,直接修改rrt_cam_indoors.gin/rrt_cam_nature.gin中AnimPolicyRRT.speed或AnimPolicyRRT.rot的分布即可。例如,要限制 roll 维度的旋转,可设置:

rrt/AnimPolicyRRT.rot = ('normal', 0, [0, 15, 15], 3)

旋转参数元组的含义是(分布类型, 均值, 各轴标准差列表, 输出维度),即 roll 的标准差为 0(不旋转),pitch 与 yaw 各自在 ±15 度的正态噪声内变化。


4. 随机游走视频(Random Walk Videos)

4.1 示例命令

自然场景视频(缓慢、平滑的随机游走):

python -m infinigen.datagen.manage_jobs --output_folder outputs/video_smooth_nature --num_scenes 30 \ --pipeline_config monocular_video.gin local_256GB.gin cuda_terrain.gin blender_gt.gin --configs high_quality_terrain \ --pipeline_overrides iterate_scene_tasks.cam_block_size=24

自然场景视频(快速、嘈杂的随机游走):

python -m infinigen.datagen.manage_jobs --output_folder outputs/video_smooth_nature --num_scenes 30 \ --pipeline_config monocular_video.gin local_256GB.gin cuda_terrain.gin blender_gt.gin --configs high_quality_terrain noisy_video \ --pipeline_overrides iterate_scene_tasks.cam_block_size=24 --overrides configure_render_cycles.adaptive_threshold=0.05

室内场景视频(缓慢移动的相机):

python -m infinigen.datagen.manage_jobs --output_folder outputs/video_slow_indoor --num_scenes 30 \ --pipeline_configs local_256GB.gin monocular_video.gin blender_gt.gin indoor_background_configs.gin --configs singleroom \ --pipeline_overrides get_cmd.driver_script='infinigen_examples.generate_indoors' \ --overrides compose_indoors.terrain_enabled=False compose_indoors.restrict_single_supported_roomtype=True AnimPolicyRandomWalkLookaround.speed=0.5 AnimPolicyRandomWalkLookaround.step_range=0.5 compose_indoors.animate_cameras_enabled=True

快速版在--configs后追加noisy_video(见 configs_nature/noisy_video.gin),并降低 Cycles 渲染的自适应阈值configure_render_cycles.adaptive_threshold=0.05以保留噪点细节。

4.2 底层动画策略

随机游走由AnimPolicyRandomWalkLookaround(src/infinigen/core/placement/animation_policy.py)实现。其可配置参数包括:

  • speed:默认("uniform", 1, 2.5),行走速度;
  • step_range:默认("clip_gaussian", 3, 5, 0.5, 10),每步移动距离;
  • yaw_sampler:默认("uniform", -20, 20),偏航角抖动;
  • rot_vars:默认(5, 0, 5),roll/pitch/yaw 的旋转噪声标准差;
  • step_speed_mult、motion_dir_zoff、force_single_keyframe:步速倍率、运动方向偏移角、是否强制单关键帧。

每次步进都会调用walk_same_altitude(animation_policy.py):先向上抬升采样点再向下射线检测地面,通过fall_ratio=1.5与step_up_height=2限制坡度,使相机贴地平滑移动。整条轨迹由animate_trajectory(animation_policy.py)逐段生成关键帧,并用validate_keyframe_range做直线可见性校验;步级失败会在max_step_tries(默认 25)内重试,整条轨迹失败会在max_full_retries(默认 40)内重新生成。

⚠️官方重要警告:随机游走相机生成在室内房间之间几乎不可能找到可行路径,因此室内场景下随机游走难以生成长距离或快速移动的视频。官方文档承诺后续将推出基于路径查找的相机轨迹生成器来解决该场景。


5. 多视角相机布点(Multiview Stereo / NeRF 等)

许多任务(多视角立体、NeRF 等)需要相机大致呈圆形排列,并相对目标物体在角度、roll、pitch、yaw 上加入少量噪声。下图展示了室内与自然场景中的多视角布点效果:

5.1 快速测试场景(无家具的室内房间 + 5 个多视角相机)

python -m infinigen.datagen.manage_jobs --output_folder outputs/mvs_test --num_scenes 1 --configs multiview_stereo.gin fast_solve.gin no_objects.gin --pipeline_configs local_256GB.gin monocular.gin blender_gt.gin cuda_terrain.gin indoor_background_configs.gin --overrides camera.spawn_camera_rigs.n_camera_rigs=5 compose_nature.animate_cameras_enabled=False compose_indoors.restrict_single_supported_roomtype=True --pipeline_overrides get_cmd.driver_script='infinigen_examples.generate_indoors' iterate_scene_tasks.n_camera_rigs=5

5.2 室内数据集(30 个多视角相机)

python -m infinigen.datagen.manage_jobs --output_folder outputs/mvs_indoors --num_scenes 30 --pipeline_configs local_256GB.gin monocular.gin blender_gt.gin indoor_background_configs.gin --configs singleroom.gin multiview_stereo.gin --pipeline_overrides get_cmd.driver_script='infinigen_examples.generate_indoors' iterate_scene_tasks.n_camera_rigs=30 --overrides compose_indoors.restrict_single_supported_roomtype=True camera.spawn_camera_rigs.n_camera_rigs=30

5.3 自然场景数据集(30 个多视角相机)

python -m infinigen.datagen.manage_jobs --output_folder outputs/mvs_nature --num_scenes 30 --configs multiview_stereo.gin --pipeline_configs local_256GB.gin monocular.gin blender_gt.gin cuda_terrain.gin --overrides camera.spawn_camera_rigs.n_camera_rigs=30 compose_nature.animate_cameras_enabled=False --pipeline_overrides iterate_scene_tasks.n_camera_rigs=30

5.4 配置背后的源码机制

多视角模式由 configs_nature/multiview_stereo.gin 驱动,它做了四件事:

  • configure_cameras.mvs_setting = True:开启多视角布点逻辑;
  • compose_nature.camera_selection_ranges_ratio = {}与compose_nature.camera_selection_tags_ratio = {}:清空语义占比约束,让环形布点不被"必须拍到某类物体"限制;
  • compose_nature.animate_cameras_enabled = False:关闭相机动画(多视角任务是静止拍摄);
  • compose_nature.inview_distance = 40:限定目标在视距 40 以内,保证内容重叠。

环形噪声来自camera_pose_proposal的center_coordinate分支(camera.py):相机按随机角度分布在目标周围半径radius的圆上,并在 roll、pitch、yaw 上各叠加±5 度的随机噪声(noise_range = np.deg2rad(5.0)),这就是官方文档所说"角度、roll、pitch、yaw 相对物体加入少量噪声"的实现位置;focal_length同样支持随机分布采样。


6. 完全自定义相机排列(Custom Camera Arrangement)

相机位姿可以方便地通过 Blender API 直接操纵,实现任意想要的布点方式。例如,可以替换 generate_nature.py 或 generate_indoors.py 中的pose_cameras步骤,改为如下代码:

for i, rig in enumerate(camera_rigs): rig.location = (i, 0, np.random.uniform(0, 10)) rig.rotation_euler = np.deg2rad(np.array([90, 0, 180 * i / len(camera_rigs)]))

这段代码让第i个 rig 沿 x 轴平移,高度在 0~10 随机,并绕 z 轴按180 * i / len(camera_rigs)均匀旋转,从而形成一圈朝向中心、彼此均分的布点。

如果想在视频过程中动画化相机 rig,则对每个关键帧插入关键帧(keyframe):

for i, rig in enumerate(camera_rigs): for t in range(bpy.context.scene.frame_start, bpy.context.scene.frame_end + 1): rig.location = (t, i, 0) rig.keyframe_insert(data_path="location", frame=t) rig.rotation_euler = np.deg2rad(np.array((90, 0, np.random.uniform(-10, 10)))) rig.keyframe_insert(data_path="rotation_euler", frame=t)

注意这里直接使用bpy.context.scene.frame_start/frame_end确定动画范围,与仓库内部animate_trajectory生成关键帧的方式(见 animation_policy.py 的keyframe辅助函数)一致:对location与rotation_euler两个 data_path 逐帧keyframe_insert。由于这些代码运行在 Infinigen 的 Blender 进程内(入口为python -m infinigen.launch_blender驱动的场景生成脚本),可以直接访问bpy、np等运行时符号。


7. 附录:相机相关配置与测试速查

  • 入口与调度:所有数据集生成命令统一由python -m infinigen.datagen.manage_jobs驱动(对应 src/infinigen/datagen/manage_jobs.py),--pipeline_configs/--configs分别加载管线层与场景层 gin 配置,--overrides/--pipeline_overrides在命令行覆盖对应层参数;
  • RRT 动画策略:src/infinigen/core/util/rrt.py(RRT、AnimPolicyRRT、validate_cam_pose_rrt、validate_node_nature、validate_node_indoors);
  • 随机游走与通用动画:src/infinigen/core/placement/animation_policy.py(AnimPolicyRandomWalkLookaround、AnimPolicyRandomForwardWalk、AnimPolicyFollowObject、walk_same_altitude、animate_trajectory、validate_keyframe_range);
  • 轨迹计算与动画模式:src/infinigen/core/placement/camera_trajectories.py,其中compute_trajectories通过animation_mode支持random_walk、random_walk_forward、follow_poi、rrt四种模式;
  • 相机位姿提议/校验/布点:src/infinigen/core/placement/camera.py(spawn_camera_rigs、camera_pose_proposal、keep_cam_pose_proposal、compute_base_views、configure_cameras);
  • 相关 gin 配置:rrt_cam_indoors.gin、rrt_cam_nature.gin、multiview_stereo.gin、monocular.gin、noisy_video.gin。

如需进一步验证相机轨迹输出,可结合 GroundTruthAnnotations.md 了解各标注通道(深度、法线、分割等)的导出方式,并结合 ConfiguringInfinigen.md 中的 gin 参数机制理解所有 override 语法。

  • 计算机视觉
  • 数据增强
  • 媒体生成

【免费下载链接】infinigen

Infinite Photorealistic Worlds using Procedural Generation

项目地址:https://gitcode.com/gh_mirrors/in/infinigen
点击查看免费下载

相关推荐

上一篇:深度解析Metahuman-stream:构建实时交互数字人的高性能技术架构
下一篇:从0到1开发GitHub CLI:gh_mirrors/gh/gh项目解析与二次开发

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询