This repository keeps three feed-forward Gaussian reconstruction variants under one training pipeline so they can be trained and compared directly.
| Variant | Student | Teacher / pseudo-supervision | Config name |
|---|---|---|---|
| AnySplat | VGGT | VGGT | anysplat |
| GenSplat | VGGT | Pi3 | gensplat |
| GenSplatPi3 | Pi3 | Pi3 | gensplatpi3 |
Source layout:
src/model/encoder/anysplat.py: preserved VGGT student + VGGT teachersrc/model/encoder/gensplat.py: main VGGT student + Pi3 teachersrc/model/encoder/gensplatpi3.py: comparison Pi3 student + Pi3 teacherThis repository follows the same environment style as AnySplat, with one extra dependency required by the Pi3-based paths: utils3d.
The commands below are a practical Linux baseline for Python 3.10, PyTorch 2.2, and CUDA 12.1.
conda create -y -n gensplat python=3.10
conda activate gensplat
pip install torch==2.2.0 torchvision==0.17.0 torchaudio==2.2.0 --index-url https://download.pytorch.org/whl/cu121
pip install \
numpy==1.25.0 wheel tqdm lightning black ruff hydra-core jaxtyping beartype \
einops colorama scikit-image colorspacious matplotlib moviepy imageio timm \
dacite lpips e3nn plyfile tabulate svg.py scikit-video swanlab tyro viser \
pycolmap opencv-python Pillow huggingface_hub gradio xformers==0.0.24 \
torch_scatter==2.1.2 pydantic open3d safetensors utils3d
pip install git+https://github.com/facebookresearch/pytorch3d.git
pip install https://github.com/nerfstudio-project/gsplat/releases/download/v1.4.0/gsplat-1.4.0%2Bpt22cu121-cp310-cp310-linux_x86_64.whl
Notes:
torch, xformers, torch_scatter, and gsplat wheels accordingly.src/main.py.+experiment=droid.Before launching training:
config/dataset/droid.yaml, or override it from the command line.checkpointing.load, because config/experiment/droid.yaml contains a sample checkpoint path.Useful checkpoint arguments:
model.encoder.pretrained_weights: initialize the student or the full model from a local checkpointmodel.encoder.distiller_pretrained_weights: initialize the Pi3 teacher in the gensplat variantcheckpointing.load: resume or override from an existing full checkpointIf you do not want to resume from an existing run, set:
checkpointing.load=null
This is the preserved original baseline.
CUDA_VISIBLE_DEVICES=0,1,2,3 python src/main.py \
+experiment=droid \
model/encoder=anysplat \
checkpointing.load=null \
model.encoder.pretrained_weights=/path/to/anysplat_model.safetensors \
swanlab.mode=offline
If you want to start from the default VGGT Hugging Face weights only, omit model.encoder.pretrained_weights.
This is the main variant in this repository.
Recommended initialization:
CUDA_VISIBLE_DEVICES=0,1,2,3 python src/main.py \
+experiment=droid \
model/encoder=gensplat \
checkpointing.load=null \
model.encoder.pretrained_weights=/path/to/anysplat_model.safetensors \
model.encoder.distiller_pretrained_weights=/path/to/pi3_checkpoint.pt \
swanlab.mode=offline
If model.encoder.distiller_pretrained_weights is omitted, the teacher falls back to yyfz233/Pi3 through Pi3.from_pretrained(...).
This variant is kept as a comparison model.
CUDA_VISIBLE_DEVICES=0,1,2,3 python src/main.py \
+experiment=droid \
model/encoder=gensplatpi3 \
checkpointing.load=null \
swanlab.mode=offline
You can still provide model.encoder.pretrained_weights or checkpointing.load if you have a compatible full checkpoint.
With +experiment=droid, training outputs are written under:
output/exp_<swanlab.name>/<timestamp>/
The default checkpoint directory is:
output/exp_<swanlab.name>/<timestamp>/checkpoints/
augment_parquet.pyThe repository includes augment_parquet.py for parquet-based data augmentation with single-view GenSplat novel-view synthesis.
The script:
.parquet files from --input_dirobservation.image1 and observation.image2 independently--trans_noiseobservation.image3 unchangedpython augment_parquet.py \
--input_dir /data/chunk-000 \
--output_dir /data/chunk-000-new \
--ckpt /path/to/gensplat_hf_export \
--trans_noise 0.02
Arguments:
--input_dir: directory containing input parquet files--output_dir: directory for augmented parquet files; defaults to <input_dir>-new--ckpt: model path or Hugging Face identifier accepted by GenSplat.from_pretrained(...)--trans_noise: translation noise magnitude applied to the predicted pose before renderingThe script currently assumes each parquet row contains these columns:
observation.image1observation.image2observation.image3It also assumes each of these columns is dict-like and contains at least:
["bytes"]: encoded image bytesThe script center-crops each processed image so that height and width are multiples of 14, which matches the model patch size.
augment_parquet.py Output StructureThe output directory mirrors the input directory at the file level:
input_dir/
part-000.parquet
part-001.parquet
output_dir/
part-000.parquet
part-001.parquet
For every output parquet file:
observation.image3 is preservedobservation.image1["bytes"] is replaced by rendered PNG bytesobservation.image2["bytes"] is replaced by rendered PNG bytesThe schema is preserved; only the payload inside the selected image columns is updated.
Each row keeps the same top-level layout:
row
|- observation.image1
| \- bytes <- replaced
|- observation.image2
| \- bytes <- replaced
\- observation.image3
\- bytes <- unchanged
If observation.image1 or observation.image2 contains additional metadata keys, the script keeps that dictionary and only overwrites the bytes field.
For a clean comparison:
anysplat as the preserved baseline.gensplat with the AnySplat student checkpoint and the Pi3 teacher checkpoint.gensplatpi3 as the Pi3-only comparison model.augment_parquet.py only after you have a trained gensplat checkpoint exported in a format compatible with GenSplat.from_pretrained(...).src/main.py: training entry pointconfig/experiment/droid.yaml: main training presetconfig/model/encoder/anysplat.yaml: AnySplat encoder configconfig/model/encoder/gensplat.yaml: GenSplat encoder configconfig/model/encoder/gensplatpi3.yaml: GenSplatPi3 encoder configaugment_parquet.py: parquet augmentation utility8 commits
Python
78.1%
Cuda
15.4%
C++
5.7%
This repository keeps three feed-forward Gaussian reconstruction variants under one training pipeline so they can be trained and compared directly.
| Variant | Student | Teacher / pseudo-supervision | Config name |
|---|---|---|---|
| AnySplat | VGGT | VGGT | anysplat |
| GenSplat | VGGT | Pi3 | gensplat |
| GenSplatPi3 | Pi3 | Pi3 | gensplatpi3 |
Source layout:
src/model/encoder/anysplat.py: preserved VGGT student + VGGT teachersrc/model/encoder/gensplat.py: main VGGT student + Pi3 teachersrc/model/encoder/gensplatpi3.py: comparison Pi3 student + Pi3 teacherThis repository follows the same environment style as AnySplat, with one extra dependency required by the Pi3-based paths: utils3d.
The commands below are a practical Linux baseline for Python 3.10, PyTorch 2.2, and CUDA 12.1.
conda create -y -n gensplat python=3.10
conda activate gensplat
pip install torch==2.2.0 torchvision==0.17.0 torchaudio==2.2.0 --index-url https://download.pytorch.org/whl/cu121
pip install \
numpy==1.25.0 wheel tqdm lightning black ruff hydra-core jaxtyping beartype \
einops colorama scikit-image colorspacious matplotlib moviepy imageio timm \
dacite lpips e3nn plyfile tabulate svg.py scikit-video swanlab tyro viser \
pycolmap opencv-python Pillow huggingface_hub gradio xformers==0.0.24 \
torch_scatter==2.1.2 pydantic open3d safetensors utils3d
pip install git+https://github.com/facebookresearch/pytorch3d.git
pip install https://github.com/nerfstudio-project/gsplat/releases/download/v1.4.0/gsplat-1.4.0%2Bpt22cu121-cp310-cp310-linux_x86_64.whl
Notes:
torch, xformers, torch_scatter, and gsplat wheels accordingly.src/main.py.+experiment=droid.Before launching training:
config/dataset/droid.yaml, or override it from the command line.checkpointing.load, because config/experiment/droid.yaml contains a sample checkpoint path.Useful checkpoint arguments:
model.encoder.pretrained_weights: initialize the student or the full model from a local checkpointmodel.encoder.distiller_pretrained_weights: initialize the Pi3 teacher in the gensplat variantcheckpointing.load: resume or override from an existing full checkpointIf you do not want to resume from an existing run, set:
checkpointing.load=null
This is the preserved original baseline.
CUDA_VISIBLE_DEVICES=0,1,2,3 python src/main.py \
+experiment=droid \
model/encoder=anysplat \
checkpointing.load=null \
model.encoder.pretrained_weights=/path/to/anysplat_model.safetensors \
swanlab.mode=offline
If you want to start from the default VGGT Hugging Face weights only, omit model.encoder.pretrained_weights.
This is the main variant in this repository.
Recommended initialization:
CUDA_VISIBLE_DEVICES=0,1,2,3 python src/main.py \
+experiment=droid \
model/encoder=gensplat \
checkpointing.load=null \
model.encoder.pretrained_weights=/path/to/anysplat_model.safetensors \
model.encoder.distiller_pretrained_weights=/path/to/pi3_checkpoint.pt \
swanlab.mode=offline
If model.encoder.distiller_pretrained_weights is omitted, the teacher falls back to yyfz233/Pi3 through Pi3.from_pretrained(...).
This variant is kept as a comparison model.
CUDA_VISIBLE_DEVICES=0,1,2,3 python src/main.py \
+experiment=droid \
model/encoder=gensplatpi3 \
checkpointing.load=null \
swanlab.mode=offline
You can still provide model.encoder.pretrained_weights or checkpointing.load if you have a compatible full checkpoint.
With +experiment=droid, training outputs are written under:
output/exp_<swanlab.name>/<timestamp>/
The default checkpoint directory is:
output/exp_<swanlab.name>/<timestamp>/checkpoints/
augment_parquet.pyThe repository includes augment_parquet.py for parquet-based data augmentation with single-view GenSplat novel-view synthesis.
The script:
.parquet files from --input_dirobservation.image1 and observation.image2 independently--trans_noiseobservation.image3 unchangedpython augment_parquet.py \
--input_dir /data/chunk-000 \
--output_dir /data/chunk-000-new \
--ckpt /path/to/gensplat_hf_export \
--trans_noise 0.02
Arguments:
--input_dir: directory containing input parquet files--output_dir: directory for augmented parquet files; defaults to <input_dir>-new--ckpt: model path or Hugging Face identifier accepted by GenSplat.from_pretrained(...)--trans_noise: translation noise magnitude applied to the predicted pose before renderingThe script currently assumes each parquet row contains these columns:
observation.image1observation.image2observation.image3It also assumes each of these columns is dict-like and contains at least:
["bytes"]: encoded image bytesThe script center-crops each processed image so that height and width are multiples of 14, which matches the model patch size.
augment_parquet.py Output StructureThe output directory mirrors the input directory at the file level:
input_dir/
part-000.parquet
part-001.parquet
output_dir/
part-000.parquet
part-001.parquet
For every output parquet file:
observation.image3 is preservedobservation.image1["bytes"] is replaced by rendered PNG bytesobservation.image2["bytes"] is replaced by rendered PNG bytesThe schema is preserved; only the payload inside the selected image columns is updated.
Each row keeps the same top-level layout:
row
|- observation.image1
| \- bytes <- replaced
|- observation.image2
| \- bytes <- replaced
\- observation.image3
\- bytes <- unchanged
If observation.image1 or observation.image2 contains additional metadata keys, the script keeps that dictionary and only overwrites the bytes field.
For a clean comparison:
anysplat as the preserved baseline.gensplat with the AnySplat student checkpoint and the Pi3 teacher checkpoint.gensplatpi3 as the Pi3-only comparison model.augment_parquet.py only after you have a trained gensplat checkpoint exported in a format compatible with GenSplat.from_pretrained(...).src/main.py: training entry pointconfig/experiment/droid.yaml: main training presetconfig/model/encoder/anysplat.yaml: AnySplat encoder configconfig/model/encoder/gensplat.yaml: GenSplat encoder configconfig/model/encoder/gensplatpi3.yaml: GenSplatPi3 encoder configaugment_parquet.py: parquet augmentation utility8 commits
Python
78.1%
Cuda
15.4%
C++
5.7%