reduced-3dgs 1.10.0__cp311-cp311-win_amd64.whl → 1.10.2__cp311-cp311-win_amd64.whl

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.

Potentially problematic release.


This version of reduced-3dgs might be problematic. Click here for more details.

@@ -0,0 +1,105 @@
1
+ from gaussian_splatting import GaussianModel
2
+ from gaussian_splatting.dataset import CameraDataset
3
+ from gaussian_splatting.dataset.colmap import colmap_init
4
+ from gaussian_splatting.trainer import AbstractTrainer
5
+ from gaussian_splatting.trainer.extensions import ScaleRegularizeTrainerWrapper
6
+ from reduced_3dgs.quantization import VectorQuantizeTrainerWrapper
7
+ from reduced_3dgs.shculling import VariableSHGaussianModel, SHCullingTrainer
8
+ from reduced_3dgs.pruning import PruningTrainer
9
+ from reduced_3dgs.combinations import PrunerInDensifyTrainer, SHCullingDensificationTrainer, SHCullingPruningTrainer, SHCullingPrunerInDensifyTrainer
10
+ from reduced_3dgs.combinations import CameraTrainableVariableSHGaussianModel, CameraSHCullingTrainer, CameraPruningTrainer
11
+ from reduced_3dgs.combinations import CameraPrunerInDensifyTrainer, CameraSHCullingDensifyTrainer, CameraSHCullingPruningTrainer, CameraSHCullingPruningDensifyTrainer
12
+
13
+
14
+ def prepare_gaussians(sh_degree: int, source: str, device: str, trainable_camera: bool = False, load_ply: str = None) -> GaussianModel:
15
+ if trainable_camera:
16
+ gaussians = CameraTrainableVariableSHGaussianModel(sh_degree).to(device)
17
+ gaussians.load_ply(load_ply) if load_ply else colmap_init(gaussians, source)
18
+ else:
19
+ gaussians = VariableSHGaussianModel(sh_degree).to(device)
20
+ gaussians.load_ply(load_ply) if load_ply else colmap_init(gaussians, source)
21
+ return gaussians
22
+
23
+
24
+ modes = {
25
+ "shculling": SHCullingTrainer,
26
+ "pruning": PruningTrainer,
27
+ "densify-pruning": PrunerInDensifyTrainer,
28
+ "densify-shculling": SHCullingDensificationTrainer,
29
+ "prune-shculling": SHCullingPruningTrainer,
30
+ "densify-prune-shculling": SHCullingPrunerInDensifyTrainer,
31
+ "camera-shculling": CameraSHCullingTrainer,
32
+ "camera-pruning": CameraPruningTrainer,
33
+ "camera-densify-pruning": CameraPrunerInDensifyTrainer,
34
+ "camera-densify-shculling": CameraSHCullingDensifyTrainer,
35
+ "camera-prune-shculling": CameraSHCullingPruningTrainer,
36
+ "camera-densify-prune-shculling": CameraSHCullingPruningDensifyTrainer,
37
+ }
38
+
39
+
40
+ def prepare_quantizer(
41
+ gaussians: GaussianModel,
42
+ scene_extent: float,
43
+ dataset: CameraDataset,
44
+ base_constructor,
45
+ load_quantized: str = None,
46
+
47
+ num_clusters=256,
48
+ num_clusters_rotation_re=None,
49
+ num_clusters_rotation_im=None,
50
+ num_clusters_opacity=None,
51
+ num_clusters_scaling=None,
52
+ num_clusters_features_dc=None,
53
+ num_clusters_features_rest=[],
54
+
55
+ quantize_from_iter=5000,
56
+ quantize_until_iter=30000,
57
+ quantize_interval=1000,
58
+ **configs):
59
+ trainer = VectorQuantizeTrainerWrapper(
60
+ base_constructor(
61
+ gaussians,
62
+ scene_extent=scene_extent,
63
+ dataset=dataset,
64
+ **configs
65
+ ),
66
+
67
+ num_clusters=num_clusters,
68
+ num_clusters_rotation_re=num_clusters_rotation_re,
69
+ num_clusters_rotation_im=num_clusters_rotation_im,
70
+ num_clusters_opacity=num_clusters_opacity,
71
+ num_clusters_scaling=num_clusters_scaling,
72
+ num_clusters_features_dc=num_clusters_features_dc,
73
+ num_clusters_features_rest=num_clusters_features_rest,
74
+
75
+ quantize_from_iter=quantize_from_iter,
76
+ quantize_until_iter=quantize_until_iter,
77
+ quantize_interval=quantize_interval,
78
+ )
79
+ if load_quantized:
80
+ trainer.quantizer.load_quantized(load_quantized)
81
+ return trainer, trainer.quantizer
82
+
83
+
84
+ def prepare_trainer(gaussians: GaussianModel, dataset: CameraDataset, mode: str, with_scale_reg=False, quantize: bool = False, load_quantized: str = None, configs={}) -> AbstractTrainer:
85
+ constructor = modes[mode]
86
+ if with_scale_reg:
87
+ constructor = lambda *args, **kwargs: ScaleRegularizeTrainerWrapper(modes[mode], *args, **kwargs)
88
+ if quantize:
89
+ trainer, quantizer = prepare_quantizer(
90
+ gaussians,
91
+ scene_extent=dataset.scene_extent(),
92
+ dataset=dataset,
93
+ base_constructor=modes[mode],
94
+ load_quantized=load_quantized,
95
+ **configs
96
+ )
97
+ else:
98
+ trainer = constructor(
99
+ gaussians,
100
+ scene_extent=dataset.scene_extent(),
101
+ dataset=dataset,
102
+ **configs
103
+ )
104
+ quantizer = None
105
+ return trainer, quantizer
reduced_3dgs/train.py CHANGED
@@ -1,128 +1,26 @@
1
1
  import os
