|
ReUseX
0.0.5
3D Point Cloud Processing for Building Reuse
|
3DGS-MCMC density control (Kheradmand et al. More...
#include <train.hpp>
Public Attributes | |
| bool | enabled = false |
| double | cap_factor = 2.0 |
| Hard ceiling on the Gaussian count, as a multiple of the seed count. | |
| std::int64_t | cap_absolute = 0 |
| double | growth = 1.05 |
| Multiplicative growth per refine pass, capped by the budget. | |
| int | refine_every = 100 |
| iterations between relocate+grow passes | |
| int | refine_start = 500 |
| first eligible iteration | |
| double | refine_stop_fraction = 0.85 |
| Last eligible iteration, as a fraction of the run. | |
| float | min_opacity = 0.005f |
| Opacity at or below which a Gaussian counts as dead and is relocated. | |
| float | noise_lr = 5e5f |
| scales the Langevin noise (paper's value) | |
| float | noise_opacity_t = 0.005f |
| noise gate transition point | |
| float | noise_opacity_k = 100.0f |
| noise gate sharpness | |
| float | opacity_reg = 0.0f |
| L1 regularizers in activated space. | |
| float | scale_reg = 0.0f |
3DGS-MCMC density control (Kheradmand et al.
2024).
The reference 3DGS densifier keys on the screen-space position gradient, which gsplat's world-space rasterizer does not produce — see the note on TrainOptions::prune_enabled. MCMC needs no screen-space quantity: it relocates collapsed Gaussians onto high-opacity ones, samples new ones from the same distribution up to a capped budget, and injects Langevin noise so the whole thing is a sampler rather than a greedy heuristic.
Defaults follow gsplat's MCMCStrategy except for cap, which is relative here (see below).
| double reusex::gsplat::MCMCOptions::cap_factor = 2.0 |
Hard ceiling on the Gaussian count, as a multiple of the seed count.
Relative rather than absolute because this trainer seeds from a LiDAR cloud whose size is a property of the scan, not of the algorithm: a building-scale capture and a 1 m corridor differ by an order of magnitude, and one absolute cap cannot serve both. cap_absolute overrides it when non-zero.
| double reusex::gsplat::MCMCOptions::growth = 1.05 |
| float reusex::gsplat::MCMCOptions::min_opacity = 0.005f |
| float reusex::gsplat::MCMCOptions::noise_lr = 5e5f |
| float reusex::gsplat::MCMCOptions::noise_opacity_k = 100.0f |
| float reusex::gsplat::MCMCOptions::noise_opacity_t = 0.005f |
| float reusex::gsplat::MCMCOptions::opacity_reg = 0.0f |
L1 regularizers in activated space.
In the paper these are what let Gaussians die, so relocation has dead samples to recycle.
Default 0, against the paper's 0.01, on measured evidence. They are unusable for a building-scale interior traverse, and the reason is scene topology rather than a tuning problem. 3DGS-MCMC was developed on object-centric captures where nearly every Gaussian projects into nearly every view, so the constant regularizer pull is balanced by a photometric gradient on almost every step. A corridor traverse is the opposite: each of our 344 views sees a small fraction of 1.2 M Gaussians, so most Gaussians receive only the regularizer gradient on most steps — and Adam, being scale-invariant, converts that into a step of the full learning rate. At lr_opacities = 5e-2 an off-screen Gaussian falls from the seed opacity to min_opacity in ~60 iterations.
Measured on NewOffice (394 views, 30 k iterations): with the paper's 0.01 the model collapses to 12.73 dB held-out and MCMC relocates 415 M Gaussians — ~68 % of the model on every refine pass. Lowering the weight does not help, exactly as Adam's scale invariance predicts: at 1e-4 it still collapses (15.20 dB, 22 M relocations). Only 0 is stable.
Re-enable them for object-centric capture, where the assumption holds.
| int reusex::gsplat::MCMCOptions::refine_every = 100 |
| int reusex::gsplat::MCMCOptions::refine_start = 500 |
| double reusex::gsplat::MCMCOptions::refine_stop_fraction = 0.85 |