Spaces:
Runtime error
Runtime error
Stanislaw Szymanowicz
commited on
Commit
·
ccc0216
1
Parent(s):
d4dacc1
Remove halo and add rotation
Browse files- utils/app_utils.py +38 -7
utils/app_utils.py
CHANGED
|
@@ -8,7 +8,8 @@ import os
|
|
| 8 |
import torch
|
| 9 |
from .camera_utils import get_loop_cameras
|
| 10 |
from .graphics_utils import getProjectionMatrix
|
| 11 |
-
from .general_utils import matrix_to_quaternion
|
|
|
|
| 12 |
|
| 13 |
def remove_background(image, rembg_session):
|
| 14 |
do_remove = True
|
|
@@ -158,14 +159,44 @@ def export_to_obj(reconstruction, ply_out_path):
|
|
| 158 |
assert v.shape[0] == 1, "Expected batch size to be 0"
|
| 159 |
reconstruction[k] = v[0]
|
| 160 |
|
| 161 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 162 |
normals = np.zeros_like(xyz)
|
| 163 |
-
|
| 164 |
-
|
| 165 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 166 |
# enlarge Gaussians - otherwise transforming them to .ply results in artefacts
|
| 167 |
-
scale = reconstruction["scaling"]
|
| 168 |
-
rotation =
|
| 169 |
|
| 170 |
dtype_full = [(attribute, 'f4') for attribute in construct_list_of_attributes()]
|
| 171 |
|
|
|
|
| 8 |
import torch
|
| 9 |
from .camera_utils import get_loop_cameras
|
| 10 |
from .graphics_utils import getProjectionMatrix
|
| 11 |
+
from .general_utils import matrix_to_quaternion, quaternion_raw_multiply
|
| 12 |
+
import math
|
| 13 |
|
| 14 |
def remove_background(image, rembg_session):
|
| 15 |
do_remove = True
|
|
|
|
| 159 |
assert v.shape[0] == 1, "Expected batch size to be 0"
|
| 160 |
reconstruction[k] = v[0]
|
| 161 |
|
| 162 |
+
|
| 163 |
+
valid_gaussians = torch.where(reconstruction["opacity"] > -2.5)[0]
|
| 164 |
+
|
| 165 |
+
# transforms for visualisation in Gradio
|
| 166 |
+
# ============= Transform locations =============
|
| 167 |
+
xyz = reconstruction["xyz"][valid_gaussians].detach().cpu().clone()
|
| 168 |
+
t1 = torch.tensor([[1, 0, 0],
|
| 169 |
+
[0, 0, 1],
|
| 170 |
+
[0, -1, 0]], dtype=torch.float32)
|
| 171 |
+
angle1 = 30 * math.pi * 2 / 360
|
| 172 |
+
t2 = torch.tensor([[math.cos(angle1), -math.sin(angle1), 0],
|
| 173 |
+
[math.sin(angle1), math.cos(angle1), 0],
|
| 174 |
+
[0, 0, 1]], dtype=torch.float32)
|
| 175 |
+
angle2 = -60 * math.pi * 2 / 360
|
| 176 |
+
t3 = torch.tensor([[math.cos(angle2), 0, math.sin(angle2)],
|
| 177 |
+
[0, 1, 0],
|
| 178 |
+
[-math.sin(angle2), 0, math.cos(angle2)]], dtype=torch.float32)
|
| 179 |
+
|
| 180 |
+
overall_transform_matrix = (t1 @ t2)@ t3
|
| 181 |
+
|
| 182 |
+
xyz = torch.matmul(xyz, overall_transform_matrix).numpy()
|
| 183 |
normals = np.zeros_like(xyz)
|
| 184 |
+
|
| 185 |
+
# ============= Transform rotations =============
|
| 186 |
+
camera_transformation_matrix = overall_transform_matrix.inverse()
|
| 187 |
+
camera_quaternions = matrix_to_quaternion(camera_transformation_matrix).to(reconstruction["rotation"].device)
|
| 188 |
+
rotation = reconstruction["rotation"].clone()
|
| 189 |
+
rotation = rotation.unsqueeze(0)
|
| 190 |
+
rotation = quaternion_raw_multiply(camera_quaternions.unsqueeze(0).unsqueeze(0).expand(*rotation.shape),
|
| 191 |
+
rotation).squeeze(0)
|
| 192 |
+
|
| 193 |
+
f_dc = reconstruction["features_dc"][valid_gaussians].detach().transpose(1, 2).flatten(start_dim=1).contiguous().cpu().numpy()
|
| 194 |
+
f_rest = reconstruction["features_rest"][valid_gaussians].detach().transpose(1, 2).flatten(start_dim=1).contiguous().cpu().numpy()
|
| 195 |
+
opacities = reconstruction["opacity"][valid_gaussians].detach().contiguous().cpu().numpy()
|
| 196 |
+
|
| 197 |
# enlarge Gaussians - otherwise transforming them to .ply results in artefacts
|
| 198 |
+
scale = (reconstruction["scaling"][valid_gaussians] + torch.abs(reconstruction["scaling"][valid_gaussians] * 0.1)).detach().contiguous().cpu().numpy()
|
| 199 |
+
rotation = rotation[valid_gaussians].detach().contiguous().cpu().numpy()
|
| 200 |
|
| 201 |
dtype_full = [(attribute, 'f4') for attribute in construct_list_of_attributes()]
|
| 202 |
|