reduced-3dgs 1.8.18__tar.gz → 1.9.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (49) hide show
  1. {reduced_3dgs-1.8.18 → reduced_3dgs-1.9.0}/PKG-INFO +1 -1
  2. {reduced_3dgs-1.8.18 → reduced_3dgs-1.9.0}/reduced_3dgs/combinations.py +70 -12
  3. reduced_3dgs-1.9.0/reduced_3dgs/importance/__init__.py +3 -0
  4. {reduced_3dgs-1.8.18 → reduced_3dgs-1.9.0}/reduced_3dgs/importance/combinations.py +2 -1
  5. {reduced_3dgs-1.8.18 → reduced_3dgs-1.9.0}/reduced_3dgs/importance/trainer.py +57 -24
  6. reduced_3dgs-1.9.0/reduced_3dgs/pruning/__init__.py +2 -0
  7. {reduced_3dgs-1.8.18 → reduced_3dgs-1.9.0}/reduced_3dgs/pruning/combinations.py +20 -6
  8. {reduced_3dgs-1.8.18 → reduced_3dgs-1.9.0}/reduced_3dgs/pruning/trainer.py +18 -4
  9. {reduced_3dgs-1.8.18 → reduced_3dgs-1.9.0}/reduced_3dgs/train.py +8 -11
  10. {reduced_3dgs-1.8.18 → reduced_3dgs-1.9.0}/reduced_3dgs.egg-info/PKG-INFO +1 -1
  11. {reduced_3dgs-1.8.18 → reduced_3dgs-1.9.0}/setup.py +1 -1
  12. {reduced_3dgs-1.8.18 → reduced_3dgs-1.9.0}/submodules/gaussian-importance/cuda_rasterizer/forward.cu +3 -3
  13. reduced_3dgs-1.8.18/reduced_3dgs/importance/__init__.py +0 -2
  14. reduced_3dgs-1.8.18/reduced_3dgs/pruning/__init__.py +0 -2
  15. {reduced_3dgs-1.8.18 → reduced_3dgs-1.9.0}/LICENSE.md +0 -0
  16. {reduced_3dgs-1.8.18 → reduced_3dgs-1.9.0}/README.md +0 -0
  17. {reduced_3dgs-1.8.18 → reduced_3dgs-1.9.0}/reduced_3dgs/__init__.py +0 -0
  18. {reduced_3dgs-1.8.18 → reduced_3dgs-1.9.0}/reduced_3dgs/quantization/__init__.py +0 -0
  19. {reduced_3dgs-1.8.18 → reduced_3dgs-1.9.0}/reduced_3dgs/quantization/abc.py +0 -0
  20. {reduced_3dgs-1.8.18 → reduced_3dgs-1.9.0}/reduced_3dgs/quantization/exclude_zeros.py +0 -0
  21. {reduced_3dgs-1.8.18 → reduced_3dgs-1.9.0}/reduced_3dgs/quantization/quantizer.py +0 -0
  22. {reduced_3dgs-1.8.18 → reduced_3dgs-1.9.0}/reduced_3dgs/quantization/wrapper.py +0 -0
  23. {reduced_3dgs-1.8.18 → reduced_3dgs-1.9.0}/reduced_3dgs/quantize.py +0 -0
  24. {reduced_3dgs-1.8.18 → reduced_3dgs-1.9.0}/reduced_3dgs/shculling/__init__.py +0 -0
  25. {reduced_3dgs-1.8.18 → reduced_3dgs-1.9.0}/reduced_3dgs/shculling/gaussian_model.py +0 -0
  26. {reduced_3dgs-1.8.18 → reduced_3dgs-1.9.0}/reduced_3dgs/shculling/trainer.py +0 -0
  27. {reduced_3dgs-1.8.18 → reduced_3dgs-1.9.0}/reduced_3dgs.egg-info/SOURCES.txt +0 -0
  28. {reduced_3dgs-1.8.18 → reduced_3dgs-1.9.0}/reduced_3dgs.egg-info/dependency_links.txt +0 -0
  29. {reduced_3dgs-1.8.18 → reduced_3dgs-1.9.0}/reduced_3dgs.egg-info/requires.txt +0 -0
  30. {reduced_3dgs-1.8.18 → reduced_3dgs-1.9.0}/reduced_3dgs.egg-info/top_level.txt +0 -0
  31. {reduced_3dgs-1.8.18 → reduced_3dgs-1.9.0}/setup.cfg +0 -0
  32. {reduced_3dgs-1.8.18 → reduced_3dgs-1.9.0}/submodules/diff-gaussian-rasterization/cuda_rasterizer/backward.cu +0 -0
  33. {reduced_3dgs-1.8.18 → reduced_3dgs-1.9.0}/submodules/diff-gaussian-rasterization/cuda_rasterizer/forward.cu +0 -0
  34. {reduced_3dgs-1.8.18 → reduced_3dgs-1.9.0}/submodules/diff-gaussian-rasterization/cuda_rasterizer/rasterizer_impl.cu +0 -0
  35. {reduced_3dgs-1.8.18 → reduced_3dgs-1.9.0}/submodules/diff-gaussian-rasterization/diff_gaussian_rasterization/__init__.py +0 -0
  36. {reduced_3dgs-1.8.18 → reduced_3dgs-1.9.0}/submodules/diff-gaussian-rasterization/ext.cpp +0 -0
  37. {reduced_3dgs-1.8.18 → reduced_3dgs-1.9.0}/submodules/diff-gaussian-rasterization/rasterize_points.cu +0 -0
  38. {reduced_3dgs-1.8.18 → reduced_3dgs-1.9.0}/submodules/diff-gaussian-rasterization/reduced_3dgs/kmeans.cu +0 -0
  39. {reduced_3dgs-1.8.18 → reduced_3dgs-1.9.0}/submodules/diff-gaussian-rasterization/reduced_3dgs/redundancy_score.cu +0 -0
  40. {reduced_3dgs-1.8.18 → reduced_3dgs-1.9.0}/submodules/diff-gaussian-rasterization/reduced_3dgs/sh_culling.cu +0 -0
  41. {reduced_3dgs-1.8.18 → reduced_3dgs-1.9.0}/submodules/diff-gaussian-rasterization/reduced_3dgs.cu +0 -0
  42. {reduced_3dgs-1.8.18 → reduced_3dgs-1.9.0}/submodules/gaussian-importance/cuda_rasterizer/backward.cu +0 -0
  43. {reduced_3dgs-1.8.18 → reduced_3dgs-1.9.0}/submodules/gaussian-importance/cuda_rasterizer/rasterizer_impl.cu +0 -0
  44. {reduced_3dgs-1.8.18 → reduced_3dgs-1.9.0}/submodules/gaussian-importance/diff_gaussian_rasterization/__init__.py +0 -0
  45. {reduced_3dgs-1.8.18 → reduced_3dgs-1.9.0}/submodules/gaussian-importance/ext.cpp +0 -0
  46. {reduced_3dgs-1.8.18 → reduced_3dgs-1.9.0}/submodules/gaussian-importance/rasterize_points.cu +0 -0
  47. {reduced_3dgs-1.8.18 → reduced_3dgs-1.9.0}/submodules/simple-knn/ext.cpp +0 -0
  48. {reduced_3dgs-1.8.18 → reduced_3dgs-1.9.0}/submodules/simple-knn/simple_knn.cu +0 -0
  49. {reduced_3dgs-1.8.18 → reduced_3dgs-1.9.0}/submodules/simple-knn/spatial.cu +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: reduced_3dgs
