a front-end for running (local) Vision models on videos
TypeScript
22
57 commits
updated May 26, 2026
A browser-based workbench for experimenting with ML/Vision models for video processing. You can run various models on an uploaded video to:
Runs as a local backend server & frontend web app. The UI is a Solid + Three.js app served by Vite; all heavy lifting is done by Python scripts that the Vite dev server shells out to. A plugin architecture makes it easy to add additional models.
The repo bundles a Python setup/ toolchain that installs every model
into a single, gitignored models/ directory: one venv, one set of
pinned commits, one canonical location for weights.
All computed results are saved, and can be browsed from the frontend.
This repo has been almost entirely created by Claude Code, under step-by-step human guidance. DO NOT deploy on the internet - code has not been hardened.
Questions / Comments? find me at [email protected], or @rms80.
See the Model / method reference section below for pinned commits, custom patches, and per-plugin quirks.
facebook/VGGT-Omega.facebook/sam3 via
Ultralytics. Click + text label → first-frame bbox & RGBA mask.sam2.1_l.pt
via Ultralytics' SAM2VideoPredictor. Propagates the SAM3 detection
across all frames in the tracked range.K / depth in as
priors.The typical end-to-end run looks like this. Every step writes its outputs
to analysis/<video_stem>/ and shows up in the right viewport without
needing a refresh.
Upload a video. Drag-drop or pick a previosly-uploaded video.
The server re-encodes for smooth scrubbing
and pre-extracts every frame as a JPEG under
analysis/<video>/_scene/frames/.
Scene analysis. Pick a method and run. Produces camera poses + intrinsics + per-frame depth, and (for most plugins) per-frame and/or global pointmaps. InfiniDepth is also available as a depth refiner.
World-up annotation (optional). Click 3+
points on horizontal surfaces (floor, table) across one or more
frames, then Align Scene. This rotates the reconstruction so up is
+y, yaws frame 0 to look down +z, and translates frame 0 to the
origin. Stored per-video; reusable across analyses.
Object segmentation. Click any object in the source frame, and enter a text label. SAM3 is run to segment the first frame (writes detect.json (bbox + base64 RGBA mask) + a frame-0 PNG mask). Then SAM2 can be run to propagate tracking (writes track.json and per-frame masks/NNNNNN.png). Note: the click is used to disambiguate which segmentation result to track
Each detect-then-track pair lives in its own analysis folder <label>_<N> (e.g. chair_1), selectable from the UI.
Box solve Lift the tracked 2D mask into a 3D oriented bounding box. Two solvers:
Output: <analysis>/<solver>/boxes.json. Solvers can co-exist on
one analysis run (output dirs are keyed by solver id).
Object point cloud . Builds a dense
object-only point cloud by unprojecting per-frame depth through the
per-frame mask and concatenating across the tracked range. Streamed
to the viewer as chunked .npz blobs.
The right side of the UI is a tab strip + viewport. Tabs are keyboard-navigable; arrow keys step frames within a tab (or jump to the nearest keyframe).
Source — the raw video frame, overlaid with the current mask / bbox if an analysis is loaded.
Depth — the active scene plugin's per-frame depth map, colourised and aligned to the source frame's resolution.
3D (Per-Frame) — Three.js viewport showing the current frame's depth lifted into a 3D mesh, plus camera path/frustums, solved boxes, etc
3D (Scene) — global scene pointmap streamed in chunks (plus boxes / etc)
3D (Object) — object-only point cloud built by unprojecting depth through the tracked masks.
Status / log output appears in a fixed bar at the bottom of the viewport and follows the latest pipeline run (scene prep, detect, track, box, object cloud).
A few plugins pull weights from gated Hugging Face repos. Skip this step if you don't need them — the rest of the setup still works. To request acess, open the links below and fill out the form (approved by Meta, often within minutes)
facebook/sam3 — required
for object detection / tracking.facebook/VGGT-Omega —
required for the VGGT-Omega scene plugin.While you are waiting, generate a token at https://huggingface.co/settings/tokens (paste it into a text file until you have finished setup, as you only get to see it once on the website!). Then either provide it in the text field in the GUI installer (see below) or run hf auth login (do pip install -U huggingface_hub to get the hf commands).
Prerequisites
PATH. Setup scripts use only the stdlib until
the venv exists.git clone).curope CUDA extension to build. Skipping is fine;
CUT3R falls back to a slower pure-Python RoPE.Install
npm install
python setup/INSTALL.py # GUI (recommended)
Run the app
run_server.bat
Prerequisites
PATH.Install
npm install
python setup/INSTALL.py # GUI (recommended)
Run the app
bash run_server.sh
Prerequisites
PATH.python3-tk on Debian/Ubuntu, or
python3-tkinter on Fedora/RHEL. The headless installer doesn't need
Tk.plugin_colmap.py auto-fixes a known libposelib
packaging gap.Install
npm install
python setup/INSTALL.py # python GUI installer
Run the app
bash run_server.sh
Installers run 00_venv.py first and then the requested
plugin_*.py scripts. Every script is idempotent — it skips
already-present artifacts — and supports --force to wipe and
reinstall. Re-running either installer is safe.
GUI (setup/INSTALL.py) — a Tk window with one checkbox per setup step (venv, plugins). Optionally enter your HF auth token for gated models. Each script's output streams into the log pane.
The --force checkbox forwards --force to every selected script.
Headless (setup/EVERYTHING.py) — runs every plugin in order,
unconditionally. Use this when you can't run a GUI. Be aware this will consume approx 100GB of disk space.
Per-component — if you only need a subset, run scripts piecewise:
python setup/00_venv.py # always first
python setup/plugin_colmap.py # if you want the COLMAP plugin
python setup/plugin_depthanythingv2.py # paired with COLMAP
python setup/plugin_cut3r.py
python setup/plugin_vggt.py
python setup/plugin_vggtomega.py # gated HF repo
python setup/plugin_da3.py
python setup/plugin_pi3.py
python setup/plugin_mapanything.py
python setup/plugin_worldmirror.py
python setup/plugin_worldmirror2.py
python setup/plugin_wilddet3d.py # provides scene AND box solver
python setup/plugin_infinidepth.py # depth refiner (post-process)
python setup/plugin_boxer.py
python setup/plugin_sam.py # required for detect/track (gated)
Everything except COLMAP (Windows zip / macOS Homebrew / Linux apt) and
the models/.venv/ itself lands under models/, which is gitignored.
The Vite dev server listens on port 4444. run_server.bat /
run_server.sh kill any existing listener on that port before starting
— don't invoke npm run dev directly, since strictPort: true makes a
stale listener fatal. Change the port in the script if you need a
different one.
models/
.venv/ project venv (CUDA torch on Win, MPS on Mac)
external/
boxer/
cut3r/
depth-anything-3/
hunyuanworld-mirror/
hy-world-2.0/
infinidepth/
vggt/
vggt-omega/
wilddet3d/ cloned --recursive (sam3, lingbot_depth submodules)
tools/
colmap/ Windows only; macOS uses Homebrew's binary
weights/
sam2.1_l.pt
sam3.pt
infinidepth/depth/infinidepth.ckpt
HuggingFace-distributed weights live in the standard HF cache
(~/.cache/huggingface), not under models/.
Pinned commits as of the last setup-script update. Every commit hash
below comes straight from setup/<name>.py.
id: colmapbrew install colmap on macOS).depth-anything/Depth-Anything-V2-Metric-Indoor-Large-hf.pycolmap (latest pip wheel).--max-size 1920, default --every 3).
run_depth.py then RANSAC-fits a per-frame affine between DA2 depth
and COLMAP sparse observations to recover a global metric scale and
rescales cameras.json translations into meters.id: cut3rCUT3R/CUT3R pinned to
8bc15dc92a6d7fd92920b4ec81540d3dec7d3ecf.cut3r_512_dpt_4_64.pth fetched from CUT3R's Google
Drive via gdown (Drive throttling occasionally needs a manual
download; the script prints the URL and bails gracefully if so).setup/plugin_cut3r.py:
requirements.txt to skip its pinned torch / torchvision / numpy / pillow (we keep the CUDA-built torch from
the base venv).setup/patches/:
cut3r-fallback-rope-and-load.patch — adds a Python-only RoPE2D
fallback path so CUT3R imports even without the curope CUDA
extension, and tolerates modern PyTorch's stricter torch.load.cut3r-curope-modern-pytorch.patch — fixes the bundled curope
CUDA extension's setup.py for current PyTorch / CUDA toolkit
headers.curope CUDA extension in-place if both nvcc and a
Windows vcvars64.bat are reachable. If either is missing, the
build is skipped and CUT3R falls back to the patched Python RoPE.id: vggtfacebookresearch/vggt
pinned to 44b3afbd1869d8bde4894dd8ea1e293112dd5eba.facebook/VGGT-1B.--anchors-only). Repo
requirements.txt is installed filtered (skip torch/torchvision/numpy/
pillow).id: vggtomegafacebookresearch/vggt-omega
pinned to 39a0cb8af88554f15ddcb5354cd52bde588fa014.facebook/VGGT-Omega
— gated (request access, then hf auth login). The setup
downloads only the non-text 512-resolution checkpoint
(vggt_omega_1b_512.pt, ~4.58 GB); the 256-text variant is skipped
since we only consume camera + depth here..pt state dicts (no from_pretrained). Repo
requirements.txt is installed filtered (skip torch/torchvision/
numpy/pillow).id: da3ByteDance-Seed/Depth-Anything-3
pinned to 41736238f5bced4debf3f2a12375d2466874866d.depth-anything/DA3-LARGE-1.1 (pose + relative depth)
and depth-anything/DA3METRIC-LARGE (metric depth). A scene-wide
ratio reconciles the two so translations land in meters.setup/plugin_da3.py (DA3's upstream
requirements are not Python 3.13-friendly):
open3d (no 3.13 wheel on PyPI; only viz paths use it),
xformers (latest hard-requires torch >= 2.10 and would clobber
our CUDA build), moviepy (DA3 imports moviepy.editor, removed
in 2.x — explicitly pinned to moviepy==1.0.3), and
pre-commit (dev tool only).addict manually — imported by depth_anything_3.model.da3
but missing from upstream pyproject / requirements.txt.pyproject.toml pins requires-python = "<=3.13", which
PEP 440 reads as excluding 3.13.x patch releases. We install with
--ignore-requires-python --no-deps.id: pi3pip install git+https://github.com/yyfz/Pi3.git@b412c3bd236dfd7686f1e4b48004d5087f2fa093.yyfz233/Pi3X.disable_multimodal()) to fit in
12 GB VRAM. Publishes both per-frame pointmaps and a global scene
pointmap.id: mapanythingpip install git+https://github.com/facebookresearch/map-anything.git@f7ebafb4d8349776705aaa686cf928988d1bd7f4.facebook/map-anything.minibatch_size=1 for
12 GB GPUs. Edge-aware masking applied to the scene pointmap.id: worldmirrorTencent-Hunyuan/HunyuanWorld-Mirror
pinned to b38bdd12e677f406788b1a56db5c3b4585f9ccd3.tencent/HunyuanWorld-Mirror.requirements.txt
— it pins torch==2.3.1 (would clobber our CUDA build) and depends
on a CUDA build of gsplat that we do not ship.run_worldmirror.py stubs gsplat at import time so the
gaussian-splat head is unused. Pointmap + depth + cameras work
without it.id: worldmirror2Tencent-Hunyuan/HY-World-2.0
pinned to 484e22020e7d7943eb199e31a00e10facf64c3d9.tencent/HY-World-2.0 (subfolder HY-WorldMirror-2.0).gsplat stub as v1, plus a
flash_attn shim in run_worldmirror2.py that routes everything to
PyTorch SDPA so the flash-attention build is unnecessary. Upstream
requirements.txt is again skipped (Linux-only gsplat wheel +
flash-attention).id: wilddet3dallenai/WildDet3D
pinned to 1768ffcd4c5e9bb1856d3f1a5b0b5e0498b89c97, cloned
recursively (submodules third_party/sam3 and third_party/lingbot_depth).wilddet3d_alldata_all_prompt_v1.0.pt from
allenai/WildDet3D on HF.setup/plugin_wilddet3d.py (this one's
the worst — upstream requirements are heavily incompatible with
Python 3.13):
utils3d in upstream requirements.txt resolves to the wrong PyPI
package (Kalash Jain's utils3d, which has no .pt / .np
submodules). WildDet3D's depth backend calls
utils3d.pt.depth_map_to_point_map, which is from
EasternJournalist's git-only utils3d. We filter the PyPI name out
and install the git version pinned to commit
94d1037aabbce32dea9c07a7c4849525817a1615.vis4d==1.0.0 is installed with --no-deps: its transitive deps
(bdd100k, scalabel) pin matplotlib==3.5.3 / Shapely==1.8,
neither of which has a 3.13 wheel and both fail to build from
sdist. The inference path doesn't touch any of that. We then
install the actual runtime deps (lightning, jsonargparse[signatures],
pydantic>=2.0, cloudpickle, devtools, h5py) from WildDet3D's
HF demo requirements.txt, which the upstream authors vetted as
inference-only.ftfy, regex,
iopath, open_clip_torch, safetensors.triton-windows (registers itself as
triton) since sam3.model.edt does a bare import triton and
the Linux HF demo gets that for free with torch.skip_pretrained=True, so SAM3 /
LingBot pretrained weights are not needed — the WildDet3D
checkpoint already contains them.id: infinidepthzju3dv/InfiniDepth
pinned to 36c6e0c31887fafc210184ee43ca475230704095.ritianyu/InfiniDepth →
models/weights/infinidepth/depth/infinidepth.ckpt.cameras.json + per-frame depth and feeds them
through InfiniDepth's neural implicit field to produce a sharper /
higher-res depth map. Pick the upstream source in the UI when
running the plugin.setup/plugin_infinidepth.py:
requirements.txt to skip
torch/torchvision/torchaudio/numpy/pillow (CUDA build in the
base venv), xformers (pins torch 2.9 and would clobber it),
gsplat (only used by the Gaussian-Splatting inference path,
which we don't run), open3d (no 3.13 wheel; viz-only), and
spaces (HF Space SDK shim).moviepy==1.0.3 because InfiniDepth imports
moviepy.editor, which 2.x dropped.override_gt_depth + intrinsics, so the lazy
from moge.model.v2 import MoGeModel import inside
moge_utils._get_moge2_model is never reached.id: boxerfacebookresearch/boxer
pinned to df474128a76ba42b05bc81feca7ac1a53fab41af.facebook/boxer (we pull three checkpoints into
models/external/boxer/ckpts/):
boxernet_hw960in4x6d768-wssxpf9p.ckptdinov3_vits16plus_pretrain_lvd1689m-4057cbaa.pthowlv2-base-patch16-ensemble.ptpyproject (uv-based, pins
versions we already control). We install only dill (used by its
checkpoint loader); torch + opencv + tqdm are already in the base
venv.gravity = [0, 0, -1]) before inference and rotates
results back. --fuse (UI: Fuse toggle) fuses all frames' masked
pointclouds into one static box.id: wilddet3dwilddet3d checkout and checkpoint as the scene plugin.K / depth are passed in.detect_object.pyfacebook/sam3
on HF → models/weights/sam3.pt. Gated repo: request access on
the model page and hf auth login into the project venv before
running setup/plugin_sam.py. See the Setup section.ultralytics>=8.4.37).detect.json (bbox + base64 RGBA mask) + frame0_mask.png.track_object.pysam2.1_l.pt
from the Ultralytics asset release → models/weights/sam2.1_l.pt.SAM2VideoPredictor (Ultralytics).detect.json, not the mask, due to
a shape bug in Ultralytics' mask-prompt path. Output is track.json
masks/NNNNNN.png.Every video gets an analysis/<video_stem>/ directory:
analysis/<video>/
_scene/
frames/NNNNNN.jpg (extract_frames.py)
frames.json (fps, frame count, source size)
<plugin>/cameras.json per-plugin poses + intrinsics
<plugin>/depth/NNNNNN.npz per-plugin per-frame depth
<plugin>/pointmap/NNNNNN.npz (optional, per-plugin)
<plugin>/scene_pointmap.npz (optional global pointmap)
<plugin>.log / prepare.log
<object_name>_<N>/ one per object analysis (e.g. chair_1)
detect.json
frame0_mask.png
track.json
masks/NNNNNN.png
boxer/boxes.json (optional)
wilddet3d/boxes.json (optional)
Adding a new scene method is a single entry in
src/scenePlugins.ts plus one runner script under scripts/. Adding
a new box solver is the same shape but in src/boxSolverPlugins.ts.
a front-end for running (local) Vision models on videos
TypeScript
22
57 commits
updated May 26, 2026
A browser-based workbench for experimenting with ML/Vision models for video processing. You can run various models on an uploaded video to:
Runs as a local backend server & frontend web app. The UI is a Solid + Three.js app served by Vite; all heavy lifting is done by Python scripts that the Vite dev server shells out to. A plugin architecture makes it easy to add additional models.
The repo bundles a Python setup/ toolchain that installs every model
into a single, gitignored models/ directory: one venv, one set of
pinned commits, one canonical location for weights.
All computed results are saved, and can be browsed from the frontend.
This repo has been almost entirely created by Claude Code, under step-by-step human guidance. DO NOT deploy on the internet - code has not been hardened.
Questions / Comments? find me at [email protected], or @rms80.
See the Model / method reference section below for pinned commits, custom patches, and per-plugin quirks.
facebook/VGGT-Omega.facebook/sam3 via
Ultralytics. Click + text label → first-frame bbox & RGBA mask.sam2.1_l.pt
via Ultralytics' SAM2VideoPredictor. Propagates the SAM3 detection
across all frames in the tracked range.K / depth in as
priors.The typical end-to-end run looks like this. Every step writes its outputs
to analysis/<video_stem>/ and shows up in the right viewport without
needing a refresh.
Upload a video. Drag-drop or pick a previosly-uploaded video.
The server re-encodes for smooth scrubbing
and pre-extracts every frame as a JPEG under
analysis/<video>/_scene/frames/.
Scene analysis. Pick a method and run. Produces camera poses + intrinsics + per-frame depth, and (for most plugins) per-frame and/or global pointmaps. InfiniDepth is also available as a depth refiner.
World-up annotation (optional). Click 3+
points on horizontal surfaces (floor, table) across one or more
frames, then Align Scene. This rotates the reconstruction so up is
+y, yaws frame 0 to look down +z, and translates frame 0 to the
origin. Stored per-video; reusable across analyses.
Object segmentation. Click any object in the source frame, and enter a text label. SAM3 is run to segment the first frame (writes detect.json (bbox + base64 RGBA mask) + a frame-0 PNG mask). Then SAM2 can be run to propagate tracking (writes track.json and per-frame masks/NNNNNN.png). Note: the click is used to disambiguate which segmentation result to track
Each detect-then-track pair lives in its own analysis folder <label>_<N> (e.g. chair_1), selectable from the UI.
Box solve Lift the tracked 2D mask into a 3D oriented bounding box. Two solvers:
Output: <analysis>/<solver>/boxes.json. Solvers can co-exist on
one analysis run (output dirs are keyed by solver id).
Object point cloud . Builds a dense
object-only point cloud by unprojecting per-frame depth through the
per-frame mask and concatenating across the tracked range. Streamed
to the viewer as chunked .npz blobs.
The right side of the UI is a tab strip + viewport. Tabs are keyboard-navigable; arrow keys step frames within a tab (or jump to the nearest keyframe).
Source — the raw video frame, overlaid with the current mask / bbox if an analysis is loaded.
Depth — the active scene plugin's per-frame depth map, colourised and aligned to the source frame's resolution.
3D (Per-Frame) — Three.js viewport showing the current frame's depth lifted into a 3D mesh, plus camera path/frustums, solved boxes, etc
3D (Scene) — global scene pointmap streamed in chunks (plus boxes / etc)
3D (Object) — object-only point cloud built by unprojecting depth through the tracked masks.
Status / log output appears in a fixed bar at the bottom of the viewport and follows the latest pipeline run (scene prep, detect, track, box, object cloud).
A few plugins pull weights from gated Hugging Face repos. Skip this step if you don't need them — the rest of the setup still works. To request acess, open the links below and fill out the form (approved by Meta, often within minutes)
facebook/sam3 — required
for object detection / tracking.facebook/VGGT-Omega —
required for the VGGT-Omega scene plugin.While you are waiting, generate a token at https://huggingface.co/settings/tokens (paste it into a text file until you have finished setup, as you only get to see it once on the website!). Then either provide it in the text field in the GUI installer (see below) or run hf auth login (do pip install -U huggingface_hub to get the hf commands).
Prerequisites
PATH. Setup scripts use only the stdlib until
the venv exists.git clone).curope CUDA extension to build. Skipping is fine;
CUT3R falls back to a slower pure-Python RoPE.Install
npm install
python setup/INSTALL.py # GUI (recommended)
Run the app
run_server.bat
Prerequisites
PATH.Install
npm install
python setup/INSTALL.py # GUI (recommended)
Run the app
bash run_server.sh
Prerequisites
PATH.python3-tk on Debian/Ubuntu, or
python3-tkinter on Fedora/RHEL. The headless installer doesn't need
Tk.plugin_colmap.py auto-fixes a known libposelib
packaging gap.Install
npm install
python setup/INSTALL.py # python GUI installer
Run the app
bash run_server.sh
Installers run 00_venv.py first and then the requested
plugin_*.py scripts. Every script is idempotent — it skips
already-present artifacts — and supports --force to wipe and
reinstall. Re-running either installer is safe.
GUI (setup/INSTALL.py) — a Tk window with one checkbox per setup step (venv, plugins). Optionally enter your HF auth token for gated models. Each script's output streams into the log pane.
The --force checkbox forwards --force to every selected script.
Headless (setup/EVERYTHING.py) — runs every plugin in order,
unconditionally. Use this when you can't run a GUI. Be aware this will consume approx 100GB of disk space.
Per-component — if you only need a subset, run scripts piecewise:
python setup/00_venv.py # always first
python setup/plugin_colmap.py # if you want the COLMAP plugin
python setup/plugin_depthanythingv2.py # paired with COLMAP
python setup/plugin_cut3r.py
python setup/plugin_vggt.py
python setup/plugin_vggtomega.py # gated HF repo
python setup/plugin_da3.py
python setup/plugin_pi3.py
python setup/plugin_mapanything.py
python setup/plugin_worldmirror.py
python setup/plugin_worldmirror2.py
python setup/plugin_wilddet3d.py # provides scene AND box solver
python setup/plugin_infinidepth.py # depth refiner (post-process)
python setup/plugin_boxer.py
python setup/plugin_sam.py # required for detect/track (gated)
Everything except COLMAP (Windows zip / macOS Homebrew / Linux apt) and
the models/.venv/ itself lands under models/, which is gitignored.
The Vite dev server listens on port 4444. run_server.bat /
run_server.sh kill any existing listener on that port before starting
— don't invoke npm run dev directly, since strictPort: true makes a
stale listener fatal. Change the port in the script if you need a
different one.
models/
.venv/ project venv (CUDA torch on Win, MPS on Mac)
external/
boxer/
cut3r/
depth-anything-3/
hunyuanworld-mirror/
hy-world-2.0/
infinidepth/
vggt/
vggt-omega/
wilddet3d/ cloned --recursive (sam3, lingbot_depth submodules)
tools/
colmap/ Windows only; macOS uses Homebrew's binary
weights/
sam2.1_l.pt
sam3.pt
infinidepth/depth/infinidepth.ckpt
HuggingFace-distributed weights live in the standard HF cache
(~/.cache/huggingface), not under models/.
Pinned commits as of the last setup-script update. Every commit hash
below comes straight from setup/<name>.py.
id: colmapbrew install colmap on macOS).depth-anything/Depth-Anything-V2-Metric-Indoor-Large-hf.pycolmap (latest pip wheel).--max-size 1920, default --every 3).
run_depth.py then RANSAC-fits a per-frame affine between DA2 depth
and COLMAP sparse observations to recover a global metric scale and
rescales cameras.json translations into meters.id: cut3rCUT3R/CUT3R pinned to
8bc15dc92a6d7fd92920b4ec81540d3dec7d3ecf.cut3r_512_dpt_4_64.pth fetched from CUT3R's Google
Drive via gdown (Drive throttling occasionally needs a manual
download; the script prints the URL and bails gracefully if so).setup/plugin_cut3r.py:
requirements.txt to skip its pinned torch / torchvision / numpy / pillow (we keep the CUDA-built torch from
the base venv).setup/patches/:
cut3r-fallback-rope-and-load.patch — adds a Python-only RoPE2D
fallback path so CUT3R imports even without the curope CUDA
extension, and tolerates modern PyTorch's stricter torch.load.cut3r-curope-modern-pytorch.patch — fixes the bundled curope
CUDA extension's setup.py for current PyTorch / CUDA toolkit
headers.curope CUDA extension in-place if both nvcc and a
Windows vcvars64.bat are reachable. If either is missing, the
build is skipped and CUT3R falls back to the patched Python RoPE.id: vggtfacebookresearch/vggt
pinned to 44b3afbd1869d8bde4894dd8ea1e293112dd5eba.facebook/VGGT-1B.--anchors-only). Repo
requirements.txt is installed filtered (skip torch/torchvision/numpy/
pillow).id: vggtomegafacebookresearch/vggt-omega
pinned to 39a0cb8af88554f15ddcb5354cd52bde588fa014.facebook/VGGT-Omega
— gated (request access, then hf auth login). The setup
downloads only the non-text 512-resolution checkpoint
(vggt_omega_1b_512.pt, ~4.58 GB); the 256-text variant is skipped
since we only consume camera + depth here..pt state dicts (no from_pretrained). Repo
requirements.txt is installed filtered (skip torch/torchvision/
numpy/pillow).id: da3ByteDance-Seed/Depth-Anything-3
pinned to 41736238f5bced4debf3f2a12375d2466874866d.depth-anything/DA3-LARGE-1.1 (pose + relative depth)
and depth-anything/DA3METRIC-LARGE (metric depth). A scene-wide
ratio reconciles the two so translations land in meters.setup/plugin_da3.py (DA3's upstream
requirements are not Python 3.13-friendly):
open3d (no 3.13 wheel on PyPI; only viz paths use it),
xformers (latest hard-requires torch >= 2.10 and would clobber
our CUDA build), moviepy (DA3 imports moviepy.editor, removed
in 2.x — explicitly pinned to moviepy==1.0.3), and
pre-commit (dev tool only).addict manually — imported by depth_anything_3.model.da3
but missing from upstream pyproject / requirements.txt.pyproject.toml pins requires-python = "<=3.13", which
PEP 440 reads as excluding 3.13.x patch releases. We install with
--ignore-requires-python --no-deps.id: pi3pip install git+https://github.com/yyfz/Pi3.git@b412c3bd236dfd7686f1e4b48004d5087f2fa093.yyfz233/Pi3X.disable_multimodal()) to fit in
12 GB VRAM. Publishes both per-frame pointmaps and a global scene
pointmap.id: mapanythingpip install git+https://github.com/facebookresearch/map-anything.git@f7ebafb4d8349776705aaa686cf928988d1bd7f4.facebook/map-anything.minibatch_size=1 for
12 GB GPUs. Edge-aware masking applied to the scene pointmap.id: worldmirrorTencent-Hunyuan/HunyuanWorld-Mirror
pinned to b38bdd12e677f406788b1a56db5c3b4585f9ccd3.tencent/HunyuanWorld-Mirror.requirements.txt
— it pins torch==2.3.1 (would clobber our CUDA build) and depends
on a CUDA build of gsplat that we do not ship.run_worldmirror.py stubs gsplat at import time so the
gaussian-splat head is unused. Pointmap + depth + cameras work
without it.id: worldmirror2Tencent-Hunyuan/HY-World-2.0
pinned to 484e22020e7d7943eb199e31a00e10facf64c3d9.tencent/HY-World-2.0 (subfolder HY-WorldMirror-2.0).gsplat stub as v1, plus a
flash_attn shim in run_worldmirror2.py that routes everything to
PyTorch SDPA so the flash-attention build is unnecessary. Upstream
requirements.txt is again skipped (Linux-only gsplat wheel +
flash-attention).id: wilddet3dallenai/WildDet3D
pinned to 1768ffcd4c5e9bb1856d3f1a5b0b5e0498b89c97, cloned
recursively (submodules third_party/sam3 and third_party/lingbot_depth).wilddet3d_alldata_all_prompt_v1.0.pt from
allenai/WildDet3D on HF.setup/plugin_wilddet3d.py (this one's
the worst — upstream requirements are heavily incompatible with
Python 3.13):
utils3d in upstream requirements.txt resolves to the wrong PyPI
package (Kalash Jain's utils3d, which has no .pt / .np
submodules). WildDet3D's depth backend calls
utils3d.pt.depth_map_to_point_map, which is from
EasternJournalist's git-only utils3d. We filter the PyPI name out
and install the git version pinned to commit
94d1037aabbce32dea9c07a7c4849525817a1615.vis4d==1.0.0 is installed with --no-deps: its transitive deps
(bdd100k, scalabel) pin matplotlib==3.5.3 / Shapely==1.8,
neither of which has a 3.13 wheel and both fail to build from
sdist. The inference path doesn't touch any of that. We then
install the actual runtime deps (lightning, jsonargparse[signatures],
pydantic>=2.0, cloudpickle, devtools, h5py) from WildDet3D's
HF demo requirements.txt, which the upstream authors vetted as
inference-only.ftfy, regex,
iopath, open_clip_torch, safetensors.triton-windows (registers itself as
triton) since sam3.model.edt does a bare import triton and
the Linux HF demo gets that for free with torch.skip_pretrained=True, so SAM3 /
LingBot pretrained weights are not needed — the WildDet3D
checkpoint already contains them.id: infinidepthzju3dv/InfiniDepth
pinned to 36c6e0c31887fafc210184ee43ca475230704095.ritianyu/InfiniDepth →
models/weights/infinidepth/depth/infinidepth.ckpt.cameras.json + per-frame depth and feeds them
through InfiniDepth's neural implicit field to produce a sharper /
higher-res depth map. Pick the upstream source in the UI when
running the plugin.setup/plugin_infinidepth.py:
requirements.txt to skip
torch/torchvision/torchaudio/numpy/pillow (CUDA build in the
base venv), xformers (pins torch 2.9 and would clobber it),
gsplat (only used by the Gaussian-Splatting inference path,
which we don't run), open3d (no 3.13 wheel; viz-only), and
spaces (HF Space SDK shim).moviepy==1.0.3 because InfiniDepth imports
moviepy.editor, which 2.x dropped.override_gt_depth + intrinsics, so the lazy
from moge.model.v2 import MoGeModel import inside
moge_utils._get_moge2_model is never reached.id: boxerfacebookresearch/boxer
pinned to df474128a76ba42b05bc81feca7ac1a53fab41af.facebook/boxer (we pull three checkpoints into
models/external/boxer/ckpts/):
boxernet_hw960in4x6d768-wssxpf9p.ckptdinov3_vits16plus_pretrain_lvd1689m-4057cbaa.pthowlv2-base-patch16-ensemble.ptpyproject (uv-based, pins
versions we already control). We install only dill (used by its
checkpoint loader); torch + opencv + tqdm are already in the base
venv.gravity = [0, 0, -1]) before inference and rotates
results back. --fuse (UI: Fuse toggle) fuses all frames' masked
pointclouds into one static box.id: wilddet3dwilddet3d checkout and checkpoint as the scene plugin.K / depth are passed in.detect_object.pyfacebook/sam3
on HF → models/weights/sam3.pt. Gated repo: request access on
the model page and hf auth login into the project venv before
running setup/plugin_sam.py. See the Setup section.ultralytics>=8.4.37).detect.json (bbox + base64 RGBA mask) + frame0_mask.png.track_object.pysam2.1_l.pt
from the Ultralytics asset release → models/weights/sam2.1_l.pt.SAM2VideoPredictor (Ultralytics).detect.json, not the mask, due to
a shape bug in Ultralytics' mask-prompt path. Output is track.json
masks/NNNNNN.png.Every video gets an analysis/<video_stem>/ directory:
analysis/<video>/
_scene/
frames/NNNNNN.jpg (extract_frames.py)
frames.json (fps, frame count, source size)
<plugin>/cameras.json per-plugin poses + intrinsics
<plugin>/depth/NNNNNN.npz per-plugin per-frame depth
<plugin>/pointmap/NNNNNN.npz (optional, per-plugin)
<plugin>/scene_pointmap.npz (optional global pointmap)
<plugin>.log / prepare.log
<object_name>_<N>/ one per object analysis (e.g. chair_1)
detect.json
frame0_mask.png
track.json
masks/NNNNNN.png
boxer/boxes.json (optional)
wilddet3d/boxes.json (optional)
Adding a new scene method is a single entry in
src/scenePlugins.ts plus one runner script under scripts/. Adding
a new box solver is the same shape but in src/boxSolverPlugins.ts.