Point Tracking for 4DGS
This repo is the point tracking Python extension for 4D Gaussian Splatting. It wraps sequence point trackers such as CoTracker3, VGGT, and MV-TAP behind one small registry, then applies them either to plain image sequences or to multi-timestep Gaussian Splatting camera datasets.
The package provides two common workflows:
- track sampled 2D points through one ordered image sequence
- project 3D Gaussians into a reference timestep, track those projected points across all timesteps, and attach the resulting tracks back to Gaussian Splatting camera datasets
Features
- Organised as a standard Python package with
pip installsupport - Shared point tracker registry with
cotracker3,vggt, andmvtapimplementations - Single-view image sequence tracking and rendering
- Multi-timestep Gaussian Splatting camera dataset tracking
- Camera dataset reordering against a selected reference timestep
- Port the motion estimation workflow from TrackerSplat for point-tracker-driven motion synthesis
- Regularize 3DGS training with point tracker trajectories
Install
Prerequisites
- PyTorch (CUDA build recommended)
- CUDA Toolkit matching your PyTorch installation
gaussian-splattingCoTrackerVGGTfor the optionalvggttracker
Install the core Gaussian Splatting dependency used by the 4DGS dataset utilities:
pip install wheel setuptools
pip install --upgrade gaussian-splatting
If you have trouble with gaussian-splatting, try installing it from source:
pip install wheel setuptools
pip install --upgrade git+https://github.com/yindaheng98/gaussian-splatting.git@master --no-build-isolation
Install tracker dependencies used by this package:
pip install --upgrade git+https://github.com/facebookresearch/co-tracker.git@main
pip install --upgrade Pillow hydra-core omegaconf
pip install --upgrade git+https://github.com/facebookresearch/vggt.git@main
pip install --upgrade git+https://github.com/jytime/LightGlue.git#egg=lightglue
PyPI Install
pip install --upgrade track-4dgs
or build latest from source:
pip install wheel setuptools
pip install --upgrade git+https://github.com/yindaheng98/track-4dgs.git@master --no-build-isolation
Development Install
git clone --recursive https://github.com/yindaheng98/track-4dgs.git
cd track-4dgs
pip install --target . --upgrade . --no-deps
Download Checkpoints
CoTracker3 offline checkpoint:
mkdir -p checkpoints
wget -P checkpoints https://huggingface.co/facebook/cotracker3/resolve/main/scaled_offline.pth
VGGT commercial checkpoint:
mkdir -p checkpoints
wget -P checkpoints https://huggingface.co/facebook/VGGT-1B-Commercial/resolve/main/vggt_1B_commercial.pt --header="Authorization: Bearer $HF_TOKEN"
If the VGGT checkpoint is not present, VGGTPointTracker falls back to VGGT.from_pretrained("facebook/VGGT-1B").
MV-TAP checkpoint (from the MV-TAP release):
mkdir -p checkpoints
# save the downloaded file as checkpoints/mvtap.ckpt
Command-Line Usage
List Registered Point Trackers
Verify that track_4dgs can import and register trackers:
python -c "import track_4dgs; print(track_4dgs.get_available_point_trackers())"
The built-in trackers are:
cotracker3: CoTracker3 offline point trackervggt: VGGT TrackHead point trackermvtap: MV-TAP multi-view point tracker
Track One Image Sequence
python -m track_4dgs.track1v \
-s data/frame_000.png data/frame_001.png data/frame_002.png \
-d output/track1v-cotracker3 \
--tracker cotracker3 \
--num-points 256
The command samples random query points on the first image, tracks them through all source images, and saves a rendered track overlay sequence under the destination directory.
Tracker-specific options can be passed with repeated -m/--option_tracker values:
python -m track_4dgs.track1v \
-s data/frame_000.png data/frame_001.png data/frame_002.png \
-d output/track1v-vggt \
--tracker vggt \
-m checkpoint="'checkpoints/vggt_1B_commercial.pt'" \
-m iters=4
Track 4DGS Camera Datasets
python -m track_4dgs.track2d \
-s data/sequence/frame_000 data/sequence/frame_001 data/sequence/frame_002 \
-d output/sequence \
-i 30000 \
--tracker cotracker3 \
--init-dataset-index 0 \
--num-points 256
track2d loads a trained Gaussian point cloud from:
<destination>/point_cloud/iteration_<iteration>/point_cloud.ply
It projects Gaussian centers into every camera of the reference timestep, tracks those projected points across the same camera views in all timesteps, and saves visualisations under:
<destination>/ours_<iteration>/track2d-<tracker>/
If cameras were saved outside the source scene folders, pass one camera path per source:
python -m track_4dgs.track2d \
-s data/sequence/frame_000 data/sequence/frame_001 \
-d output/sequence \
-i 30000 \
--load_cameras output/frame_000/cameras.json output/frame_001/cameras.json \
--mode camera
API Usage
Build a Tracker
from track_4dgs.registry import build_point_tracker, get_available_point_trackers
print(get_available_point_trackers())
tracker = build_point_tracker(
"cotracker3",
checkpoint="checkpoints/scaled_offline.pth",
).to("cuda")
Track Image Tensors
import torch
from track_4dgs.track1v import load_image, sample_query
frames = [
load_image("data/frame_000.png", "cuda"),
load_image("data/frame_001.png", "cuda"),
]
query = sample_query(frames[0], num_points=256)
with torch.no_grad():
track = tracker.track_view(query, frames, [None] * len(frames))
print(track.points.shape) # [num_frames, num_points, 2]
print(track.visibility.shape) # [num_frames, num_points]
Track Gaussian Splatting Camera Datasets
from gaussian_splatting.prepare import prepare_gaussians
from track_4dgs.prepare import prepare_datasets, prepare_tracker
from track_4dgs.track2d import query_views_from_gaussians
sources = [
"data/sequence/frame_000",
"data/sequence/frame_001",
]
datasets = prepare_datasets(
sources=sources,
device="cuda",
reorder_reference_idx=0,
)
gaussians = prepare_gaussians(
sh_degree=3,
source=sources[0],
device="cuda",
load_ply="output/sequence/point_cloud/iteration_30000/point_cloud.ply",
)
dataset_tracker = prepare_tracker(
tracker_name="cotracker3",
device="cuda",
tracker_configs={"checkpoint": "checkpoints/scaled_offline.pth"},
)
queries = query_views_from_gaussians(
datasets=datasets,
gaussians=gaussians,
init_dataset_index=0,
num_points=256,
)
tracked_datasets = dataset_tracker(queries, datasets)
camera_track = tracked_datasets[0][0].custom_data["track"]
print(camera_track.points.shape)
Design: Point Tracker Registry
AbstractPointTracker.__call__ validates inputs, then calls track. It takes view-major queries and frame-major camera datasets, and returns one Track per view. CameraDatasetTracker attaches those tracks back onto the camera datasets:
view_queries + frame_datasets -> validate + track -> view_tracks -> tracked camera datasets
Single-view trackers (AbstractViewPointTracker, e.g. CoTracker3 / VGGT) implement track_batch(query, frames, masks) for one camera sequence. Their track loops track_view over views. Multi-view trackers (AbstractMultiViewPointTracker, e.g. MV-TAP) consume all views at once, using camera K / R / T when the model needs them.
Frame 0 cameras --\
Frame 1 cameras ----> single-view loop, or one joint multi-view call ----> view_tracks
Frame 2 cameras --/
This keeps model-specific code isolated in tracker implementations while the 4DGS workflow can use any registered tracker by name.
Extending: Adding a New Point Tracker
Single-view trackers return Track(points=[D, N, 2], visibility=[D, N]) from track_batch:
from collections.abc import Sequence
import torch
from track_4dgs.tracker import AbstractViewPointTracker, Query, Track
class MyPointTracker(AbstractViewPointTracker):
def to(self, device):
self.device = torch.device(device)
return self
def track_batch(
self,
query: Query,
frames: Sequence[torch.Tensor],
frame_masks: Sequence[torch.Tensor | None],
) -> Track:
...
Register it at import time:
from track_4dgs.registry import register_point_tracker
register_point_tracker("mytracker", MyPointTracker)
After registration, it is available everywhere:
python -m track_4dgs.track1v --tracker mytracker -s frame0.png frame1.png -d output/mytracker
Acknowledgement
This repo is developed based on CoTracker, VGGT, MV-TAP, LightGlue, and gaussian-splatting (packaged). Many thanks to the authors for open-sourcing their codebases.
Metadata
Release files for track-4dgs 0.2.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 | |
|---|---|---|---|
| track_4dgs-0.2.1.tar.gz | 35.5 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| track_4dgs-0.2.1-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 76.3 kB
Release files / track_4dgs-0.2.1.tar.gz
| Download URL | track_4dgs-0.2.1.tar.gz |
|---|---|
| Size | 35.5 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
048cd2db39729d6ff7c4d8a5aaac587253d2969543af1bcfe68dd3e1cd75ae30
|
|
BLAKE2b-256 checksum How to use checksums |
2e603b3962f081930a45f1a2fb2547246f8da400c67b4a24963455da3964b885
|
| 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 Sep 9, 2026.
Transparency logRelease files / track_4dgs-0.2.1-py3-none-any.whl
| Download URL | track_4dgs-0.2.1-py3-none-any.whl |
|---|---|
| Size | 40.8 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
40b7ff60e3a7c1cf4239e81f1b1ec65ddc2468132aaa7f44b89fa1922db7df51
|
|
BLAKE2b-256 checksum How to use checksums |
c686ec1208c79fc88eea9cd9c6f2ef48bced887aa3a19f74676624fec0626809
|
| 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 Sep 9, 2026.
Transparency log