3
- Version: 1.8.18
3
+ Version: 1.9.0
4
4
  Summary: Refactored code for the paper "Reducing the Memory Footprint of 3D Gaussian Splatting"
5
5
  Home-page: https://github.com/yindaheng98/reduced-3dgs
6
6
  Author: yindaheng98
@@ -1,13 +1,67 @@
1
+ from typing import List
1
2
  from gaussian_splatting import GaussianModel, CameraTrainableGaussianModel, Camera
2
3
  from gaussian_splatting.dataset import CameraDataset, TrainableCameraDataset
3
4
  from gaussian_splatting.trainer import OpacityResetDensificationTrainer
4
5
  # from gaussian_splatting.trainer import BaseOpacityResetDensificationTrainer as OpacityResetDensificationTrainer
5
- from gaussian_splatting.trainer import OpacityResetTrainerWrapper, CameraTrainerWrapper
6
+ from gaussian_splatting.trainer import OpacityResetTrainerWrapper, CameraTrainerWrapper, NoopDensifier, DepthTrainerWrapper
6
7
  from .shculling import VariableSHGaussianModel, SHCullingTrainerWrapper
7
8
  from .shculling import SHCullingTrainer
8
9
  # from .shculling import BaseSHCullingTrainer as SHCullingTrainer