2
2
  import random
3
3
  import shutil
4
- from typing import List, Tuple
4
+ from typing import List
5
5
  import torch
6
6
  from tqdm import tqdm
7
- from argparse import Namespace
8
7
  from gaussian_splatting import GaussianModel
9
- from gaussian_splatting.dataset import CameraDataset, JSONCameraDataset, TrainableCameraDataset
8
+ from gaussian_splatting.dataset import CameraDataset
10
9
  from gaussian_splatting.utils import psnr
11
- from gaussian_splatting.dataset.colmap import ColmapCameraDataset, ColmapTrainableCameraDataset, colmap_init
12
10
  from gaussian_splatting.trainer import AbstractTrainer
13
- from gaussian_splatting.trainer.extensions import ScaleRegularizeTrainerWrapper
14
- from reduced_3dgs.quantization import AbstractQuantizer, VectorQuantizeTrainerWrapper
15
- from reduced_3dgs.shculling import VariableSHGaussianModel, SHCullingTrainer
16
- from reduced_3dgs.pruning import PruningTrainer
17
- from reduced_3dgs.combinations import PrunerInDensifyTrainer, SHCullingDensificationTrainer, SHCullingPruningTrainer, SHCullingPrunerInDensifyTrainer
18
- from reduced_3dgs.combinations import CameraTrainableVariableSHGaussianModel, CameraSHCullingTrainer, CameraPruningTrainer
19
- from reduced_3dgs.combinations import CameraPrunerInDensifyTrainer, CameraSHCullingDensifyTrainer, CameraSHCullingPruningTrainer, CameraSHCullingPruningDensifyTrainer
11
+ from gaussian_splatting.prepare import prepare_dataset
12
+ from gaussian_splatting.train import save_cfg_args
13
+ from reduced_3dgs.quantization import AbstractQuantizer
14
+ from reduced_3dgs.prepare import modes, prepare_gaussians, prepare_trainer
20
15
 
21
16
 
