Spaces:
Running on Zero
Running on Zero
| import sys | |
| # sys.path.append("gaussian-splatting") | |
| sys.path.append("pgsr") | |
| import argparse | |
| import math | |
| import cv2 | |
| import torchvision | |
| import torch | |
| import os | |
| import numpy as np | |
| import json | |
| import copy | |
| from tqdm import tqdm | |
| # Gaussian splatting dependencies | |
| from utils.sh_utils import eval_sh | |
| from scene.gaussian_model import GaussianModel | |
| # from diff_gaussian_rasterization import ( | |
| from diff_plane_rasterization import ( | |
| GaussianRasterizationSettings, | |
| GaussianRasterizer, | |
| ) | |
| from scene.cameras import Camera as GSCamera | |
| from gaussian_renderer import render, GaussianModel | |
| from utils.system_utils import searchForMaxIteration | |
| from utils.graphics_utils import focal2fov | |
| def initialize_resterize( | |
| viewpoint_camera, | |
| pc: GaussianModel, | |
| pipe, | |
| bg_color: torch.Tensor, | |
| scaling_modifier=1.0, | |
| ): | |
| # Set up rasterization configuration | |
| tanfovx = math.tan(viewpoint_camera.FoVx * 0.5) | |
| tanfovy = math.tan(viewpoint_camera.FoVy * 0.5) | |
| raster_settings = GaussianRasterizationSettings( | |
| image_height=int(viewpoint_camera.image_height), | |
| image_width=int(viewpoint_camera.image_width), | |
| tanfovx=tanfovx, | |
| tanfovy=tanfovy, | |
| bg=bg_color, | |
| scale_modifier=scaling_modifier, | |
| viewmatrix=viewpoint_camera.world_view_transform, | |
| projmatrix=viewpoint_camera.full_proj_transform, | |
| sh_degree=pc.active_sh_degree, | |
| campos=viewpoint_camera.camera_center, | |
| prefiltered=False, | |
| debug=pipe.debug, | |
| render_geo=False | |
| ) | |
| rasterize = GaussianRasterizer(raster_settings=raster_settings) | |
| return rasterize | |
| def load_params_from_gs( | |
| pc: GaussianModel, pipe, scaling_modifier=1.0, override_color=None | |
| ): | |
| # Create zero tensor. We will use it to make pytorch return gradients of the 2D (screen-space) means | |
| screenspace_points = ( | |
| torch.zeros_like( | |
| pc.get_xyz, dtype=pc.get_xyz.dtype, requires_grad=True, device="cuda" | |
| ) | |
| + 0 | |
| ) | |
| try: | |
| screenspace_points.retain_grad() | |
| except: | |
| pass | |
| means3D = pc.get_xyz | |
| means2D = screenspace_points | |
| opacity = pc.get_opacity | |
| # If precomputed 3d covariance is provided, use it. If not, then it will be computed from | |
| # scaling / rotation by the rasterizer. | |
| scales = None | |
| rotations = None | |
| cov3D_precomp = None | |
| if pipe.compute_cov3D_python: | |
| cov3D_precomp = pc.get_covariance(scaling_modifier) | |
| else: | |
| scales = pc.get_scaling | |
| rotations = pc.get_rotation | |
| # If precomputed colors are provided, use them. Otherwise, if it is desired to precompute colors | |
| # from SHs in Python, do it. If not, then SH -> RGB conversion will be done by rasterizer. | |
| shs = None | |
| colors_precomp = None | |
| if override_color is None: | |
| shs = pc.get_features | |
| else: | |
| colors_precomp = override_color | |
| # # Those Gaussians that were frustum culled or had a radius of 0 were not visible. | |
| # # They will be excluded from value updates used in the splitting criteria. | |
| return { | |
| "pos": means3D, | |
| "screen_points": means2D, | |
| "shs": shs, | |
| "colors_precomp": colors_precomp, | |
| "opacity": opacity, | |
| "scales": scales, | |
| "rotations": rotations, | |
| "cov3D_precomp": cov3D_precomp, | |
| } | |
| def convert_SH( | |
| shs_view, | |
| viewpoint_camera, | |
| pc: GaussianModel, | |
| position: torch.tensor, | |
| rotation: torch.tensor = None, | |
| ): | |
| shs_view = shs_view.transpose(1, 2).view(-1, 3, (pc.max_sh_degree + 1) ** 2) | |
| dir_pp = position - viewpoint_camera.camera_center.repeat(shs_view.shape[0], 1) | |
| if rotation is not None: | |
| n = rotation.shape[0] | |
| dir_pp[:n] = torch.matmul(rotation, dir_pp[:n].clone().unsqueeze(2)).squeeze(2) # replace the in-place operation | |
| dir_pp_normalized = dir_pp / dir_pp.norm(dim=1, keepdim=True) | |
| sh2rgb = eval_sh(pc.active_sh_degree, shs_view, dir_pp_normalized) | |
| colors_precomp = torch.clamp_min(sh2rgb + 0.5, 0.0) | |
| return colors_precomp | |