9
- from .pruning import PruningTrainer, PrunerInDensifyTrainer
10
+ from .pruning import PruningTrainerWrapper, PrunerInDensifyTrainerWrapper
10
11
  # from .pruning import BasePruningTrainer as PruningTrainer, BasePrunerInDensifyTrainer as PrunerInDensifyTrainer
12
+ from .importance import ImportancePruner
13
+
14
+
15
+ def BaseFullPruningTrainer(
16
+ model: GaussianModel,
17
+ scene_extent: float,
18
+ dataset: List[Camera],
19
+ *args,
20
+ importance_prune_from_iter=1000,
21
+ importance_prune_until_iter=15000,
22
+ importance_prune_interval: int = 100,
23
+ **kwargs):
24
+ return PruningTrainerWrapper(
25
+ lambda model, scene_extent, dataset: ImportancePruner(
26
+ NoopDensifier(model),
27
+ dataset,
28
+ importance_prune_from_iter=importance_prune_from_iter,
29
+ importance_prune_until_iter=importance_prune_until_iter,
30
+ importance_prune_interval=importance_prune_interval,
31
+ ),
32
+ model, scene_extent, dataset,
33
+ *args, **kwargs
34
+ )
35
+
36
+
37
+ def BaseFullPrunerInDensifyTrainer(
38
+ model: GaussianModel,
39
+ scene_extent: float,
40
+ dataset: List[Camera],
41
+ *args,
42
+ importance_prune_from_iter=1000,
43
+ importance_prune_until_iter=15000,
44
+ importance_prune_interval: int = 100,
45
+ **kwargs):
46
+ return PrunerInDensifyTrainerWrapper(
47
+ lambda model, scene_extent, dataset: ImportancePruner(
48
+ NoopDensifier(model),
49
+ dataset,
50
+ importance_prune_from_iter=importance_prune_from_iter,
51
+ importance_prune_until_iter=importance_prune_until_iter,
52
+ importance_prune_interval=importance_prune_interval,
53
+ ),
54
+ model, scene_extent, dataset,
55
+ *args, **kwargs
56
+ )
57
+
58
+
59
+ def DepthFullPruningTrainer(model: GaussianModel, scene_extent: float, dataset: TrainableCameraDataset, *args, **kwargs):
60
+ return DepthTrainerWrapper(BaseFullPruningTrainer, model, scene_extent, *args, dataset=dataset, **kwargs)
61
+
62
+
63
+ def DepthFullPrunerInDensifyTrainer(model: GaussianModel, scene_extent: float, dataset: TrainableCameraDataset, *args, **kwargs):
64
+ return DepthTrainerWrapper(BaseFullPrunerInDensifyTrainer, model, scene_extent, *args, dataset=dataset, **kwargs)
11
65
 
12
66
 