22
- basemodes = {
23
- "shculling": SHCullingTrainer,
24
- "pruning": PruningTrainer,
25
- "densify-pruning": PrunerInDensifyTrainer,
26
- "densify-shculling": SHCullingDensificationTrainer,
27
- "prune-shculling": SHCullingPruningTrainer,
28
- "densify-prune-shculling": SHCullingPrunerInDensifyTrainer,
29
- }
30
- cameramodes = {
31
- "camera-shculling": CameraSHCullingTrainer,
32
- "camera-pruning": CameraPruningTrainer,
33
- "camera-densify-pruning": CameraPrunerInDensifyTrainer,
34
- "camera-densify-shculling": CameraSHCullingDensifyTrainer,
35
- "camera-prune-shculling": CameraSHCullingPruningTrainer,
36
- "camera-densify-prune-shculling": CameraSHCullingPruningDensifyTrainer,
37
- }
38
-
39
-
40
- def prepare_quantizer(
41
- gaussians: GaussianModel,
42
- scene_extent: float,
43
- dataset: CameraDataset,
44
- base_constructor,
45
- load_quantized: str = None,
46
-
47
- num_clusters=256,
48
- num_clusters_rotation_re=None,
49
- num_clusters_rotation_im=None,
50
- num_clusters_opacity=None,
51
- num_clusters_scaling=None,
52
- num_clusters_features_dc=None,
53
- num_clusters_features_rest=[],
54
-
55
- quantize_from_iter=5000,
56
- quantize_until_iter=30000,
57
- quantize_interval=1000,
58
- **configs):
59
- trainer = VectorQuantizeTrainerWrapper(
60
- base_constructor(
61
- gaussians,
62
- scene_extent=scene_extent,
63
- dataset=dataset,
64
- **configs
65
- ),
66
-
67
- num_clusters=num_clusters,
68
- num_clusters_rotation_re=num_clusters_rotation_re,
69
- num_clusters_rotation_im=num_clusters_rotation_im,
70
- num_clusters_opacity=num_clusters_opacity,
71
- num_clusters_scaling=num_clusters_scaling,
72
- num_clusters_features_dc=num_clusters_features_dc,
73
- num_clusters_features_rest=num_clusters_features_rest,
74
-
75
- quantize_from_iter=quantize_from_iter,
76
- quantize_until_iter=quantize_until_iter,
77
- quantize_interval=quantize_interval,
78
- )
79
- if load_quantized:
80
- trainer.quantizer.load_quantized(load_quantized)
81
- return trainer, trainer.quantizer
82
-
83
-
84
- def prepare_training(sh_degree: int, source: str, device: str, mode: str, load_ply: str = None, load_camera: str = None, load_depth=False, with_scale_reg=False, quantize: bool = False, load_quantized: str = None, configs={}) -> Tuple[CameraDataset, GaussianModel, AbstractTrainer]:
85
- quantizer = None
86
- if mode in basemodes:
87
- gaussians = VariableSHGaussianModel(sh_degree).to(device)
88
- gaussians.load_ply(load_ply) if load_ply else colmap_init(gaussians, source)
89
- dataset = (JSONCameraDataset(load_camera, load_depth=load_depth) if load_camera else ColmapCameraDataset(source, load_depth=load_depth)).to(device)
90
- modes = basemodes
91
- elif mode in cameramodes:
92
- gaussians = CameraTrainableVariableSHGaussianModel(sh_degree).to(device)
93
- gaussians.load_ply(load_ply) if load_ply else colmap_init(gaussians, source)
94
- dataset = (TrainableCameraDataset.from_json(load_camera, load_depth=load_depth) if load_camera else ColmapTrainableCameraDataset(source, load_depth=load_depth)).to(device)
95
- modes = cameramodes
96
- else:
97
- raise ValueError(f"Unknown mode: {mode}")
98
- constructor = modes[mode]
99
- if with_scale_reg:
100
- constructor = lambda *args, **kwargs: ScaleRegularizeTrainerWrapper(modes[mode], *args, **kwargs)
101
- if quantize:
102
- trainer, quantizer = prepare_quantizer(
103
- gaussians,
104
- scene_extent=dataset.scene_extent(),
105
- dataset=dataset,
106
- base_constructor=modes[mode],
107
- load_quantized=load_quantized,
108
- **configs
109
- )
110
- else:
111
- trainer = constructor(
112
- gaussians,
113
- scene_extent=dataset.scene_extent(),
114
- dataset=dataset,
115
- **configs
116
- )
17
+ def prepare_training(sh_degree: int, source: str, device: str, mode: str, trainable_camera: bool = False, load_ply: str = None, load_camera: str = None, load_depth=False, with_scale_reg=False, quantize: bool = False, load_quantized: str = None, configs={}):
18
+ dataset = prepare_dataset(source=source, device=device, trainable_camera=trainable_camera, load_camera=load_camera, load_depth=load_depth)
19
+ gaussians = prepare_gaussians(sh_degree=sh_degree, source=source, device=device, trainable_camera=trainable_camera, load_ply=load_ply)
20
+ trainer, quantizer = prepare_trainer(gaussians=gaussians, dataset=dataset, mode=mode, with_scale_reg=with_scale_reg, quantize=quantize, load_quantized=load_quantized, configs=configs)
117
21
  return dataset, gaussians, trainer, quantizer
118
22
 
119
23
 
