| """ |
| Configuration settings and constants for 3D Gaussian Splatting with NeRF datasets. |
| """ |
| import warp as wp |
| import numpy as np |
| import random |
|
|
| SEED = 42 |
| random.seed(SEED) |
|
|
| |
| WP_FLOAT16 = wp.float16 |
| WP_FLOAT32 = wp.float32 |
| WP_INT = wp.int32 |
| WP_VEC2 = wp.vec2 |
| WP_VEC2H = wp.vec2h |
| VEC6 = wp.types.vector(length=6, dtype=WP_FLOAT32) |
| DEVICE = "cuda" |
|
|
| TILE_M = wp.constant(16) |
| TILE_N = wp.constant(16) |
| TILE_THREADS = wp.constant(256) |
|
|
|
|
| class GaussianParams: |
| """Parameters for 3D Gaussian Splatting.""" |
|
|
| |
| num_iterations = 3*7000//1 |
| num_points = 5000 |
|
|
| |
| use_lr_scheduler = True |
| |
| lr_scheduler_config = { |
| 'lr_pos': 1e-4, |
| 'lr_scale': 5e-4, |
| 'lr_rot': 5e-3, |
| 'lr_sh': 2e-3, |
| 'lr_opac': 5e-3, |
| 'final_lr_factor': 0.01 |
| } |
|
|
| |
| densification_interval = 999 |
| pruning_interval = 99 |
| opacity_reset_interval = 5001 |
| save_interval = 99 |
| adam_beta1 = 0.9 |
| adam_beta2 = 0.999 |
| adam_epsilon = 1e-8 |
| |
| |
| densify_grad_threshold = 0.0002 |
| cull_opacity_threshold = 0.005 |
| start_prune_iter = 500 |
| densify_until_iter = 15000 |
|
|
| percent_dense = 0.01 |
| max_allowed_prune_ratio = 0.1 |
|
|
| |
| initial_scale = 0.0035 |
| scale_modifier = 1.0 |
| sh_degree = 1 |
|
|
| |
| scene_scale = 1.0 |
| background_color = [1.0,1.0,1.0] |
|
|
| |
| lambda_dssim = 0.2 |
| depth_loss_weight = 0.5 |
| |
| near = 0.01 |
| far = 100.0 |
|
|
| @classmethod |
| def update(cls, **kwargs): |
| """Update parameters with new values.""" |
| for key, value in kwargs.items(): |
| if hasattr(cls, key): |
| setattr(cls, key, value) |
| else: |
| raise ValueError(f"Unknown parameter: {key}") |
|
|
| """Configuration for Dynamic 4D Gaussian Splatting.""" |
| |
| |
| initial_frame_iterations = 3000 |
| subsequent_frame_iterations = 500 |
| |
| |
| |
| |
| dynamic_positions = True |
| dynamic_scales = False |
| dynamic_rotations = True |
| dynamic_opacities = False |
| dynamic_shs = False |
| |
| |
| isotropic_gaussians = False |
| |
| |
| conf_threshold = 50.0 |
| min_points = 1000 |
| max_points = 500000 |
| |
| |
| position_lr = 0.001 |
| shared_param_lr_multiplier = 1.0 |
| |
| |
| copy_positions_from_previous = True |
| |
| |
| background_color = [1.0, 1.0, 1.0] |
| |
| @classmethod |
| def get_config_dict(cls): |
| """Get full configuration as dictionary (includes both static and dynamic params).""" |
| return { |
| |
| 'num_iterations': cls.num_iterations, |
| 'num_points': cls.num_points, |
| 'densification_interval': cls.densification_interval, |
| 'pruning_interval': cls.pruning_interval, |
| 'scale_modifier': cls.scale_modifier, |
| 'sh_degree': cls.sh_degree, |
| 'background_color': cls.background_color, |
| 'save_interval': cls.save_interval, |
| 'adam_beta1': cls.adam_beta1, |
| 'adam_beta2': cls.adam_beta2, |
| 'adam_epsilon': cls.adam_epsilon, |
| 'initial_scale': cls.initial_scale, |
| 'scene_scale': cls.scene_scale, |
| 'near': cls.near, |
| 'far': cls.far, |
| 'lambda_dssim': cls.lambda_dssim, |
| 'depth_loss_weight': cls.depth_loss_weight, |
| 'densify_grad_threshold': cls.densify_grad_threshold, |
| 'cull_opacity_threshold': cls.cull_opacity_threshold, |
| 'start_prune_iter': cls.start_prune_iter, |
| 'densify_until_iter': cls.densify_until_iter, |
| |
| 'use_lr_scheduler': cls.use_lr_scheduler, |
| 'lr_scheduler_config': cls.lr_scheduler_config, |
| 'max_allowed_prune_ratio': cls.max_allowed_prune_ratio, |
| |
| 'initial_frame_iterations': cls.initial_frame_iterations, |
| 'subsequent_frame_iterations': cls.subsequent_frame_iterations, |
| 'dynamic_positions': cls.dynamic_positions, |
| 'dynamic_scales': cls.dynamic_scales, |
| 'dynamic_rotations': cls.dynamic_rotations, |
| 'dynamic_opacities': cls.dynamic_opacities, |
| 'dynamic_shs': cls.dynamic_shs, |
| 'isotropic_gaussians': cls.isotropic_gaussians, |
| 'conf_threshold': cls.conf_threshold, |
| 'min_points': cls.min_points, |
| 'max_points': cls.max_points, |
| 'position_lr': cls.position_lr, |
| 'shared_param_lr_multiplier': cls.shared_param_lr_multiplier, |
| 'copy_positions_from_previous': cls.copy_positions_from_previous, |
| } |
| |
| @classmethod |
| def update(cls, **kwargs): |
| """Update parameters with new values.""" |
| for key, value in kwargs.items(): |
| if hasattr(cls, key): |
| setattr(cls, key, value) |
| else: |
| raise ValueError(f"Unknown parameter: {key}") |