Reduced-3DGS: Memory Footprint Reduction for 3D Gaussian Splatting (Python Package Version)
This repository contains the refactored Python code for Reduced-3DGS. It is forked from commit 13e7393af8ecd83d69197dec7e4c891b333a7c1c. The original code has been refactored to follow the standard Python package structure, while maintaining the same algorithms as the original version.
Features
- Code organized as a standard Python package
- Pruning
- SH Culling
- Vector quantization by K-Means
Prerequisites
- Pytorch (v2.4 or higher recommended)
- CUDA Toolkit (12.4 recommended, should match with PyTorch version)
- (Optional) cuML for faster vector quantization
(Optional) If you have trouble with gaussian-splatting, try to install it from source:
pip install wheel setuptools
pip install --upgrade git+https://github.com/yindaheng98/gaussian-splatting.git@master --no-build-isolation
PyPI Install
pip install --upgrade reduced-3dgs
or build latest from source:
pip install wheel setuptools
pip install --upgrade git+https://github.com/yindaheng98/reduced-3dgs.git@main --no-build-isolation
Development Install
git clone --recursive https://github.com/yindaheng98/reduced-3dgs
cd reduced-3dgs
pip install scikit-learn
pip install --target . --upgrade --no-deps .
Quick Start
- Download the dataset (T&T+DB COLMAP dataset, size 650MB):
wget https://repo-sam.inria.fr/fungraph/3d-gaussian-splatting/datasets/input/tandt_db.zip -P ./data
unzip data/tandt_db.zip -d data/
- Train 3DGS with densification, pruning, and SH culling (same as original 3DGS)
python -m reduced_3dgs.train -s data/truck -d output/truck -i 30000 --mode densify-prune-shculling
- Render 3DGS
python -m gaussian_splatting.render -s data/truck -d output/truck -i 30000 --mode densify
💡 Note: This repository does not include code for creating datasets. If you wish to create your own dataset, please refer to InstantSplat or use convert.py.
💡 See .vscode/launch.json for more examples. Refer to reduced_3dgs.train and gaussian_splatting.render for full options.
API Usage
This project heavily depends on gaussian-splatting and only provides some enhanced Trainers and Gaussian models. Therefore, before starting, please refer to gaussian-splatting to understand the key concepts about Gaussian models, Dataset, Trainers, and how to use them.
Pruning
BasePruningTrainer prunes the trainer at specified training steps.
from reduced_3dgs.pruning import BasePruningTrainer
trainer = BasePruningTrainer(
gaussians,
scene_extent=dataset.scene_extent(),
dataset=dataset,
prune_from_iter=1000,
prune_until_iter=15000,
prune_interval=100,
... # see reduced_3dgs/pruning/trainer.py for full options
)
BasePrunerInDensifyTrainer integrates pruning with densification.
from reduced_3dgs.pruning import BasePrunerInDensifyTrainer
trainer = BasePrunerInDensifyTrainer(
gaussians,
scene_extent=dataset.scene_extent(),
dataset=dataset,
mercy_from_iter=3000,
mercy_until_iter=20000,
mercy_interval=100,
densify_from_iter=500,
densify_until_iter=15000,
densify_interval=100,
densify_grad_threshold=0.0002,
densify_opacity_threshold=0.005,
prune_from_iter=1000,
prune_until_iter=15000,
prune_interval=100,
prune_screensize_threshold=20,
... # see reduced_3dgs/pruning/trainer.py for full options
)
SH Culling
VariableSHGaussianModel is the 3DGS model that assigns each 3D Gaussian a different SH degree.
from reduced_3dgs.shculling import VariableSHGaussianModel
gaussians = VariableSHGaussianModel(sh_degree).to(device)
BaseSHCullingTrainer culls the SH degree of each 3D Gaussian at specified training steps.
from reduced_3dgs.shculling import BaseSHCullingTrainer
trainer = BaseSHCullingTrainer(
gaussians,
scene_extent=dataset.scene_extent(),
dataset=dataset,
cull_at_steps=[15000],
... # see reduced_3dgs/shculling/trainer.py for full options
)
Quantization
VectorQuantizer is the basic quantization operator:
gaussians.load_ply("output/truck")
from reduced_3dgs.quantization import VectorQuantizer
quantizer = VectorQuantizer(gaussians, num_clusters=256)
quantizer.save_quantized("output/truck-quantized")
quantizer.load_quantized("output/truck-quantized")
BaseVectorQuantizeTrainer quantizes the model at specified training steps.
from reduced_3dgs.shculling import BaseSHCullingTrainer
trainer = BaseVectorQuantizeTrainer(
gaussians,
spatial_lr_scale=dataset.scene_extent(),
dataset=dataset,
num_clusters=256,
quantizate_from_iter=5000,
quantizate_until_iter=30000,
quantizate_interval=1000,
... # see reduced_3dgs/shculling/trainer.py for full options
)
VectorQuantizeTrainerWrapper is a wrapper that integrates the quantization step into any Trainer:
trainer = VectorQuantizeTrainerWrapper(
trainer,
num_clusters=num_clusters,
num_clusters_rotation_re=num_clusters_rotation_re,
num_clusters_rotation_im=num_clusters_rotation_im,
num_clusters_opacity=num_clusters_opacity,
num_clusters_scaling=num_clusters_scaling,
num_clusters_features_dc=num_clusters_features_dc,
num_clusters_features_rest=num_clusters_features_rest,
quantizate_from_iter=quantizate_from_iter,
quantizate_until_iter=quantizate_until_iter,
quantizate_interval=quantizate_interval,
)
if load_quantized:
trainer.quantizer.load_quantized(load_quantized)
# see reduced_3dgs/train.py
Quantized PLY Format
💡 See reduced_3dgs/quantization/quantizer.py for the code to save and load quantized PLY files.
The save_quantized function will produce a point cloud stored in a .ply format.
Previously, the layout of this file was one row per primitive, containing a series of parameters in vertex elements, namely
- 3 floats for position (
x,y,z) - 3 floats for normal (
nx,ny,nz) - 1 uint for the real part of the rotation quaternion (
rot_re) - 1 uint for the imaginary part of the rotation quaternion (
rot_im) - 1 uint for opacity (
opacity) - 3 uint for scaling (
scale) - 1 uint for DC color (
f_dc) - 3 uint for SH coefficients (
f_rest_0,f_rest_1,f_rest_2)
The codebook quantization introduces some additional changes. For different parameters, you can set different lengths of the codebook. Each attribute's codebook will be stored in different elements. The codebooks are ordered as follows:
codebook_rot_reelement contains 1 float for the real part of the rotation quaternion (rot_re)codebook_rot_imelement contains 3 floats for the 3 imaginary parts of the rotation quaternion (rot_im_0,rot_im_1,rot_im_2)codebook_opacityelement contains 1 float for the opacity (opacity)codebook_scalingelement contains 3 floats for the 3 parameters of scale (scaling_0,scaling_1,scaling_2)codebook_f_dcelement contains 3 floats for the 3 DC color parameters (f_dc_0,f_dc_1,f_dc_2)- 3 elements
codebook_f_rest_<SH degree>contains floats for SH coefficients of 3 SH degrees (f_rest_<SH degree>_<SH coefficients at this degree>). SH degree 1 has 3 coefficientsf_rest_0_<0,1,2>incodebook_f_rest_0, SH degree 2 has 5 coefficientsf_rest_1_<0,1,2,3,4>incodebook_f_rest_1, SH degree 3 has 7 coefficientsf_rest_2_<0,1,2,3,4,5,6>incodebook_f_rest_2.
Reducing the Memory Footprint of 3D Gaussian Splatting
Panagiotis Papantonakis Georgios Kopanas, Bernhard Kerbl, Alexandre Lanvin, George Drettakis
| Webpage | Full Paper | Datasets (TODO) | Video | Other GRAPHDECO Publications | FUNGRAPH project page |
This repository contains the code of the paper "Reducing the Memory Footprint of 3D Gaussian Splatting", which can be found here. We also provide the configurations to train the models mentioned in the paper, as well as the evaluation script that produces the results.
Abstract: 3D Gaussian splatting provides excellent visual quality for novel view synthesis, with fast training and real-time rendering; unfortunately, the memory requirements of this method for storing and transmission are unreasonably high. We first analyze the reasons for this, identifying three main areas where storage can be reduced: the number of 3D Gaussian primitives used to represent a scene, the number of coefficients for the spherical harmonics used to represent directional radiance, and the precision required to store Gaussian primitive attributes. We present a solution to each of these issues. First, we propose an efficient, resolution-aware primitive pruning approach, reducing the primitive count by half. Second, we introduce an adaptive adjustment method to choose the number of coefficients used to represent directional radiance for each Gaussian primitive, and finally a codebook-based quantization method, together with a half-float representation for further memory reduction. Taken together, these three components result in a ×27 reduction in overall size on disk on the standard datasets we tested, along with a ×1.7 speedup in rendering speed. We demonstrate our method on standard datasets and show how our solution results in significantly reduced download times when using the method on a mobile device
BibTeX
@Article{papantonakisReduced3DGS,
author = {Papantonakis, Panagiotis and Kopanas, Georgios and Kerbl, Bernhard and Lanvin, Alexandre and Drettakis, George},
title = {Reducing the Memory Footprint of 3D Gaussian Splatting},
journal = {Proceedings of the ACM on Computer Graphics and Interactive Techniques},
number = {1},
volume = {7},
month = {May},
year = {2024},
url = {https://repo-sam.inria.fr/fungraph/reduced_3dgs/}
}
Metadata
Release files for reduced-3dgs 1.15.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | |
|---|---|---|---|---|
| reduced_3dgs-1.15.1.tar.gz | 71.5 kB | With provenance | Details |
Built distributions (wheels)
| File | Reset | |||
|---|---|---|---|---|
| reduced_3dgs-1.15.1-cp312-cp312-win_amd64.whl | CPython 3.12 | CPython 3.12 | Windows x86-64 | Details |
| reduced_3dgs-1.15.1-cp311-cp311-win_amd64.whl | CPython 3.11 | CPython 3.11 | Windows x86-64 | Details |
| reduced_3dgs-1.15.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl | CPython 3.11 | CPython 3.11 | Linux glibc 2.17+ x86-64 | Details |
| reduced_3dgs-1.15.1-cp310-cp310-win_amd64.whl | CPython 3.10 | CPython 3.10 | Windows x86-64 | Details |
| reduced_3dgs-1.15.1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl | CPython 3.10 | CPython 3.10 | Linux glibc 2.17+ x86-64 | Details |
Total release size: 27.1 MB
Release files / reduced_3dgs-1.15.1.tar.gz
| Download URL | reduced_3dgs-1.15.1.tar.gz |
|---|---|
| Size | 71.5 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
c02feb78a25c7a7ccb03bc6c7eaf8693798ef3c6574d785222deb3c19766dc1c
|
|
BLAKE2b-256 checksum How to use checksums |
8110cc907c69d7267ff6171af9c080135b6ec4e8eece97234f94d8844ee53a5e
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Aug 5, 2026.
Transparency logRelease files / reduced_3dgs-1.15.1-cp312-cp312-win_amd64.whl
| Download URL | reduced_3dgs-1.15.1-cp312-cp312-win_amd64.whl |
|---|---|
| Size | 1.6 MB |
| Tags | CPython 3.12 Windows x86-64 |
|
SHA-256 checksum How to use checksums |
0917efd9ae2ac8b8160a144ae2226301e49ecf3391af6d6cdca2337022e4a9a0
|
|
BLAKE2b-256 checksum How to use checksums |
ead6d47f81c364b637bcb08630a670c86e610c877e37ad7403ed7f9cb5346783
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Aug 5, 2026.
Transparency logRelease files / reduced_3dgs-1.15.1-cp311-cp311-win_amd64.whl
| Download URL | reduced_3dgs-1.15.1-cp311-cp311-win_amd64.whl |
|---|---|
| Size | 1.6 MB |
| Tags | CPython 3.11 Windows x86-64 |
|
SHA-256 checksum How to use checksums |
53b838c6e9db06ccac33a4d8ca896bd8d45b7d81127e0fafce09bde9775708f4
|
|
BLAKE2b-256 checksum How to use checksums |
dd496daf11c6950ec727f6ac48f1db09e925f015ee064513c1a3d74f93353369
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Aug 5, 2026.
Transparency logRelease files / reduced_3dgs-1.15.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl
| Download URL | reduced_3dgs-1.15.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl |
|---|---|
| Size | 11.2 MB |
| Tags | CPython 3.11 Linux glibc 2.17+ x86-64 |
|
SHA-256 checksum How to use checksums |
ceeb8cf16d728c057abe860e676e973cb9df7524bd9dea6ad1ed5f0d047a5a8d
|
|
BLAKE2b-256 checksum How to use checksums |
8062a69a11d9c254fe6523618c0e69e391063d7fb8177591ba2bb2ceae996e30
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Aug 5, 2026.
Transparency logRelease files / reduced_3dgs-1.15.1-cp310-cp310-win_amd64.whl
| Download URL | reduced_3dgs-1.15.1-cp310-cp310-win_amd64.whl |
|---|---|
| Size | 1.6 MB |
| Tags | CPython 3.10 Windows x86-64 |
|
SHA-256 checksum How to use checksums |
86b370da64f6df102deb98b3696faadb5ed6362ba4592f37f617f318995c236b
|
|
BLAKE2b-256 checksum How to use checksums |
892fe2ab49b0486831cce93502fa1a49bf3df80d4d8d43d7907ced6342b32022
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Aug 5, 2026.
Transparency logRelease files / reduced_3dgs-1.15.1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl
| Download URL | reduced_3dgs-1.15.1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl |
|---|---|
| Size | 11.2 MB |
| Tags | CPython 3.10 Linux glibc 2.17+ x86-64 |
|
SHA-256 checksum How to use checksums |
0261203abe72fd23ccd6e5248ba80eb0d7d21f5dafa267bc9ab25f613784b83e
|
|
BLAKE2b-256 checksum How to use checksums |
03209e6f5992c480159e974845f2da46aeac05e9e139323793acfec4d5729c84
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Aug 5, 2026.
Transparency logSecurity for reduced-3dgs 1.15.1
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
Full provenance
All 6 files in this release have been uploaded with provenance metadata.
Attestation for reduced_3dgs-1.15.1.tar.gz
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Aug 5, 2026.
Transparency logA note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.