120
- def save_cfg_args(destination: str, sh_degree: int, source: str):
121
- os.makedirs(destination, exist_ok=True)
122
- with open(os.path.join(destination, "cfg_args"), 'w') as cfg_log_f:
123
- cfg_log_f.write(str(Namespace(sh_degree=sh_degree, source_path=source)))
124
-
125
-
126
24
  def training(dataset: CameraDataset, gaussians: GaussianModel, trainer: AbstractTrainer, quantizer: AbstractQuantizer, destination: str, iteration: int, save_iterations: List[int], device: str, empty_cache_every_step=False):
127
25
  shutil.rmtree(os.path.join(destination, "point_cloud"), ignore_errors=True) # remove the previous point cloud
128
26
  pbar = tqdm(range(1, iteration+1))
@@ -161,7 +59,7 @@ def training(dataset: CameraDataset, gaussians: GaussianModel, trainer: Abstract
161
59
 
162
60
 
163
61
  if __name__ == "__main__":
164
- from argparse import ArgumentParser, Namespace
62
+ from argparse import ArgumentParser
165
63
  parser = ArgumentParser()
166
64
  parser.add_argument("--sh_degree", default=3, type=int)
167
65
  parser.add_argument("-s", "--source", required=True, type=str)
@@ -173,7 +71,7 @@ if __name__ == "__main__":
173
71
  parser.add_argument("--no_depth_data", action='store_true')
174
72
  parser.add_argument("--with_scale_reg", action="store_true")
175
73
  parser.add_argument("--load_quantized", default=None, type=str)
176
- parser.add_argument("--mode", choices=list(basemodes.keys()) + list(cameramodes.keys()), default="densify-prune-shculling")
74
+ parser.add_argument("--mode", choices=list(modes), default="densify-prune-shculling")
177
75
  parser.add_argument("--save_iterations", nargs="+", type=int, default=[7000, 30000])
178
76
  parser.add_argument("--device", default="cuda", type=str)
179
77
  parser.add_argument("--empty_cache_every_step", action='store_true')
@@ -184,7 +82,7 @@ if __name__ == "__main__":
184
82
 
185
83
  configs = {o.split("=", 1)[0]: eval(o.split("=", 1)[1]) for o in args.option}
186
84
  dataset, gaussians, trainer, quantizer = prepare_training(
187
- sh_degree=args.sh_degree, source=args.source, device=args.device, mode=args.mode,
85
+ sh_degree=args.sh_degree, source=args.source, device=args.device, mode=args.mode, trainable_camera="camera" in args.mode,
188
86
  load_ply=args.load_ply, load_camera=args.load_camera, load_depth=not args.no_depth_data, with_scale_reg=args.with_scale_reg,
189
87
  quantize=args.quantize, load_quantized=args.load_quantized, configs=configs)
190
88
  dataset.save_cameras(os.path.join(args.destination, "cameras.json"))
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: reduced_3dgs
3
- Version: 1.10.0
3
+ Version: 1.10.2
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,14 @@
1
1
  reduced_3dgs/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
2
2
  reduced_3dgs/combinations.py,sha256=k4ErxpAscCqJMtVXZ29KGQjw2VoZMV0W3V4u3nj0e-Y,9401
3
+ reduced_3dgs/prepare.py,sha256=MFUUckRHKfgcva4ZOBxfPFyE95N-OlCQLplpmEPuzOk,4440
3
4
  reduced_3dgs/quantize.py,sha256=Y44qHyFdOIqke7NoeqXmyKloS43j-al74ZiNsuZZHbM,2527
4
- reduced_3dgs/train.py,sha256=jXHdXk05o_ebHjx_VBzcY6fRNn9EdKve6Tf5YC5an0o,9803
5
- reduced_3dgs/diff_gaussian_rasterization/_C.cp311-win_amd64.pyd,sha256=9l2WDioLfuzxUqkbUjsnTdTzLsCxKKibLVWWuQobjxg,1632256
5
+ reduced_3dgs/train.py,sha256=yRQPQv-hTOBQN-tqGHYs2aIZ0AbWq158CXpthYN2cfw,5666
6
+ reduced_3dgs/diff_gaussian_rasterization/_C.cp311-win_amd64.pyd,sha256=KOkmyzU2nmWLI0_ItQ8T2KWEHYTCReinaEObKKW_ZrI,1632256
6
7
  reduced_3dgs/diff_gaussian_rasterization/__init__.py,sha256=oV6JjTc-50MscX4XHeIWSgLr3l8Y25knBIs-0gRbJr4,7932
7
8
  reduced_3dgs/importance/__init__.py,sha256=neJsbY5cLikEGBQGdR4MjwCQ5VWVikT1357DwL0EtWU,289
8
9
  reduced_3dgs/importance/combinations.py,sha256=eAdykeTdvRGCHxskjILQnZVaqQVvwC-0wMxdgYMeeDs,2922
9
10
  reduced_3dgs/importance/trainer.py,sha256=Sj4ORvoYtFT7z3hifzFZDfhFyqumHraXyk3vMVtk0AU,12661
10
- reduced_3dgs/importance/diff_gaussian_rasterization/_C.cp311-win_amd64.pyd,sha256=nDpZYIxDTbPIzB3yHnldYxW6D4wHXm_RqIJQaqiOVMk,1315840
11
+ reduced_3dgs/importance/diff_gaussian_rasterization/_C.cp311-win_amd64.pyd,sha256=Q57dw0lD8Y7rQamkbnDWIxjGVmJ50X6i9l1kv6ow928,1315840
11
12
  reduced_3dgs/importance/diff_gaussian_rasterization/__init__.py,sha256=Tix8auyXBb_QFQtXrV3sLE9kdnl5zgHH0BbqcFzDp84,12850
12
13
  reduced_3dgs/pruning/__init__.py,sha256=E_YxJ9cDV_B6EJbYUBEcuRYMIht_C72rI1VJUXFCLpM,201
13
14
  reduced_3dgs/pruning/combinations.py,sha256=QhXt2C7pTXhwzp9hPL9dVdiQzz0cUQpm5qljqytPEsM,2345
@@ -20,9 +21,9 @@ reduced_3dgs/quantization/wrapper.py,sha256=cyXqfJgo9b3fS7DYXxOk5LmQudvrEhweOebF
20
21
  reduced_3dgs/shculling/__init__.py,sha256=nP2BejDCUdCmJNRbg0hfhHREO6jyZXwIcRiw6ttVgqo,149
21
22
  reduced_3dgs/shculling/gaussian_model.py,sha256=f8QWaL09vaV9Tcf6Dngjg_Fmk1wTQPAjWhuhI_N02Y8,2877
22
23
  reduced_3dgs/shculling/trainer.py,sha256=9hwR77djhZpyf-URhwKHjnLbe0ZAOS-DIw58RzkcHXQ,6369
23
- reduced_3dgs/simple_knn/_C.cp311-win_amd64.pyd,sha256=ws440gr-8_nmzlGJBpaNVyR8NSuuwWzZnx7zhCFO1p0,1263616
24
- reduced_3dgs-1.10.0.dist-info/licenses/LICENSE.md,sha256=LQ4_LAqlncGkg_mQy5ykMAFtQDSPB0eKmIEtBut0yjw,4916
25
- reduced_3dgs-1.10.0.dist-info/METADATA,sha256=5FMe1oopipogQu_qsW7-GnO6KVVXrRXdsCKcVtbqIF8,13015
26
- reduced_3dgs-1.10.0.dist-info/WHEEL,sha256=JLOMsP7F5qtkAkINx5UnzbFguf8CqZeraV8o04b0I8I,101
27
- reduced_3dgs-1.10.0.dist-info/top_level.txt,sha256=PpU5aT3-baSCdqCtTaZknoB32H93UeKCkYDkRCCZMEI,13
28
- reduced_3dgs-1.10.0.dist-info/RECORD,,
24
+ reduced_3dgs/simple_knn/_C.cp311-win_amd64.pyd,sha256=goRrAjghw7crBObLb6cuMONH3--q9uZjBoj3gRTQkeY,1263616
25
+ reduced_3dgs-1.10.2.dist-info/licenses/LICENSE.md,sha256=LQ4_LAqlncGkg_mQy5ykMAFtQDSPB0eKmIEtBut0yjw,4916
26
+ reduced_3dgs-1.10.2.dist-info/METADATA,sha256=5YuWENChjx4yhAaCJ5pokMNsyE0c_o2vIcgiE0SBXuY,13015
27
+ reduced_3dgs-1.10.2.dist-info/WHEEL,sha256=JLOMsP7F5qtkAkINx5UnzbFguf8CqZeraV8o04b0I8I,101
28
+ reduced_3dgs-1.10.2.dist-info/top_level.txt,sha256=PpU5aT3-baSCdqCtTaZknoB32H93UeKCkYDkRCCZMEI,13
29
+ reduced_3dgs-1.10.2.dist-info/RECORD,,