13
67
  def OpacityResetPruningTrainer(
@@ -16,7 +70,7 @@ def OpacityResetPruningTrainer(
16
70
  dataset: CameraDataset,
17
71
  *args, **kwargs):
18
72
  return OpacityResetTrainerWrapper(
19
- lambda model, scene_extent, *args, **kwargs: PruningTrainer(model, scene_extent, dataset, *args, **kwargs),
73
+ lambda model, scene_extent, *args, **kwargs: DepthFullPruningTrainer(model, scene_extent, dataset, *args, **kwargs),
20
74
  model, scene_extent,
21
75
  *args, **kwargs
22
76
  )
@@ -28,13 +82,17 @@ def OpacityResetPrunerInDensifyTrainer(
28
82
  dataset: CameraDataset,
29
83
  *args, **kwargs):
30
84
  return OpacityResetTrainerWrapper(
31
- lambda model, scene_extent, *args, **kwargs: PrunerInDensifyTrainer(model, scene_extent, dataset, *args, **kwargs),
85
+ lambda model, scene_extent, *args, **kwargs: DepthFullPrunerInDensifyTrainer(model, scene_extent, dataset, *args, **kwargs),
32
86
  model, scene_extent,
33
87
  *args, **kwargs
34
88
  )
35
89
 
36
90
 
37
- def SHCullingDensifyTrainer(
91
+ PruningTrainer = OpacityResetPruningTrainer
92
+ PrunerInDensifyTrainer = OpacityResetPrunerInDensifyTrainer
93
+
94
+
95
+ def SHCullingDensificationTrainer(
38
96
  model: VariableSHGaussianModel,
39
97
  scene_extent: float,
40
98
  dataset: CameraDataset,
@@ -46,7 +104,7 @@ def SHCullingDensifyTrainer(
46
104
  )
47
105
 
48
106
 
49
- def SHCullingPruneTrainer(
107
+ def SHCullingPruningTrainer(
50
108
  model: VariableSHGaussianModel,
51
109
  scene_extent: float,
52
110
  dataset: CameraDataset,
@@ -58,7 +116,7 @@ def SHCullingPruneTrainer(
58
116
  )
59
117
 
60
118
 
61
- def SHCullingPruningDensifyTrainer(
119
+ def SHCullingPrunerInDensifyTrainer(
62
120
  model: VariableSHGaussianModel,
63
121
  scene_extent: float,
64
122
  dataset: CameraDataset,
@@ -99,7 +157,7 @@ def CameraPruningTrainer(
99
157
  )
100
158
 
101
159
 
102
- def CameraOpacityResetPrunerInDensifyTrainer(
160
+ def CameraPrunerInDensifyTrainer(
103
161
  model: CameraTrainableVariableSHGaussianModel,
104
162
  scene_extent: float,
105
163
  dataset: TrainableCameraDataset,
@@ -117,19 +175,19 @@ def CameraSHCullingDensifyTrainer(
117
175
  dataset: TrainableCameraDataset,
118
176
  *args, **kwargs):
119
177
  return CameraTrainerWrapper(
120
- SHCullingDensifyTrainer,
178
+ SHCullingDensificationTrainer,
121
179
  model, scene_extent, dataset,
122
180
  *args, **kwargs
123
181
  )
124
182
 
125
183
 
126
- def CameraSHCullingPruneTrainer(
184
+ def CameraSHCullingPruningTrainer(
127
185
  model: CameraTrainableVariableSHGaussianModel,
128
186
  scene_extent: float,
129
187
  dataset: TrainableCameraDataset,
130
188
  *args, **kwargs):
131
189
  return CameraTrainerWrapper(
132
- SHCullingPruneTrainer,
190
+ SHCullingPruningTrainer,
133
191
  model, scene_extent, dataset,
134
192
  *args, **kwargs
135
193
  )
@@ -141,7 +199,7 @@ def CameraSHCullingPruningDensifyTrainer(
141
199
  dataset: TrainableCameraDataset,
142
200
  *args, **kwargs):
143
201
  return CameraTrainerWrapper(
144
- SHCullingPruningDensifyTrainer,
202
+ SHCullingPrunerInDensifyTrainer,
145
203
  model, scene_extent, dataset,
146
204
  *args, **kwargs
147
205
  )
@@ -0,0 +1,3 @@
1
+ from .trainer import ImportancePruner, BaseImportancePruningTrainer
2
+ from .combinations import BaseImportancePrunerInDensifyTrainer, DepthImportancePruningTrainer, DepthImportancePrunerInDensifyTrainer
3
+ from .combinations import ImportancePruningTrainer, ImportancePrunerInDensifyTrainer
@@ -9,10 +9,11 @@ def BaseImportancePrunerInDensifyTrainer(
9
9
  model: GaussianModel,
10
10
  scene_extent: float,
11
11
  dataset: List[Camera],
12
+ *args,
12
13
  importance_prune_from_iter=1000,
13
14
  importance_prune_until_iter=15000,
14
15
  importance_prune_interval=100,
15
- *args, **kwargs):
16
+ **kwargs):
16
17
  return DensificationTrainerWrapper(
17
18
  lambda model, scene_extent: ImportancePruner(
18
19
  NoopDensifier(model),
@@ -75,7 +75,7 @@ def count_render(self: GaussianModel, viewpoint_camera: Camera):
75
75
  }
76
76
 
77
77
 
78
- def prune_gaussians(model: GaussianModel, dataset: CameraDataset):
78
+ def prune_list(model: GaussianModel, dataset: CameraDataset):
79
79
  gaussian_count = torch.zeros(model.get_xyz.shape[0], device=model.get_xyz.device, dtype=torch.int)
80
80
  opacity_important_score = torch.zeros(model.get_xyz.shape[0], device=model.get_xyz.device, dtype=torch.float)
81
81
  T_alpha_important_score = torch.zeros(model.get_xyz.shape[0], device=model.get_xyz.device, dtype=torch.float)
@@ -84,16 +84,66 @@ def prune_gaussians(model: GaussianModel, dataset: CameraDataset):
84
84
  gaussian_count += out["gaussians_count"]
85
85
  opacity_important_score += out["opacity_important_score"]
86
86
  T_alpha_important_score += out["T_alpha_important_score"]
87
- return None
87
+ return gaussian_count, opacity_important_score, T_alpha_important_score
88
+
89
+
90
+ # return importance score with adaptive volume measure described in paper
91
+ def calculate_v_imp_score(gaussians: GaussianModel, imp_list, v_pow):
92
+ """
93
+ :param gaussians: A data structure containing Gaussian components with a get_scaling method.
94
+ :param imp_list: The importance scores for each Gaussian component.
95
+ :param v_pow: The power to which the volume ratios are raised.
96
+ :return: A list of adjusted values (v_list) used for pruning.
97
+ """
98
+ # Calculate the volume of each Gaussian component
99
+ volume = torch.prod(gaussians.get_scaling, dim=1)
100
+ # Determine the kth_percent_largest value
101
+ index = int(len(volume) * 0.9)
102
+ sorted_volume, _ = torch.sort(volume, descending=True)
103
+ kth_percent_largest = sorted_volume[index]
104
+ # Calculate v_list
105
+ v_list = torch.pow(volume / kth_percent_largest, v_pow)
106
+ v_list = v_list * imp_list
107
+ return v_list
108
+
109
+
110
+ def score2mask(percent, import_score: list, threshold=None):
111
+ sorted_tensor, _ = torch.sort(import_score, dim=0)
112
+ index_nth_percentile = int(percent * (sorted_tensor.shape[0] - 1))
113
+ value_nth_percentile = sorted_tensor[index_nth_percentile]
114
+ thr = min(threshold, value_nth_percentile) if threshold is not None else value_nth_percentile
115
+ prune_mask = (import_score <= thr)
116
+ return prune_mask
117
+
118
+
119
+ def prune_gaussians(gaussians: GaussianModel, dataset: CameraDataset, prune_type="important_score", prune_percent=0.1, prune_thr=None, v_pow=0.1):
120
+ gaussian_list, opacity_imp_list, T_alpha_imp_list = prune_list(gaussians, dataset)
121
+ match prune_type:
122
+ case "important_score":
123
+ mask = score2mask(prune_percent, opacity_imp_list, prune_thr)
124
+ case "v_important_score":
125
+ v_list = calculate_v_imp_score(gaussians, opacity_imp_list, v_pow)
126
+ mask = score2mask(prune_percent, v_list, prune_thr)
127
+ case "max_v_important_score":
128
+ v_list = opacity_imp_list * torch.max(gaussians.get_scaling, dim=1)[0]
129
+ mask = score2mask(prune_percent, v_list, prune_thr)
130
+ case "count":
131
+ mask = score2mask(prune_percent, gaussian_list, prune_thr)
132
+ case "T_alpha":
133
+ # new importance score defined by doji
134
+ mask = score2mask(prune_percent, T_alpha_imp_list, prune_thr)
135
+ case _:
136
+ raise Exception("Unsupportive prunning method")
137
+ return mask
88
138
 
89
139
 
90
140
  class ImportancePruner(DensifierWrapper):
91
141
  def __init__(
92
142
  self, base_densifier: AbstractDensifier,
93
143
  dataset: CameraDataset,
94
- importance_prune_from_iter=1000,
95
- importance_prune_until_iter=15000,
96
- importance_prune_interval: int = 100,
144
+ importance_prune_from_iter=15000,
145
+ importance_prune_until_iter=20000,
146
+ importance_prune_interval: int = 1000,
97
147
  ):
98
148
  super().__init__(base_densifier)
99
149
  self.dataset = dataset
@@ -109,32 +159,15 @@ class ImportancePruner(DensifierWrapper):
109
159
  return ret
110
160
 
111
161
 
112
- def ImportancePrunerWrapper(
113
- base_densifier_constructor: Callable[..., AbstractDensifier],
114
- model: GaussianModel,
115
- scene_extent: float,
116
- dataset: List[Camera],
117
- importance_prune_from_iter=1000,
118
- importance_prune_until_iter=15000,
119
- importance_prune_interval: int = 100,
120
- *args, **kwargs):
121
- return ImportancePruner(
122
- base_densifier_constructor(model, scene_extent, *args, **kwargs),
123
- dataset,
124
- importance_prune_from_iter=importance_prune_from_iter,
125
- importance_prune_until_iter=importance_prune_until_iter,
126
- importance_prune_interval=importance_prune_interval,
127
- )
128
-
129
-
130
162
  def BaseImportancePruningTrainer(
131
163
  model: GaussianModel,
132
164
  scene_extent: float,
133
165
  dataset: List[Camera],
166
+ *args,
134
167
  importance_prune_from_iter=1000,
135
168
  importance_prune_until_iter=15000,
136
169
  importance_prune_interval: int = 100,
137
- *args, **kwargs):
170
+ **kwargs):
138
171
  return DensificationTrainer(
139
172
  model, scene_extent,
140
173
  ImportancePruner(
@@ -0,0 +1,2 @@
1
+ from .trainer import BasePruner, BasePruningTrainer, PruningTrainerWrapper
2
+ from .combinations import BasePrunerInDensifyTrainer, PruningTrainer, PrunerInDensifyTrainer, PrunerInDensifyTrainerWrapper
@@ -1,15 +1,17 @@
1
1
 
2
- from typing import List
2
+ from typing import Callable, List
3
3
  from gaussian_splatting import Camera, GaussianModel
4
4
  from gaussian_splatting.dataset import TrainableCameraDataset
5
- from gaussian_splatting.trainer import DepthTrainerWrapper, NoopDensifier, DensificationTrainerWrapper
5
+ from gaussian_splatting.trainer import AbstractDensifier, DepthTrainerWrapper, NoopDensifier, SplitCloneDensifierTrainerWrapper
6
6
  from .trainer import BasePruner, BasePruningTrainer
7
7
 
8
8
 
9
- def BasePrunerInDensifyTrainer(
9
+ def PrunerInDensifyTrainerWrapper(
10
+ noargs_base_densifier_constructor: Callable[[GaussianModel, float, List[Camera]], AbstractDensifier],
10
11
  model: GaussianModel,
11
12
  scene_extent: float,
12
13
  dataset: List[Camera],
14
+ *args,
13
15
  prune_from_iter=1000,
14
16
  prune_until_iter=15000,
15
17
  prune_interval: int = 100,
@@ -17,10 +19,10 @@ def BasePrunerInDensifyTrainer(
17
19
  lambda_mercy=1.,
18
20
  mercy_minimum=3,
19
21
  mercy_type='redundancy_opacity',
20
- *args, **kwargs):
21
- return DensificationTrainerWrapper(
22
+ **kwargs):
23
+ return SplitCloneDensifierTrainerWrapper(
22
24
  lambda model, scene_extent: BasePruner(
23
- NoopDensifier(model),
25
+ noargs_base_densifier_constructor(model, scene_extent, dataset),
24
26
  dataset,
25
27
  prune_from_iter=prune_from_iter,
26
28
  prune_until_iter=prune_until_iter,
@@ -36,6 +38,18 @@ def BasePrunerInDensifyTrainer(
36
38
  )
37
39
 
38
40
 
41
+ def BasePrunerInDensifyTrainer(
42
+ model: GaussianModel,
43
+ scene_extent: float,
44
+ dataset: List[Camera],
45
+ *args, **kwargs):
46
+ return PrunerInDensifyTrainerWrapper(
47
+ lambda model, scene_extent, dataset: NoopDensifier(model),
48
+ model, scene_extent, dataset,
49
+ *args, **kwargs
50
+ )
51
+
52
+
39
53
  # Depth trainer
40
54
 
41
55
 
@@ -1,4 +1,4 @@
1
- from typing import List
1
+ from typing import Callable, List
2
2
  import torch
3
3
  from gaussian_splatting import GaussianModel, Camera
4
4
  from gaussian_splatting.trainer import AbstractDensifier, DensifierWrapper, DensificationTrainer, NoopDensifier
@@ -108,10 +108,12 @@ class BasePruner(DensifierWrapper):
108
108
  return ret
109
109
 
110
110
 
111
- def BasePruningTrainer(
111
+ def PruningTrainerWrapper(
112
+ noargs_base_densifier_constructor: Callable[[GaussianModel, float, List[Camera]], AbstractDensifier],
112
113
  model: GaussianModel,
113
114
  scene_extent: float,
114
115
  dataset: List[Camera],
116
+ *args,
115
117
  prune_from_iter=1000,
116
118
  prune_until_iter=15000,
117
119
  prune_interval: int = 100,
@@ -119,11 +121,11 @@ def BasePruningTrainer(
119
121
  lambda_mercy=1.,
120
122
  mercy_minimum=3,
121
123
  mercy_type='redundancy_opacity',
122
- *args, **kwargs):
124
+ **kwargs):
123
125
  return DensificationTrainer(
124
126
  model, scene_extent,
125
127
  BasePruner(
126
- NoopDensifier(model),
128
+ noargs_base_densifier_constructor(model, scene_extent, dataset),
127
129
  dataset,
128
130
  prune_from_iter=prune_from_iter,
129
131
  prune_until_iter=prune_until_iter,
@@ -134,3 +136,15 @@ def BasePruningTrainer(
134
136
  mercy_type=mercy_type,
135
137
  ), *args, **kwargs
136
138
  )
139
+
140
+
141
+ def BasePruningTrainer(
142
+ model: GaussianModel,
143
+ scene_extent: float,
144
+ dataset: List[Camera],
145
+ *args, **kwargs):
146
+ return DensificationTrainer(
147
+ lambda model, scene_extent, dataset: NoopDensifier(model),
148
+ model, scene_extent, dataset,
149
+ *args, **kwargs
150
+ )
@@ -14,30 +14,27 @@ from gaussian_splatting.trainer.extensions import ScaleRegularizeTrainerWrapper
14
14
  from reduced_3dgs.quantization import AbstractQuantizer, VectorQuantizeTrainerWrapper
15
15
  from reduced_3dgs.shculling import VariableSHGaussianModel, SHCullingTrainer
16
16
  from reduced_3dgs.pruning import PruningTrainer
17
- from reduced_3dgs.pruning.importance import ImportancePruningTrainerWrapper
18
- from reduced_3dgs.combinations import OpacityResetPrunerInDensifyTrainer, SHCullingDensifyTrainer, SHCullingPruneTrainer, SHCullingPruningDensifyTrainer
17
+ from reduced_3dgs.combinations import PrunerInDensifyTrainer, SHCullingDensificationTrainer, SHCullingPruningTrainer, SHCullingPrunerInDensifyTrainer
19
18
  from reduced_3dgs.combinations import CameraTrainableVariableSHGaussianModel, CameraSHCullingTrainer, CameraPruningTrainer
20
- from reduced_3dgs.combinations import CameraOpacityResetPrunerInDensifyTrainer, CameraSHCullingDensifyTrainer, CameraSHCullingPruneTrainer, CameraSHCullingPruningDensifyTrainer
19
+ from reduced_3dgs.combinations import CameraPrunerInDensifyTrainer, CameraSHCullingDensifyTrainer, CameraSHCullingPruningTrainer, CameraSHCullingPruningDensifyTrainer
21
20
 
22
21
 
23
22
  basemodes = {
24
23
  "shculling": SHCullingTrainer,
25
24
  "pruning": PruningTrainer,
26
- "densify-pruning": OpacityResetPrunerInDensifyTrainer,
27
- "densify-shculling": SHCullingDensifyTrainer,
28
- "prune-shculling": SHCullingPruneTrainer,
29
- "densify-prune-shculling": SHCullingPruningDensifyTrainer,
25
+ "densify-pruning": PrunerInDensifyTrainer,
26
+ "densify-shculling": SHCullingDensificationTrainer,
27
+ "prune-shculling": SHCullingPruningTrainer,
28
+ "densify-prune-shculling": SHCullingPrunerInDensifyTrainer,
30
29
  }
31
- basemodes = {k: lambda *args, **kwargs: ImportancePruningTrainerWrapper(v, *args, **kwargs) for k, v in basemodes.items()}
32
30
  cameramodes = {
33
31
  "camera-shculling": CameraSHCullingTrainer,
34
32
  "camera-pruning": CameraPruningTrainer,
35
- "camera-densify-pruning": CameraOpacityResetPrunerInDensifyTrainer,
33
+ "camera-densify-pruning": CameraPrunerInDensifyTrainer,
36
34
  "camera-densify-shculling": CameraSHCullingDensifyTrainer,
37
- "camera-prune-shculling": CameraSHCullingPruneTrainer,
35
+ "camera-prune-shculling": CameraSHCullingPruningTrainer,
38
36
  "camera-densify-prune-shculling": CameraSHCullingPruningDensifyTrainer,
39
37
  }
40
- cameramodes = {k: lambda *args, **kwargs: ImportancePruningTrainerWrapper(v, *args, **kwargs) for k, v in cameramodes.items()}
41
38
 
42
39
 
43
40
  def prepare_quantizer(
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: reduced_3dgs
3
- Version: 1.8.18
3
+ Version: 1.9.0
4
4
  Summary: Refactored code for the paper "Reducing the Memory Footprint of 3D Gaussian Splatting"
5
5
  Home-page: https://github.com/yindaheng98/reduced-3dgs
6
6
  Author: yindaheng98
@@ -60,7 +60,7 @@ if os.name == 'nt':
60
60
 
61
61
  setup(
62
62
  name="reduced_3dgs",
63
- version='1.8.18',
63
+ version='1.9.0',
64
64
  author='yindaheng98',
65
65
  author_email='yindaheng98@gmail.com',
66
66
  url='https://github.com/yindaheng98/reduced-3dgs',
@@ -471,9 +471,9 @@ renderCUDA_count(
471
471
  }
472
472
 
473
473
  //add count
474
- gaussian_count[collected_id[j]]++;
475
- opacity_important_score[collected_id[j]] += con_o.w; //opacity
476
- T_alpha_important_score[collected_id[j]] += alpha * T;
474
+ atomicAdd(&gaussian_count[collected_id[j]], 1);
475
+ atomicAdd(&opacity_important_score[collected_id[j]], con_o.w); //opacity
476
+ atomicAdd(&T_alpha_important_score[collected_id[j]], alpha * T);
477
477
 
478
478
  // Eq. (3) from 3D Gaussian splatting paper.
479
479
  for (int ch = 0; ch < CHANNELS; ch++)
@@ -1,2 +0,0 @@
1
- from .trainer import ImportancePruner, BaseImportancePruningTrainer, ImportancePrunerWrapper
2
- from .combinations import BaseImportancePrunerInDensifyTrainer, ImportancePruningTrainer, ImportancePrunerInDensifyTrainer
@@ -1,2 +0,0 @@
1
- from .trainer import BasePruner, BasePruningTrainer
2
- from .combinations import BasePrunerInDensifyTrainer, PruningTrainer, PrunerInDensifyTrainer
File without changes
File without changes
File without changes