Install dvlt from a vendored prebuilt wheel (ZeroGPU, no git/sys.path)
Browse filespackages/dvlt/
repo/ verbatim nv-tlabs/dvlt @ 265fe61, diff = 3 relaxed pins
(torch, torchvision, pydantic) so it resolves with the
ZeroGPU torch>=2.8 + gradio 5.50 stack
wheels/ prebuilt wheel (built by build.sh)
build.sh builds repo/ -> wheels/
requirements.txt installs that wheel via the Space's HTTPS resolve URL
(git+url and local-path installs both fail on HF's Gradio build). No sys.path.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This view is limited to 50 files because it contains too many changes. See raw diff
- .gitattributes +1 -0
- README.md +7 -8
- app.py +2 -2
- packages/dvlt/README.md +21 -19
- packages/dvlt/build.sh +24 -0
- packages/dvlt/repo/.gitattributes +2 -0
- packages/dvlt/repo/.gitignore +201 -0
- packages/dvlt/repo/.pre-commit-config.yaml +32 -0
- packages/dvlt/repo/CONTRIBUTING.md +68 -0
- packages/dvlt/{LICENSE → repo/LICENSE} +0 -0
- packages/dvlt/{LICENSES → repo/LICENSES}/NVIDIA-LICENSE.txt +0 -0
- packages/dvlt/{LICENSES → repo/LICENSES}/VGGT-LICENSE.txt +0 -0
- packages/dvlt/repo/README.md +262 -0
- packages/dvlt/{THIRD_PARTY_LICENSES.md → repo/THIRD_PARTY_LICENSES.md} +0 -0
- packages/dvlt/repo/assets/nvidia-hq-dvlt.gif +3 -0
- packages/dvlt/repo/docs/CONTRIB.md +97 -0
- packages/dvlt/repo/docs/INSTALL.md +74 -0
- packages/dvlt/repo/docs/TESTING.md +134 -0
- packages/dvlt/repo/docs/data/DATA.md +138 -0
- packages/dvlt/{pyproject.toml → repo/pyproject.toml} +100 -5
- packages/dvlt/{src → repo/src}/dvlt/__init__.py +0 -0
- packages/dvlt/{src → repo/src}/dvlt/callbacks/__init__.py +0 -0
- packages/dvlt/{src → repo/src}/dvlt/callbacks/base.py +0 -0
- packages/dvlt/{src → repo/src}/dvlt/callbacks/evaluators/__init__.py +0 -0
- packages/dvlt/{src → repo/src}/dvlt/callbacks/evaluators/base.py +0 -0
- packages/dvlt/{src → repo/src}/dvlt/callbacks/evaluators/depth.py +0 -0
- packages/dvlt/{src → repo/src}/dvlt/callbacks/evaluators/pointmap.py +0 -0
- packages/dvlt/{src → repo/src}/dvlt/callbacks/evaluators/pose.py +0 -0
- packages/dvlt/{src → repo/src}/dvlt/callbacks/logging.py +0 -0
- packages/dvlt/{src → repo/src}/dvlt/callbacks/util.py +0 -0
- packages/dvlt/{src → repo/src}/dvlt/callbacks/visualization.py +0 -0
- packages/dvlt/{src → repo/src}/dvlt/common/__init__.py +0 -0
- packages/dvlt/{src → repo/src}/dvlt/common/amp.py +0 -0
- packages/dvlt/{src → repo/src}/dvlt/common/constants.py +0 -0
- packages/dvlt/{src → repo/src}/dvlt/common/geometry.py +0 -0
- packages/dvlt/{src → repo/src}/dvlt/common/io.py +0 -0
- packages/dvlt/{src → repo/src}/dvlt/common/numpy/__init__.py +0 -0
- packages/dvlt/{src → repo/src}/dvlt/common/numpy/geometry.py +0 -0
- packages/dvlt/{src → repo/src}/dvlt/common/numpy/projection.py +0 -0
- packages/dvlt/{src → repo/src}/dvlt/common/numpy/rotation.py +0 -0
- packages/dvlt/{src → repo/src}/dvlt/common/pose.py +0 -0
- packages/dvlt/{src → repo/src}/dvlt/common/projection.py +0 -0
- packages/dvlt/{src → repo/src}/dvlt/common/rays.py +0 -0
- packages/dvlt/{src → repo/src}/dvlt/common/rotation.py +0 -0
- packages/dvlt/{src → repo/src}/dvlt/common/tensor.py +0 -0
- packages/dvlt/{src → repo/src}/dvlt/common/types.py +0 -0
- packages/dvlt/{src → repo/src}/dvlt/config/__init__.py +0 -0
- packages/dvlt/{src → repo/src}/dvlt/config/cli.py +0 -0
- packages/dvlt/{src → repo/src}/dvlt/config/completion.py +0 -0
- packages/dvlt/{src → repo/src}/dvlt/config/experiments/da3-base.yaml +0 -0
.gitattributes
CHANGED
|
@@ -7,3 +7,4 @@
|
|
| 7 |
*.gif filter=lfs diff=lfs merge=lfs -text
|
| 8 |
*.glb filter=lfs diff=lfs merge=lfs -text
|
| 9 |
*.onnx filter=lfs diff=lfs merge=lfs -text
|
|
|
|
|
|
| 7 |
*.gif filter=lfs diff=lfs merge=lfs -text
|
| 8 |
*.glb filter=lfs diff=lfs merge=lfs -text
|
| 9 |
*.onnx filter=lfs diff=lfs merge=lfs -text
|
| 10 |
+
*.whl filter=lfs diff=lfs merge=lfs -text
|
README.md
CHANGED
|
@@ -55,14 +55,13 @@ The `@spaces.GPU` decorator is a no-op off-Spaces, so it runs on CPU or a local
|
|
| 55 |
GPU unchanged.
|
| 56 |
|
| 57 |
> **ZeroGPU note:** ZeroGPU runs on Blackwell GPUs that need `torch>=2.8`, but
|
| 58 |
-
> the official `dvlt` package hard-pins `torch==2.5.1`. This repo
|
| 59 |
-
>
|
| 60 |
-
> [`nv-tlabs/dvlt`](https://github.com/nv-tlabs/dvlt) @ `265fe61` with
|
| 61 |
-
> `torch`/`torchvision`
|
| 62 |
-
>
|
| 63 |
-
>
|
| 64 |
-
>
|
| 65 |
-
> [`packages/dvlt/README.md`](packages/dvlt/README.md) for the exact edits.
|
| 66 |
|
| 67 |
## Credits
|
| 68 |
|
|
|
|
| 55 |
GPU unchanged.
|
| 56 |
|
| 57 |
> **ZeroGPU note:** ZeroGPU runs on Blackwell GPUs that need `torch>=2.8`, but
|
| 58 |
+
> the official `dvlt` package hard-pins `torch==2.5.1`. This repo **vendors**
|
| 59 |
+
> `dvlt` under [`packages/dvlt`](packages/dvlt): `repo/` is
|
| 60 |
+
> [`nv-tlabs/dvlt`](https://github.com/nv-tlabs/dvlt) @ `265fe61` with a 3-line
|
| 61 |
+
> pin relaxation (`torch`/`torchvision`/`pydantic`), and `wheels/` holds the
|
| 62 |
+
> prebuilt wheel (`build.sh`). It's installed from that wheel via the Space's
|
| 63 |
+
> own HTTPS `resolve` URL — not git or a local path, both of which fail on HF's
|
| 64 |
+
> Gradio build. See [`packages/dvlt/README.md`](packages/dvlt/README.md).
|
|
|
|
| 65 |
|
| 66 |
## Credits
|
| 67 |
|
app.py
CHANGED
|
@@ -4,8 +4,8 @@ Déjà View (DVLT) — Looping Transformers for Multi-View 3D Reconstruction.
|
|
| 4 |
ZeroGPU-ready: GPU work is wrapped in `@spaces.GPU` (see `dvlt_demo.model`),
|
| 5 |
and falls back to CPU when no GPU / `spaces` package is available.
|
| 6 |
|
| 7 |
-
`
|
| 8 |
-
|
| 9 |
"""
|
| 10 |
|
| 11 |
from dvlt_demo.ui import build_demo
|
|
|
|
| 4 |
ZeroGPU-ready: GPU work is wrapped in `@spaces.GPU` (see `dvlt_demo.model`),
|
| 5 |
and falls back to CPU when no GPU / `spaces` package is available.
|
| 6 |
|
| 7 |
+
`dvlt` is installed from the vendored wheel in `packages/dvlt/wheels/` (see
|
| 8 |
+
`requirements.txt`); `dvlt_demo` sits next to this file. Nothing touches sys.path.
|
| 9 |
"""
|
| 10 |
|
| 11 |
from dvlt_demo.ui import build_demo
|
packages/dvlt/README.md
CHANGED
|
@@ -1,26 +1,28 @@
|
|
| 1 |
-
#
|
| 2 |
|
| 3 |
-
|
| 4 |
-
[`nv-tlabs/dvlt`](https://github.com/nv-tlabs/dvlt) @ commit `265fe61`
|
| 5 |
-
|
| 6 |
-
|
| 7 |
-
|
| 8 |
-
|
| 9 |
-
|
|
|
|
| 10 |
|
| 11 |
-
##
|
| 12 |
|
| 13 |
-
|
| 14 |
|
| 15 |
-
-
|
| 16 |
-
|
| 17 |
-
|
| 18 |
-
- `
|
| 19 |
-
|
|
|
|
| 20 |
|
| 21 |
-
|
| 22 |
-
|
| 23 |
|
| 24 |
Upstream code is Apache-2.0; the `nvidia/dvlt` weights are under the NVIDIA
|
| 25 |
-
non-commercial research license
|
| 26 |
-
`THIRD_PARTY_LICENSES.md`.
|
|
|
|
| 1 |
+
# Vendored `dvlt`
|
| 2 |
|
| 3 |
+
- **`repo/`** — a verbatim copy of the upstream **Déjà View (DVLT)** repository,
|
| 4 |
+
[`nv-tlabs/dvlt`](https://github.com/nv-tlabs/dvlt) @ commit `265fe61`. The
|
| 5 |
+
**only** edit is in `repo/pyproject.toml`: the `torch`/`torchvision` pins were
|
| 6 |
+
relaxed from `==` to `>=` (ZeroGPU runs on Blackwell GPUs that need
|
| 7 |
+
`torch>=2.8`, and the `torchvision==0.20.1` pin transitively forced
|
| 8 |
+
`torch==2.5.1`). Everything else is unmodified.
|
| 9 |
+
- **`build.sh`** — builds the wheel from `repo/` into `wheels/`.
|
| 10 |
+
- **`wheels/`** — the prebuilt wheel the Space installs.
|
| 11 |
|
| 12 |
+
## Why a vendored wheel instead of `pip install dvlt`
|
| 13 |
|
| 14 |
+
The Space (Gradio SDK + ZeroGPU) can't install this any other way:
|
| 15 |
|
| 16 |
+
- a local path dep (`./packages/dvlt/repo`) isn't available when HF runs
|
| 17 |
+
`pip install -r requirements.txt` — it installs requirements *before* copying
|
| 18 |
+
the repo;
|
| 19 |
+
- `pip install git+https://huggingface.co/...` fails — pip clones with
|
| 20 |
+
`--filter=blob:none`, and HF's git backend can't serve that partial fetch in
|
| 21 |
+
the build sandbox.
|
| 22 |
|
| 23 |
+
So the wheel is committed here and installed via the Space's own HTTPS
|
| 24 |
+
`resolve` URL (a plain download — no git, no `sys.path`). See `../../requirements.txt`.
|
| 25 |
|
| 26 |
Upstream code is Apache-2.0; the `nvidia/dvlt` weights are under the NVIDIA
|
| 27 |
+
non-commercial research license (see `repo/LICENSE`, `repo/LICENSES/`,
|
| 28 |
+
`repo/THIRD_PARTY_LICENSES.md`).
|
packages/dvlt/build.sh
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
#!/usr/bin/env bash
|
| 2 |
+
# Build the vendored dvlt wheel from repo/ into wheels/.
|
| 3 |
+
#
|
| 4 |
+
# The Space installs dvlt from the resulting wheel via its HTTPS resolve URL
|
| 5 |
+
# (see ../../requirements.txt) — not from git or a local path, both of which
|
| 6 |
+
# fail on Hugging Face's Gradio build (see ../../README.md). Re-run this after
|
| 7 |
+
# editing repo/ and commit the refreshed wheel.
|
| 8 |
+
set -euo pipefail
|
| 9 |
+
|
| 10 |
+
HERE="$(cd "$(dirname "$0")" && pwd)"
|
| 11 |
+
rm -rf "$HERE/wheels"
|
| 12 |
+
mkdir -p "$HERE/wheels"
|
| 13 |
+
|
| 14 |
+
if command -v uv >/dev/null 2>&1; then
|
| 15 |
+
uv build --wheel "$HERE/repo" --out-dir "$HERE/wheels"
|
| 16 |
+
else
|
| 17 |
+
python -m build --wheel --outdir "$HERE/wheels" "$HERE/repo"
|
| 18 |
+
fi
|
| 19 |
+
|
| 20 |
+
# Keep repo/ a pristine copy of upstream — drop in-tree build artifacts.
|
| 21 |
+
rm -rf "$HERE/repo/build" "$HERE/repo"/src/*.egg-info
|
| 22 |
+
|
| 23 |
+
echo "Built:"
|
| 24 |
+
ls -1 "$HERE/wheels"
|
packages/dvlt/repo/.gitattributes
ADDED
|
@@ -0,0 +1,2 @@
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# SCM syntax highlighting & preventing 3-way merges
|
| 2 |
+
pixi.lock merge=binary linguist-language=YAML linguist-generated=true
|
packages/dvlt/repo/.gitignore
ADDED
|
@@ -0,0 +1,201 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
.hydra/
|
| 2 |
+
output/
|
| 3 |
+
ckpt/
|
| 4 |
+
dependency/
|
| 5 |
+
# Byte-compiled / optimized / DLL files
|
| 6 |
+
__pycache__/
|
| 7 |
+
**/__pycache__/
|
| 8 |
+
*.py[cod]
|
| 9 |
+
*$py.class
|
| 10 |
+
|
| 11 |
+
# C extensions
|
| 12 |
+
*.so
|
| 13 |
+
|
| 14 |
+
# Distribution / packaging
|
| 15 |
+
.Python
|
| 16 |
+
build/
|
| 17 |
+
develop-eggs/
|
| 18 |
+
dist/
|
| 19 |
+
downloads/
|
| 20 |
+
eggs/
|
| 21 |
+
.eggs/
|
| 22 |
+
lib/
|
| 23 |
+
lib64/
|
| 24 |
+
parts/
|
| 25 |
+
sdist/
|
| 26 |
+
var/
|
| 27 |
+
wheels/
|
| 28 |
+
pip-wheel-metadata/
|
| 29 |
+
share/python-wheels/
|
| 30 |
+
*.egg-info/
|
| 31 |
+
.installed.cfg
|
| 32 |
+
*.egg
|
| 33 |
+
MANIFEST
|
| 34 |
+
|
| 35 |
+
# PyInstaller
|
| 36 |
+
# Usually these files are written by a python script from a template
|
| 37 |
+
# before PyInstaller builds the exe, so as to inject date/other infos into it.
|
| 38 |
+
*.manifest
|
| 39 |
+
*.spec
|
| 40 |
+
|
| 41 |
+
# Installer logs
|
| 42 |
+
pip-log.txt
|
| 43 |
+
pip-delete-this-directory.txt
|
| 44 |
+
|
| 45 |
+
# Unit test / coverage reports
|
| 46 |
+
htmlcov/
|
| 47 |
+
.tox/
|
| 48 |
+
.nox/
|
| 49 |
+
.coverage
|
| 50 |
+
.coverage.*
|
| 51 |
+
.cache
|
| 52 |
+
nosetests.xml
|
| 53 |
+
coverage.xml
|
| 54 |
+
*.cover
|
| 55 |
+
*.py,cover
|
| 56 |
+
.hypothesis/
|
| 57 |
+
.pytest_cache/
|
| 58 |
+
cover/
|
| 59 |
+
|
| 60 |
+
# Translations
|
| 61 |
+
*.mo
|
| 62 |
+
*.pot
|
| 63 |
+
|
| 64 |
+
# Django stuff:
|
| 65 |
+
*.log
|
| 66 |
+
local_settings.py
|
| 67 |
+
db.sqlite3
|
| 68 |
+
db.sqlite3-journal
|
| 69 |
+
|
| 70 |
+
# Flask stuff:
|
| 71 |
+
instance/
|
| 72 |
+
.webassets-cache
|
| 73 |
+
|
| 74 |
+
# Scrapy stuff:
|
| 75 |
+
.scrapy
|
| 76 |
+
|
| 77 |
+
# Sphinx documentation
|
| 78 |
+
docs/_build/
|
| 79 |
+
|
| 80 |
+
# PyBuilder
|
| 81 |
+
target/
|
| 82 |
+
|
| 83 |
+
# Jupyter Notebook
|
| 84 |
+
.ipynb_checkpoints
|
| 85 |
+
|
| 86 |
+
# IPython
|
| 87 |
+
profile_default/
|
| 88 |
+
ipython_config.py
|
| 89 |
+
|
| 90 |
+
# pyenv
|
| 91 |
+
.python-version
|
| 92 |
+
|
| 93 |
+
# pipenv
|
| 94 |
+
# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
|
| 95 |
+
# However, in case of collaboration, if having platform-specific dependencies or dependencies
|
| 96 |
+
# having no cross-platform support, pipenv may install dependencies that don't work, or not
|
| 97 |
+
# install all needed dependencies.
|
| 98 |
+
#Pipfile.lock
|
| 99 |
+
|
| 100 |
+
# PEP 582; used by e.g. github.com/David-OConnor/pyflow
|
| 101 |
+
__pypackages__/
|
| 102 |
+
|
| 103 |
+
# Celery stuff
|
| 104 |
+
celerybeat-schedule
|
| 105 |
+
celerybeat.pid
|
| 106 |
+
|
| 107 |
+
# SageMath parsed files
|
| 108 |
+
*.sage.py
|
| 109 |
+
|
| 110 |
+
# Environments
|
| 111 |
+
.env
|
| 112 |
+
.venv
|
| 113 |
+
env/
|
| 114 |
+
venv/
|
| 115 |
+
ENV/
|
| 116 |
+
env.bak/
|
| 117 |
+
venv.bak/
|
| 118 |
+
|
| 119 |
+
# Spyder project settings
|
| 120 |
+
.spyderproject
|
| 121 |
+
.spyproject
|
| 122 |
+
|
| 123 |
+
# Rope project settings
|
| 124 |
+
.ropeproject
|
| 125 |
+
|
| 126 |
+
# mkdocs documentation
|
| 127 |
+
/site
|
| 128 |
+
|
| 129 |
+
# mypy
|
| 130 |
+
.mypy_cache/
|
| 131 |
+
.dmypy.json
|
| 132 |
+
dmypy.json
|
| 133 |
+
|
| 134 |
+
# Pyre type checker
|
| 135 |
+
.pyre/
|
| 136 |
+
|
| 137 |
+
# pytype static type analyzer
|
| 138 |
+
.pytype/
|
| 139 |
+
|
| 140 |
+
# Profiling data
|
| 141 |
+
.prof
|
| 142 |
+
|
| 143 |
+
# Folder specific to your needs
|
| 144 |
+
**/tmp/
|
| 145 |
+
**/outputs/skyseg.onnx
|
| 146 |
+
skyseg.onnx
|
| 147 |
+
|
| 148 |
+
# pixi environments
|
| 149 |
+
.pixi
|
| 150 |
+
*.egg-info
|
| 151 |
+
|
| 152 |
+
# Python
|
| 153 |
+
__pycache__/
|
| 154 |
+
*.py[cod]
|
| 155 |
+
*$py.class
|
| 156 |
+
*.so
|
| 157 |
+
.Python
|
| 158 |
+
build/
|
| 159 |
+
develop-eggs/
|
| 160 |
+
dist/
|
| 161 |
+
downloads/
|
| 162 |
+
eggs/
|
| 163 |
+
.eggs/
|
| 164 |
+
lib/
|
| 165 |
+
lib64/
|
| 166 |
+
parts/
|
| 167 |
+
sdist/
|
| 168 |
+
var/
|
| 169 |
+
wheels/
|
| 170 |
+
*.egg-info/
|
| 171 |
+
.installed.cfg
|
| 172 |
+
*.egg
|
| 173 |
+
|
| 174 |
+
# Jupyter Notebook
|
| 175 |
+
.ipynb_checkpoints
|
| 176 |
+
|
| 177 |
+
# Virtual Environment
|
| 178 |
+
venv/
|
| 179 |
+
env/
|
| 180 |
+
ENV/
|
| 181 |
+
|
| 182 |
+
# IDE
|
| 183 |
+
.idea/
|
| 184 |
+
.vscode/
|
| 185 |
+
.cursor/
|
| 186 |
+
.ruff_cache/
|
| 187 |
+
*.swp
|
| 188 |
+
*.swo
|
| 189 |
+
|
| 190 |
+
# DNRM specific
|
| 191 |
+
/datasets/
|
| 192 |
+
outputs/
|
| 193 |
+
third_party/
|
| 194 |
+
visualization/
|
| 195 |
+
checkpoints/
|
| 196 |
+
|
| 197 |
+
# wandb
|
| 198 |
+
wandb/
|
| 199 |
+
|
| 200 |
+
# local configs
|
| 201 |
+
local.yaml
|
packages/dvlt/repo/.pre-commit-config.yaml
ADDED
|
@@ -0,0 +1,32 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
repos:
|
| 2 |
+
- repo: https://github.com/pre-commit/pre-commit-hooks
|
| 3 |
+
rev: v4.5.0
|
| 4 |
+
hooks:
|
| 5 |
+
- id: trailing-whitespace
|
| 6 |
+
- id: end-of-file-fixer
|
| 7 |
+
- id: check-yaml
|
| 8 |
+
- id: check-added-large-files
|
| 9 |
+
|
| 10 |
+
- repo: https://github.com/psf/black
|
| 11 |
+
rev: 25.1.0
|
| 12 |
+
hooks:
|
| 13 |
+
- id: black
|
| 14 |
+
language_version: python3.12
|
| 15 |
+
files: ^(src/|tests/)
|
| 16 |
+
|
| 17 |
+
- repo: https://github.com/astral-sh/ruff-pre-commit
|
| 18 |
+
rev: v0.11.4
|
| 19 |
+
hooks:
|
| 20 |
+
- id: ruff
|
| 21 |
+
args: [--fix, --exit-non-zero-on-fix]
|
| 22 |
+
files: ^(src/|tests/)
|
| 23 |
+
|
| 24 |
+
- repo: local
|
| 25 |
+
hooks:
|
| 26 |
+
- id: pytest-cpu
|
| 27 |
+
name: pytest-cpu-tests
|
| 28 |
+
entry: python tests/run_tests.py -c cpu
|
| 29 |
+
language: system
|
| 30 |
+
pass_filenames: false
|
| 31 |
+
always_run: true
|
| 32 |
+
stages: [pre-commit]
|
packages/dvlt/repo/CONTRIBUTING.md
ADDED
|
@@ -0,0 +1,68 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# Contributing to DVLT
|
| 2 |
+
|
| 3 |
+
We appreciate your interest in contributing to DVLT! This document provides
|
| 4 |
+
guidelines and information for contributors.
|
| 5 |
+
|
| 6 |
+
For development setup, code style, testing, and design overview, see
|
| 7 |
+
[docs/CONTRIB.md](docs/CONTRIB.md).
|
| 8 |
+
|
| 9 |
+
## Signing Your Work
|
| 10 |
+
|
| 11 |
+
We require that all contributors "sign-off" on their commits. This certifies
|
| 12 |
+
that the contribution is your original work, or you have rights to submit it
|
| 13 |
+
under the same license, or a compatible license.
|
| 14 |
+
|
| 15 |
+
Any contribution which contains commits that are not Signed-Off will not be
|
| 16 |
+
accepted.
|
| 17 |
+
|
| 18 |
+
To sign off on a commit you simply use the `--signoff` (or `-s`) option when
|
| 19 |
+
committing your changes:
|
| 20 |
+
|
| 21 |
+
```bash
|
| 22 |
+
$ git commit -s -m "Add cool feature."
|
| 23 |
+
```
|
| 24 |
+
|
| 25 |
+
This will append the following to your commit message:
|
| 26 |
+
|
| 27 |
+
```
|
| 28 |
+
Signed-off-by: Your Name <your@email.com>
|
| 29 |
+
```
|
| 30 |
+
|
| 31 |
+
## Full text of the DCO
|
| 32 |
+
|
| 33 |
+
```
|
| 34 |
+
Developer Certificate of Origin
|
| 35 |
+
Version 1.1
|
| 36 |
+
|
| 37 |
+
Copyright (C) 2004, 2006 The Linux Foundation and its contributors.
|
| 38 |
+
|
| 39 |
+
Everyone is permitted to copy and distribute verbatim copies of this
|
| 40 |
+
license document, but changing it is not allowed.
|
| 41 |
+
|
| 42 |
+
|
| 43 |
+
Developer's Certificate of Origin 1.1
|
| 44 |
+
|
| 45 |
+
By making a contribution to this project, I certify that:
|
| 46 |
+
|
| 47 |
+
(a) The contribution was created in whole or in part by me and I
|
| 48 |
+
have the right to submit it under the open source license
|
| 49 |
+
indicated in the file; or
|
| 50 |
+
|
| 51 |
+
(b) The contribution is based upon previous work that, to the best
|
| 52 |
+
of my knowledge, is covered under an appropriate open source
|
| 53 |
+
license and I have the right under that license to submit that
|
| 54 |
+
work with modifications, whether created in whole or in part
|
| 55 |
+
by me, under the same open source license (unless I am
|
| 56 |
+
permitted to submit under a different license), as indicated
|
| 57 |
+
in the file; or
|
| 58 |
+
|
| 59 |
+
(c) The contribution was provided directly to me by some other
|
| 60 |
+
person who certified (a), (b) or (c) and I have not modified
|
| 61 |
+
it.
|
| 62 |
+
|
| 63 |
+
(d) I understand and agree that this project and the contribution
|
| 64 |
+
are public and that a record of the contribution (including all
|
| 65 |
+
personal information I submit with it, including my sign-off) is
|
| 66 |
+
maintained indefinitely and may be redistributed consistent with
|
| 67 |
+
this project or the open source license(s) involved.
|
| 68 |
+
```
|
packages/dvlt/{LICENSE → repo/LICENSE}
RENAMED
|
File without changes
|
packages/dvlt/{LICENSES → repo/LICENSES}/NVIDIA-LICENSE.txt
RENAMED
|
File without changes
|
packages/dvlt/{LICENSES → repo/LICENSES}/VGGT-LICENSE.txt
RENAMED
|
File without changes
|
packages/dvlt/repo/README.md
ADDED
|
@@ -0,0 +1,262 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
<div align="center">
|
| 2 |
+
<h1>Déjà View: Looping Transformers for Multi-View 3D Reconstruction</h1>
|
| 3 |
+
|
| 4 |
+
<a href="https://research.nvidia.com/labs/dvl/projects/dvlt/"><img src="https://img.shields.io/badge/Project-Page-1f72b1.svg" alt="Project Page"></a>
|
| 5 |
+
<a href="https://arxiv.org/abs/2605.30215"><img src="https://img.shields.io/badge/arXiv-2605.30215-b31b1b.svg" alt="arXiv"></a>
|
| 6 |
+
<a href="https://huggingface.co/nvidia/dvlt"><img src="https://img.shields.io/badge/%F0%9F%A4%97%20Hugging%20Face-Model-yellow" alt="Hugging Face"></a>
|
| 7 |
+
|
| 8 |
+
**[NVIDIA](https://www.nvidia.com/)** **[University of Modena and Reggio Emilia](https://www.unimore.it/it)** **[University of Toronto](https://www.utoronto.ca/)** **[ETH Zurich](https://ethz.ch/)**
|
| 9 |
+
|
| 10 |
+
[Alessandro Burzio*](https://research.nvidia.com/labs/dvl/author/alessandro-burzio/), [Tobias Fischer*](https://tobiasfshr.github.io/), [Sven Elflein](https://selflein.github.io/), [Qunjie Zhou](https://research.nvidia.com/labs/dvl/author/qunjie-zhou/), [Riccardo de Lutio](https://riccardodelutio.github.io/), [Jiawei Ren](https://jiawei-ren.github.io/), [Jiahui Huang](https://huangjh-pub.github.io/), [Shengyu Huang](https://shengyuh.github.io/), [Marc Pollefeys](https://people.inf.ethz.ch/marc.pollefeys/), [Laura Leal-Taixé](https://research.nvidia.com/labs/dvl/author/laura-leal-taixe/), [Zan Gojcic+](https://zgojcic.github.io/), [Haithem Turki+](https://haithemturki.com/)
|
| 11 |
+
</div>
|
| 12 |
+
|
| 13 |
+
<p align="center">
|
| 14 |
+
<img src="assets/nvidia-hq-dvlt.gif" alt="Déjà View demo" width="100%">
|
| 15 |
+
</p>
|
| 16 |
+
|
| 17 |
+
## Overview
|
| 18 |
+
|
| 19 |
+
DéjàView (DVLT) is a recurrent transformer for multi-view 3D reconstruction. It
|
| 20 |
+
loops a shared block of frame/global attention with discrete depth indexing,
|
| 21 |
+
producing per-pixel rays, depth, confidence, and camera poses from an unordered
|
| 22 |
+
set of images. Trained once, the number of refinement steps `K` becomes an
|
| 23 |
+
inference-time compute knob, matching or outperforming substantially larger
|
| 24 |
+
feed-forward baselines at a fraction of their parameters.
|
| 25 |
+
|
| 26 |
+
This repository contains:
|
| 27 |
+
|
| 28 |
+
- The DVLT model + four configurable ablations (vanilla, decoupled blocks,
|
| 29 |
+
no `s_out` token, no depth-scaling).
|
| 30 |
+
- Evaluation wrappers for five baselines: VGGT, VGGT-Omega, Depth-Anything-3,
|
| 31 |
+
MapAnything, and Pi3. Each wrapper imports the upstream package (installed
|
| 32 |
+
separately — see [INSTALL.md](docs/INSTALL.md)).
|
| 33 |
+
- A training stack built on `accelerate` + Hydra, with optional W&B logging.
|
| 34 |
+
- A Stage-2 fine-tune recipe for the depth-conv head.
|
| 35 |
+
- Rerun-based visualization tools.
|
| 36 |
+
|
| 37 |
+
## Release status
|
| 38 |
+
|
| 39 |
+
- [x] Inference code
|
| 40 |
+
- [x] Model weights
|
| 41 |
+
- [x] Evaluation code
|
| 42 |
+
- [x] eval datasets preprocess and loaders
|
| 43 |
+
- [x] Training code
|
| 44 |
+
- [x] ScanNet++ training dataset loader
|
| 45 |
+
- [ ] other training dataset loaders
|
| 46 |
+
|
| 47 |
+
## Quickstart
|
| 48 |
+
|
| 49 |
+
### Install
|
| 50 |
+
|
| 51 |
+
See [docs/INSTALL.md](docs/INSTALL.md). The short version:
|
| 52 |
+
|
| 53 |
+
```bash
|
| 54 |
+
conda create -n dvlt python=3.12 && conda activate dvlt
|
| 55 |
+
conda install pytorch=2.5.1 torchvision pytorch-cuda=12.4 -c pytorch -c nvidia -c conda-forge
|
| 56 |
+
pip install -e .[all]
|
| 57 |
+
```
|
| 58 |
+
|
| 59 |
+
### Quick setup
|
| 60 |
+
|
| 61 |
+
Quick example script:
|
| 62 |
+
|
| 63 |
+
```python
|
| 64 |
+
import torch
|
| 65 |
+
from accelerate import Accelerator
|
| 66 |
+
|
| 67 |
+
from dvlt.model.dvlt.model import DVLT
|
| 68 |
+
from dvlt.util.preprocess import load_sequence, preprocess_images
|
| 69 |
+
|
| 70 |
+
checkpoint_path = "nvidia/dvlt" # local dir, HTTPS URL, or HF Hub repo id
|
| 71 |
+
# load_sequence accepts a directory, a single video, or an explicit list of files.
|
| 72 |
+
input_path = "path/to/scene_dir"
|
| 73 |
+
# Or: input_path = "path/to/clip.mp4"
|
| 74 |
+
# Or: from glob import glob; input_path = sorted(glob("path/to/scene_dir/*.png"))
|
| 75 |
+
|
| 76 |
+
accelerator = Accelerator(mixed_precision="bf16")
|
| 77 |
+
|
| 78 |
+
model = DVLT(img_size=504)
|
| 79 |
+
model.load_pretrained(checkpoint_path, strict=True)
|
| 80 |
+
model.setup_test(accelerator)
|
| 81 |
+
|
| 82 |
+
_, frames = load_sequence(input_path)
|
| 83 |
+
batch = preprocess_images(frames, img_size=504, patch_size=14, device=accelerator.device)
|
| 84 |
+
|
| 85 |
+
with torch.no_grad(), accelerator.autocast():
|
| 86 |
+
predictions = model.predict(batch, accelerator)
|
| 87 |
+
|
| 88 |
+
cameras = predictions["cameras"][0] # Cameras object with shape [S]
|
| 89 |
+
extrinsics_c2w = cameras.camera_to_worlds # (S, 3, 4) — OpenCV convention [R | t]
|
| 90 |
+
intrinsics = cameras.get_intrinsics_matrices() # (S, 3, 3)
|
| 91 |
+
|
| 92 |
+
depths = predictions["depths"][0] # (S, H, W)
|
| 93 |
+
world_points = predictions["world_points"][0] # (S, H, W, 3)
|
| 94 |
+
```
|
| 95 |
+
|
| 96 |
+
### Train
|
| 97 |
+
|
| 98 |
+
```bash
|
| 99 |
+
# Single-GPU
|
| 100 |
+
python -m dvlt.scripts.train --config-name dvlt-large data=scannetpp
|
| 101 |
+
|
| 102 |
+
# Multi-GPU (4 GPUs)
|
| 103 |
+
accelerate launch --num-processes 4 -m dvlt.scripts.train --config-name dvlt-large data=scannetpp
|
| 104 |
+
|
| 105 |
+
# Resume
|
| 106 |
+
python -m dvlt.scripts.train \
|
| 107 |
+
--config-dir=outputs/<run> \
|
| 108 |
+
--config-name=config.yaml \
|
| 109 |
+
trainer.resume_from_checkpoint=latest
|
| 110 |
+
```
|
| 111 |
+
|
| 112 |
+
### Evaluate
|
| 113 |
+
|
| 114 |
+
`benchmark_lite` (DTU, ETH3D, 7Scenes) is a convenience benchmark over the
|
| 115 |
+
datasets that don't require heavy preprocessing; the full `benchmark` adds
|
| 116 |
+
[ScanNet++](src/dvlt/scripts/preprocess/preprocess_scannetpp.md) and
|
| 117 |
+
[NuScenes](src/dvlt/scripts/preprocess/preprocess_nuscenes.md).
|
| 118 |
+
|
| 119 |
+
```bash
|
| 120 |
+
python -m dvlt.scripts.test --config-name dvlt data=benchmark
|
| 121 |
+
# multi-GPU: accelerate launch --num-processes <N> -m dvlt.scripts.test --config-name dvlt data=benchmark
|
| 122 |
+
python -m dvlt.scripts.test --config-name dvlt data=benchmark_lite
|
| 123 |
+
# multi-GPU: accelerate launch --num-processes <N> -m dvlt.scripts.test --config-name dvlt data=benchmark_lite
|
| 124 |
+
```
|
| 125 |
+
|
| 126 |
+
DVLT reference results on the full `benchmark`:
|
| 127 |
+
|
| 128 |
+
| Dataset | Pose AUC@3 | Pose AUC@30 | Depth inlier@3% | Depth AbsRel |
|
| 129 |
+
|---|---|---|---|---|
|
| 130 |
+
| DTU | 0.8319 | 0.9880 | 0.9706 | 0.0093 |
|
| 131 |
+
| ETH3D | 0.6604 | 0.9536 | 0.7717 | 0.0267 |
|
| 132 |
+
| 7Scenes | 0.1393 | 0.8172 | 0.7437 | 0.0349 |
|
| 133 |
+
| ScanNet++ | 0.7941 | 0.9803 | 0.9239 | 0.0167 |
|
| 134 |
+
| NuScenes | 0.4340 | 0.8534 | 0.5853 | 0.0673 |
|
| 135 |
+
|
| 136 |
+
|
| 137 |
+
### Interactive demo
|
| 138 |
+
|
| 139 |
+
Browser UI for uploading images / video and exploring the predicted 3D point
|
| 140 |
+
cloud, depth maps and camera trajectory. The dropdown switches between DVLT
|
| 141 |
+
and the baseline wrappers (VGGT, VGGT-Omega, DA3, Pi3, MapAnything);
|
| 142 |
+
each baseline requires its upstream package installed (see
|
| 143 |
+
[docs/INSTALL.md](docs/INSTALL.md)).
|
| 144 |
+
|
| 145 |
+
```bash
|
| 146 |
+
# Launch on http://localhost:7860 (DVLT preselected)
|
| 147 |
+
python -m dvlt.scripts.gradio_demo
|
| 148 |
+
```
|
| 149 |
+
|
| 150 |
+
The same script also has a headless **offline mode** that skips Gradio
|
| 151 |
+
and writes a `.glb` + `.rrd` per (sequence, model) under
|
| 152 |
+
`demo_outputs/<sequence_name>/`. `--input` accepts a directory of images, a
|
| 153 |
+
single image, or a video file (mp4/mov/gif/...), and may be repeated to
|
| 154 |
+
process multiple sequences in one go; `--models` is a comma-separated list of
|
| 155 |
+
config names from the curated registry (or `all`).
|
| 156 |
+
|
| 157 |
+
```bash
|
| 158 |
+
# Run two models on two sequences (one image dir, one video)
|
| 159 |
+
python -m dvlt.scripts.gradio_demo --offline \
|
| 160 |
+
--input /path/to/scene_dir \
|
| 161 |
+
--input /path/to/clip.mp4 \
|
| 162 |
+
--models dvlt
|
| 163 |
+
|
| 164 |
+
# Run every registered model on one sequence
|
| 165 |
+
python -m dvlt.scripts.gradio_demo --offline --input /path/to/scene_dir --models all
|
| 166 |
+
```
|
| 167 |
+
|
| 168 |
+
## Configuration
|
| 169 |
+
|
| 170 |
+
DVLT uses [Hydra](https://hydra.cc) for configuration. Top-level experiment
|
| 171 |
+
configs live in `src/dvlt/config/experiments/`:
|
| 172 |
+
|
| 173 |
+
| Config | Description |
|
| 174 |
+
|---|---|
|
| 175 |
+
| `dvlt-large` | Stage-1 recipe (large model, full training schedule, linear depth head). |
|
| 176 |
+
| `dvlt-large-ablation` | Vanilla ablation parent — toggle decoupled blocks, no-`s_out`, no-depthscale via overrides. |
|
| 177 |
+
| `dvlt-large-ablation-decoupled` | Fully decoupled blocks (`recurrence_mode=none`, no looping): a distinct block per step, fixed 16 steps. |
|
| 178 |
+
| `dvlt-large-depthconv-stage2` | Stage-2 depth-conv head fine-tune (matches the released checkpoint and the model's default `depth_head_type="conv"`). |
|
| 179 |
+
| `dvlt` | Inference-only alias for the released stage-2 checkpoint. |
|
| 180 |
+
| `vggt`, `vggt_omega`, `da3-{base,large,giant}`, `pi3`, `pi3x`, `mapanything` | Eval-only baseline wrappers. Require the upstream package installed (see [INSTALL.md](docs/INSTALL.md)). |
|
| 181 |
+
|
| 182 |
+
### User configuration (data paths)
|
| 183 |
+
|
| 184 |
+
Per-user settings (most importantly, the dataset root) live in
|
| 185 |
+
`src/dvlt/config/experiments/user/`. Copy `default.yaml` to `local.yaml`,
|
| 186 |
+
edit `data_root`, and select it via `user=local`:
|
| 187 |
+
|
| 188 |
+
```bash
|
| 189 |
+
python -m dvlt.scripts.train --config-name dvlt-large data=scannetpp user=local
|
| 190 |
+
```
|
| 191 |
+
|
| 192 |
+
`user.data_root` can also be overridden inline or via the `DVLT_DATA_ROOT`
|
| 193 |
+
environment variable.
|
| 194 |
+
|
| 195 |
+
### Selecting datasets
|
| 196 |
+
|
| 197 |
+
Pick a single curated dataset config:
|
| 198 |
+
|
| 199 |
+
```bash
|
| 200 |
+
python -m dvlt.scripts.train --config-name dvlt-large data=scannetpp
|
| 201 |
+
python -m dvlt.scripts.train --config-name dvlt-large data=mixed_all
|
| 202 |
+
```
|
| 203 |
+
|
| 204 |
+
## Tab completion
|
| 205 |
+
|
| 206 |
+
For scripts using the `@cli` decorator (train, test, visualize):
|
| 207 |
+
|
| 208 |
+
```bash
|
| 209 |
+
eval "$(python -m dvlt.scripts.train -sc install)"
|
| 210 |
+
# later, to remove:
|
| 211 |
+
eval "$(python -m dvlt.scripts.train -sc uninstall)"
|
| 212 |
+
```
|
| 213 |
+
|
| 214 |
+
## Documentation
|
| 215 |
+
|
| 216 |
+
- [docs/INSTALL.md](docs/INSTALL.md) — environment setup + baseline installs
|
| 217 |
+
- [docs/data/DATA.md](docs/data/DATA.md) — data pipeline overview + how to
|
| 218 |
+
add a new dataset parser
|
| 219 |
+
- [docs/CONTRIB.md](docs/CONTRIB.md) — dev setup, code style, tests
|
| 220 |
+
- [docs/TESTING.md](docs/TESTING.md) — full test-runner documentation
|
| 221 |
+
|
| 222 |
+
## Acknowledgments
|
| 223 |
+
|
| 224 |
+
We are also grateful to several other open-source repositories that we drew inspiration from or built upon during the development of our pipeline:
|
| 225 |
+
- [VGGT](https://github.com/facebookresearch/vggt)
|
| 226 |
+
- [Pi3](https://github.com/yyfz/Pi3)
|
| 227 |
+
- [CUT3R](https://github.com/CUT3R/CUT3R)
|
| 228 |
+
- [MapAnything](https://github.com/facebookresearch/map-anything)
|
| 229 |
+
- [Depth-Anything-3](https://github.com/bytedance-seed/depth-anything-3)
|
| 230 |
+
|
| 231 |
+
## Citation
|
| 232 |
+
|
| 233 |
+
If you find this work useful, please cite:
|
| 234 |
+
|
| 235 |
+
```bibtex
|
| 236 |
+
@article{burzio2026dejaview,
|
| 237 |
+
title = {D\'ej\`a View: Looping Transformers for Multi-View 3D Reconstruction},
|
| 238 |
+
author = {Burzio, Alessandro and Fischer, Tobias and Elflein, Sven and Zhou, Qunjie and de Lutio, Riccardo and Ren, Jiawei and Huang, Jiahui and Huang, Shengyu and Pollefeys, Marc and Leal-Taix{\'e}, Laura and Gojcic, Zan and Turki, Haithem},
|
| 239 |
+
journal = {arXiv preprint arXiv:2605.30215},
|
| 240 |
+
year = {2026}
|
| 241 |
+
}
|
| 242 |
+
```
|
| 243 |
+
|
| 244 |
+
## License + attribution
|
| 245 |
+
|
| 246 |
+
The DVLT **code** is released under the **Apache License, Version 2.0** — see
|
| 247 |
+
[LICENSE](LICENSE). The **model weights** (the `nvidia/dvlt` checkpoint) are
|
| 248 |
+
released under the **NVIDIA License** — non-commercial, research-and-evaluation
|
| 249 |
+
use only; see [LICENSES/NVIDIA-LICENSE.txt](LICENSES/NVIDIA-LICENSE.txt).
|
| 250 |
+
|
| 251 |
+
Portions of the codebase are adapted from third-party open-source projects
|
| 252 |
+
(DINOv2, PyTorch3D, MoGe, AnyCalib, MultiNeRF, Depth-Anything-3, VGGT). Each
|
| 253 |
+
adapted file carries the upstream copyright + license notice in its header;
|
| 254 |
+
see [THIRD_PARTY_LICENSES.md](THIRD_PARTY_LICENSES.md) for the full attribution
|
| 255 |
+
map and full upstream license texts. The VGGT-derived files are distributed
|
| 256 |
+
under the VGGT License; see [LICENSES/VGGT-LICENSE.txt](LICENSES/VGGT-LICENSE.txt).
|
| 257 |
+
|
| 258 |
+
The baseline evaluation wrappers in `src/dvlt/model/{vggt,vggt_omega,da3,mapanything,pi3}/`
|
| 259 |
+
import (do not vendor) their respective upstream packages, each of which is
|
| 260 |
+
governed by its own license — see
|
| 261 |
+
[THIRD_PARTY_LICENSES.md](THIRD_PARTY_LICENSES.md) §"Upstream packages used
|
| 262 |
+
for evaluation".
|
packages/dvlt/{THIRD_PARTY_LICENSES.md → repo/THIRD_PARTY_LICENSES.md}
RENAMED
|
File without changes
|
packages/dvlt/repo/assets/nvidia-hq-dvlt.gif
ADDED
|
Git LFS Details
|
packages/dvlt/repo/docs/CONTRIB.md
ADDED
|
@@ -0,0 +1,97 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# Contribution guidelines
|
| 2 |
+
|
| 3 |
+
If you contribute to the codebase, please follow these steps
|
| 4 |
+
|
| 5 |
+
|
| 6 |
+
## Development Setup
|
| 7 |
+
|
| 8 |
+
If you're contributing to the codebase, we recommend installing the development dependencies and setting up pre-commit hooks:
|
| 9 |
+
|
| 10 |
+
```bash
|
| 11 |
+
# Install development dependencies
|
| 12 |
+
pip install -e .[dev]
|
| 13 |
+
|
| 14 |
+
# Install pre-commit hooks
|
| 15 |
+
pip install pre-commit
|
| 16 |
+
pre-commit install
|
| 17 |
+
```
|
| 18 |
+
|
| 19 |
+
### Code Style
|
| 20 |
+
|
| 21 |
+
This project uses:
|
| 22 |
+
- Black for code formatting
|
| 23 |
+
- Ruff for linting and import sorting
|
| 24 |
+
- Google-style docstrings
|
| 25 |
+
|
| 26 |
+
You can manually run the formatters:
|
| 27 |
+
```bash
|
| 28 |
+
# Format code with Black
|
| 29 |
+
black src tests
|
| 30 |
+
|
| 31 |
+
# Run Ruff linter and auto-fix Ruff violations where possible
|
| 32 |
+
ruff check --fix src tests
|
| 33 |
+
```
|
| 34 |
+
|
| 35 |
+
### Running Tests
|
| 36 |
+
|
| 37 |
+
The project has a comprehensive test suite with smart hardware detection. For quick development feedback:
|
| 38 |
+
|
| 39 |
+
```bash
|
| 40 |
+
# Fast CPU-only tests (recommended for development)
|
| 41 |
+
python tests/run_tests.py --category cpu
|
| 42 |
+
|
| 43 |
+
# All tests appropriate for your hardware
|
| 44 |
+
python tests/run_tests.py
|
| 45 |
+
|
| 46 |
+
# Run specific test categories
|
| 47 |
+
python tests/run_tests.py --category cpu # CPU-only tests (fast, no GPU required)
|
| 48 |
+
python tests/run_tests.py --category gpu # GPU tests (single GPU, not integration)
|
| 49 |
+
python tests/run_tests.py --category integration # Integration tests (requires GPU for performance)
|
| 50 |
+
python tests/run_tests.py --category distributed # Distributed tests (requires accelerate launch)
|
| 51 |
+
python tests/run_tests.py --category slow # Slow/comprehensive tests
|
| 52 |
+
|
| 53 |
+
# List all available test categories
|
| 54 |
+
python tests/run_tests.py --list
|
| 55 |
+
```
|
| 56 |
+
|
| 57 |
+
For direct pytest usage:
|
| 58 |
+
```bash
|
| 59 |
+
# Run all tests (NOTE: Cannot run distributed tests)
|
| 60 |
+
pytest
|
| 61 |
+
|
| 62 |
+
# Run specific test file
|
| 63 |
+
pytest tests/path/to/test_file.py
|
| 64 |
+
```
|
| 65 |
+
|
| 66 |
+
See [docs/TESTING.md](TESTING.md) for comprehensive testing documentation.
|
| 67 |
+
|
| 68 |
+
The pre-commit hooks automatically run fast tests before each commit to ensure code quality.
|
| 69 |
+
|
| 70 |
+
## Sanity Check Mode
|
| 71 |
+
|
| 72 |
+
For quick development testing of training functionality, use the built-in sanity check mode (with your desired config):
|
| 73 |
+
|
| 74 |
+
```bash
|
| 75 |
+
# Instead of long training runs for testing
|
| 76 |
+
python -m dvlt.scripts.train --config-name dvlt-large.yaml trainer.sanity_check=True
|
| 77 |
+
```
|
| 78 |
+
|
| 79 |
+
This mode:
|
| 80 |
+
- **Tests all key functions**: train_step, test_step, log_train, log_test, model saving
|
| 81 |
+
- **Uses temporary directories**: No persistent output clutter
|
| 82 |
+
- **Mock loggers**: Prints logged keys/types instead of creating wandb runs
|
| 83 |
+
- **Fast execution**: Runs 11 training steps + 2 validation batches (~1-2 minutes)
|
| 84 |
+
- **Auto cleanup**: Removes temporary files when complete
|
| 85 |
+
|
| 86 |
+
Automatically overrides settings to:
|
| 87 |
+
- `max_train_steps=11`, `validation_steps=11`, `validation_batches=2`
|
| 88 |
+
- `log_every_n_steps=1`
|
| 89 |
+
|
| 90 |
+
|
| 91 |
+
## Design
|
| 92 |
+
|
| 93 |
+
Check [DATA.md](docs/data/DATA.md) for an overview of the data pipeline flow. We explain there:
|
| 94 |
+
|
| 95 |
+
- How to add new parsers for arbitrary new datasets
|
| 96 |
+
- How to maintain and extend the data preprocessing code
|
| 97 |
+
- What batch format the model will be fed during training and evaluation
|
packages/dvlt/repo/docs/INSTALL.md
ADDED
|
@@ -0,0 +1,74 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# Installation
|
| 2 |
+
|
| 3 |
+
Tested with **Python 3.11**, **PyTorch 2.5.1**, and **CUDA 12.4** on Linux.
|
| 4 |
+
|
| 5 |
+
```bash
|
| 6 |
+
conda create -n dvlt python=3.11 && conda activate dvlt
|
| 7 |
+
conda install pytorch=2.5.1 torchvision pytorch-cuda=12.4 -c pytorch -c nvidia -c conda-forge
|
| 8 |
+
|
| 9 |
+
git clone <YOUR-DVLT-REMOTE>.git dvlt && cd dvlt
|
| 10 |
+
pip install -e .[all]
|
| 11 |
+
```
|
| 12 |
+
|
| 13 |
+
Extras (pick what you need): `pip install -e .[demos|dev|all]`
|
| 14 |
+
|
| 15 |
+
- `demos` — Gradio demos (`gradio`, `onnxruntime-gpu`, `trimesh`)
|
| 16 |
+
- `dev` — `black`, `ruff`, `pre-commit`, `pytest`
|
| 17 |
+
- `all` — both
|
| 18 |
+
|
| 19 |
+
## Baselines (optional)
|
| 20 |
+
|
| 21 |
+
The baseline wrappers in `src/dvlt/model/{vggt,vggt_omega,da3,mapanything,pi3}/`
|
| 22 |
+
import the upstream packages at runtime. Install only the ones you plan to
|
| 23 |
+
evaluate:
|
| 24 |
+
|
| 25 |
+
```bash
|
| 26 |
+
# VGGT — code: commercial-use-friendly; checkpoints: original
|
| 27 |
+
# is non-commercial, VGGT-1B-Commercial allows commercial use. See upstream LICENSE.
|
| 28 |
+
pip install git+https://github.com/facebookresearch/vggt.git --no-deps
|
| 29 |
+
|
| 30 |
+
# VGGT-Omega — FAIR Noncommercial Research License (non-commercial / research-only;
|
| 31 |
+
# applies to both code and checkpoints). See upstream LICENSE.
|
| 32 |
+
pip install git+https://github.com/facebookresearch/vggt-omega.git --no-deps
|
| 33 |
+
|
| 34 |
+
# Depth-Anything-3 — Apache-2.0
|
| 35 |
+
pip install git+https://github.com/ByteDance-Seed/Depth-Anything-3.git --no-deps
|
| 36 |
+
|
| 37 |
+
# MapAnything — Apache-2.0
|
| 38 |
+
pip install git+https://github.com/facebookresearch/map-anything.git --no-deps
|
| 39 |
+
pip install uniception==0.1.6
|
| 40 |
+
|
| 41 |
+
# Pi3 / Pi3X — BSD-3-Clause (clone into third_party/Pi3 first)
|
| 42 |
+
git clone https://github.com/<pi3-upstream>/Pi3.git third_party/Pi3
|
| 43 |
+
pip install -e third_party/Pi3 --no-deps
|
| 44 |
+
```
|
| 45 |
+
|
| 46 |
+
See [THIRD_PARTY_LICENSES.md](../THIRD_PARTY_LICENSES.md) §"Upstream packages
|
| 47 |
+
used for evaluation" for license details — verify each upstream's terms suit
|
| 48 |
+
your use case before installing.
|
| 49 |
+
|
| 50 |
+
## Data backend (`dataverse`)
|
| 51 |
+
|
| 52 |
+
DVLT's dataset parsers depend on the `dataverse` package.
|
| 53 |
+
|
| 54 |
+
```bash
|
| 55 |
+
git clone <YOUR-DATAVERSE-REMOTE>.git third_party/dataverse
|
| 56 |
+
pip install -e third_party/dataverse
|
| 57 |
+
```
|
| 58 |
+
|
| 59 |
+
Some datasets need extra dependencies — install the matching extras as needed,
|
| 60 |
+
for example:
|
| 61 |
+
|
| 62 |
+
```bash
|
| 63 |
+
pip install -e 'third_party/dataverse[kubric]'
|
| 64 |
+
```
|
| 65 |
+
|
| 66 |
+
The Gradio demos and `dvlt.scripts.visualize` work without `dataverse`; the
|
| 67 |
+
full training stack does not.
|
| 68 |
+
|
| 69 |
+
## Sanity check
|
| 70 |
+
|
| 71 |
+
```bash
|
| 72 |
+
python -c "import dvlt; print('dvlt OK')"
|
| 73 |
+
pytest -q tests/data/datasets/
|
| 74 |
+
```
|
packages/dvlt/repo/docs/TESTING.md
ADDED
|
@@ -0,0 +1,134 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# Testing Guide
|
| 2 |
+
|
| 3 |
+
## 🚀 Quick Start
|
| 4 |
+
|
| 5 |
+
```bash
|
| 6 |
+
# Run all appropriate tests for your hardware (default)
|
| 7 |
+
python tests/run_tests.py
|
| 8 |
+
|
| 9 |
+
# Run specific categories
|
| 10 |
+
python tests/run_tests.py -c cpu # CPU tests only
|
| 11 |
+
python tests/run_tests.py -c gpu # GPU tests (requires CUDA)
|
| 12 |
+
python tests/run_tests.py -c integration # Integration tests (requires GPU)
|
| 13 |
+
python tests/run_tests.py -c distributed # Distributed tests (requires multiple GPUs)
|
| 14 |
+
|
| 15 |
+
# See all available categories
|
| 16 |
+
python tests/run_tests.py --list
|
| 17 |
+
```
|
| 18 |
+
|
| 19 |
+
## 📋 Test Categories
|
| 20 |
+
|
| 21 |
+
The system uses **explicit pytest markers** to categorize tests:
|
| 22 |
+
|
| 23 |
+
### Available Categories
|
| 24 |
+
|
| 25 |
+
| Category | Command | Marker Required | Hardware | Description |
|
| 26 |
+
|----------|---------|----------------|----------|-------------|
|
| 27 |
+
| **cpu** | `pytest tests/ -m "not gpu and not distributed and not slow and not integration"` | None | Any CPU | Fast CPU-only tests |
|
| 28 |
+
| **gpu** | `pytest tests/ -m "gpu and not distributed and not integration"` | `@pytest.mark.gpu` | NVIDIA GPU | GPU tests (excluding integration) |
|
| 29 |
+
| **integration** | `pytest tests/ -m "integration and not distributed"` | `@pytest.mark.integration` | NVIDIA GPU | End-to-end tests |
|
| 30 |
+
| **slow** | `pytest tests/ -m "slow"` | `@pytest.mark.slow` | Varies | Time-intensive tests |
|
| 31 |
+
| **distributed** | `accelerate launch --num_processes 2 -m pytest tests/ -m "distributed"` | `@pytest.mark.distributed` | 2+ GPUs | Multi-GPU tests |
|
| 32 |
+
|
| 33 |
+
### Default Behavior (Intelligent Hardware Detection)
|
| 34 |
+
|
| 35 |
+
When no category is specified, the system automatically runs appropriate tests:
|
| 36 |
+
- **CPU only**: Runs CPU tests
|
| 37 |
+
- **Single GPU**: Runs CPU + GPU + Integration tests
|
| 38 |
+
- **Multiple GPUs**: Runs All tests including Distributed
|
| 39 |
+
|
| 40 |
+
## 🎯 Test Markers
|
| 41 |
+
|
| 42 |
+
### Required Markers for Non-CPU Tests
|
| 43 |
+
|
| 44 |
+
```python
|
| 45 |
+
# CPU test (no marker needed - default)
|
| 46 |
+
def test_utility_function():
|
| 47 |
+
"""Fast CPU-only test."""
|
| 48 |
+
pass
|
| 49 |
+
|
| 50 |
+
# GPU test
|
| 51 |
+
@pytest.mark.gpu
|
| 52 |
+
def test_device_computation():
|
| 53 |
+
"""Test requiring GPU acceleration."""
|
| 54 |
+
pass
|
| 55 |
+
|
| 56 |
+
# Integration test (requires GPU for performance)
|
| 57 |
+
@pytest.mark.integration
|
| 58 |
+
def test_training_pipeline():
|
| 59 |
+
"""End-to-end integration test."""
|
| 60 |
+
pass
|
| 61 |
+
|
| 62 |
+
# Distributed test
|
| 63 |
+
@pytest.mark.distributed
|
| 64 |
+
def test_multi_process_sync():
|
| 65 |
+
"""Test requiring multiple GPUs with accelerate launch."""
|
| 66 |
+
pass
|
| 67 |
+
|
| 68 |
+
# Slow test
|
| 69 |
+
@pytest.mark.slow
|
| 70 |
+
def test_comprehensive_scenario():
|
| 71 |
+
"""Time-intensive comprehensive test."""
|
| 72 |
+
pass
|
| 73 |
+
```
|
| 74 |
+
|
| 75 |
+
## 🚀 Development Workflow
|
| 76 |
+
|
| 77 |
+
**Recommended testing order:**
|
| 78 |
+
1. **Development**: `python tests/run_tests.py -c cpu` (fast feedback)
|
| 79 |
+
2. **Feature Testing**: `python tests/run_tests.py -c gpu` (when GPU available)
|
| 80 |
+
3. **Integration**: `python tests/run_tests.py -c integration` (end-to-end validation)
|
| 81 |
+
4. **Full Testing**: `python tests/run_tests.py` (all appropriate tests)
|
| 82 |
+
|
| 83 |
+
## 📝 Adding New Tests
|
| 84 |
+
|
| 85 |
+
**Choose appropriate marker:**
|
| 86 |
+
- No marker = CPU test (default)
|
| 87 |
+
- `@pytest.mark.gpu` = GPU required
|
| 88 |
+
- `@pytest.mark.integration` = End-to-end test (GPU needed for performance)
|
| 89 |
+
- `@pytest.mark.distributed` = Multi-GPU test
|
| 90 |
+
- `@pytest.mark.slow` = Time-intensive test
|
| 91 |
+
|
| 92 |
+
**Verify categorization:**
|
| 93 |
+
```bash
|
| 94 |
+
# Test your specific function
|
| 95 |
+
pytest tests/path/to/test_file.py::test_function_name -v
|
| 96 |
+
|
| 97 |
+
# Run the expected category
|
| 98 |
+
python tests/run_tests.py -c [expected_category]
|
| 99 |
+
```
|
| 100 |
+
|
| 101 |
+
## 📊 Example Test Structure
|
| 102 |
+
|
| 103 |
+
```python
|
| 104 |
+
import pytest
|
| 105 |
+
import torch
|
| 106 |
+
from src.dvlt.model.base import BaseModel
|
| 107 |
+
|
| 108 |
+
# CPU test (no marker)
|
| 109 |
+
def test_model_initialization():
|
| 110 |
+
model = BaseModel()
|
| 111 |
+
assert model is not None
|
| 112 |
+
|
| 113 |
+
# GPU test
|
| 114 |
+
@pytest.mark.gpu
|
| 115 |
+
def test_model_cuda_operations():
|
| 116 |
+
if not torch.cuda.is_available():
|
| 117 |
+
pytest.skip("CUDA not available")
|
| 118 |
+
model = BaseModel().cuda()
|
| 119 |
+
x = torch.randn(1, 3, 224, 224).cuda()
|
| 120 |
+
output = model(x)
|
| 121 |
+
assert output.device.type == 'cuda'
|
| 122 |
+
|
| 123 |
+
# Integration test
|
| 124 |
+
@pytest.mark.integration
|
| 125 |
+
def test_training_integration():
|
| 126 |
+
# ... comprehensive training test
|
| 127 |
+
pass
|
| 128 |
+
|
| 129 |
+
# Distributed test
|
| 130 |
+
@pytest.mark.distributed
|
| 131 |
+
def test_multi_gpu_training():
|
| 132 |
+
# ... distributed training test
|
| 133 |
+
pass
|
| 134 |
+
```
|
packages/dvlt/repo/docs/data/DATA.md
ADDED
|
@@ -0,0 +1,138 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# Dataset Preparation
|
| 2 |
+
|
| 3 |
+
All dataset paths are resolved from a single config variable, `user.data_root`.
|
| 4 |
+
It defaults to `<project root>/datasets`, and can be overridden with the CLI
|
| 5 |
+
flag `user.data_root=/path/to/data`. The per-dataset configs under
|
| 6 |
+
[`src/dvlt/config/experiments/data/`](../../src/dvlt/config/experiments/data/)
|
| 7 |
+
read from `${user.data_root}/{train,test}/<dataset>`.
|
| 8 |
+
|
| 9 |
+
Supported datasets and per-dataset preparation:
|
| 10 |
+
|
| 11 |
+
| Dataset | Use | Preparation | Config |
|
| 12 |
+
|---|---|---|---|
|
| 13 |
+
| DTU | eval | download only (Spann3R mvsnet, see below) | [`dtu.yaml`](../../src/dvlt/config/experiments/data/test_datasets/dtu.yaml) |
|
| 14 |
+
| ETH3D | eval | [`preprocess_eth3d.md`](../../src/dvlt/scripts/preprocess/preprocess_eth3d.md) | [`eth3d.yaml`](../../src/dvlt/config/experiments/data/test_datasets/eth3d.yaml) |
|
| 15 |
+
| 7Scenes | eval | [`preprocess_7scenes.md`](../../src/dvlt/scripts/preprocess/preprocess_7scenes.md) | [`sevenscenes.yaml`](../../src/dvlt/config/experiments/data/test_datasets/sevenscenes.yaml) |
|
| 16 |
+
| NuScenes | eval | [`preprocess_nuscenes.md`](../../src/dvlt/scripts/preprocess/preprocess_nuscenes.md) | [`nuscenes.yaml`](../../src/dvlt/config/experiments/data/test_datasets/nuscenes.yaml) |
|
| 17 |
+
| ScanNet++ | train + eval | [`preprocess_scannetpp.md`](../../src/dvlt/scripts/preprocess/preprocess_scannetpp.md) | [`scannetpp.yaml`](../../src/dvlt/config/experiments/data/test_datasets/scannetpp.yaml) |
|
| 18 |
+
|
| 19 |
+
Preprocessing scripts live under
|
| 20 |
+
[`src/dvlt/scripts/preprocess/`](../../src/dvlt/scripts/preprocess/) and are run
|
| 21 |
+
as modules, e.g. `python -m dvlt.scripts.preprocess.<dataset>.<script>`. See the
|
| 22 |
+
per-dataset docs above for download + preprocessing details.
|
| 23 |
+
|
| 24 |
+
---
|
| 25 |
+
|
| 26 |
+
## DTU (evaluation, download only)
|
| 27 |
+
|
| 28 |
+
Follow Spann3R for DTU download (mvsnet preprocessed):
|
| 29 |
+
<https://github.com/HengyiWang/spann3r/blob/main/docs/data_preprocess.md#dtu>
|
| 30 |
+
|
| 31 |
+
Expected layout, one directory per scan, placed under `${user.data_root}/test/dtu`:
|
| 32 |
+
|
| 33 |
+
```text
|
| 34 |
+
test/dtu/
|
| 35 |
+
└── scanN/
|
| 36 |
+
├── images/{00000000.jpg, 00000001.jpg, ...}
|
| 37 |
+
├── cams/{00000000_cam.txt, ...} # MVSnet camera format (world-to-camera)
|
| 38 |
+
├── depths/{00000000.npy, ...} # depth in millimetres
|
| 39 |
+
└── binary_masks/{00000000.png, ...} # foreground masks
|
| 40 |
+
```
|
| 41 |
+
|
| 42 |
+
Consumed by [`test_datasets/dtu.yaml`](../../src/dvlt/config/experiments/data/test_datasets/dtu.yaml)
|
| 43 |
+
(`DTU`).
|
| 44 |
+
|
| 45 |
+
---
|
| 46 |
+
|
| 47 |
+
## ETH3D (evaluation)
|
| 48 |
+
|
| 49 |
+
High-resolution multi-view benchmark. Download the undistorted DSLR images +
|
| 50 |
+
calibration and the GT depth, then undistort the distorted GT depth onto the
|
| 51 |
+
pinhole cameras. Lands under `${user.data_root}/test/eth3d`.
|
| 52 |
+
|
| 53 |
+
See [`preprocess_eth3d.md`](../../src/dvlt/scripts/preprocess/preprocess_eth3d.md)
|
| 54 |
+
for download + preprocessing. Consumed by
|
| 55 |
+
[`test_datasets/eth3d.yaml`](../../src/dvlt/config/experiments/data/test_datasets/eth3d.yaml).
|
| 56 |
+
|
| 57 |
+
---
|
| 58 |
+
|
| 59 |
+
## 7Scenes (evaluation)
|
| 60 |
+
|
| 61 |
+
Microsoft 7-Scenes RGB-D (640×480). Download the seven scenes and generate the
|
| 62 |
+
projected pseudo-GT depth (via SimpleRecon). Lands under
|
| 63 |
+
`${user.data_root}/test/sevenscenes`. Intrinsics are fixed (focal 525, principal
|
| 64 |
+
point at image centre).
|
| 65 |
+
|
| 66 |
+
See [`preprocess_7scenes.md`](../../src/dvlt/scripts/preprocess/preprocess_7scenes.md)
|
| 67 |
+
for download + preprocessing. Consumed by
|
| 68 |
+
[`test_datasets/sevenscenes.yaml`](../../src/dvlt/config/experiments/data/test_datasets/sevenscenes.yaml).
|
| 69 |
+
|
| 70 |
+
---
|
| 71 |
+
|
| 72 |
+
## NuScenes (evaluation)
|
| 73 |
+
|
| 74 |
+
Autonomous-driving dataset. Download **v1.0-trainval** (contains the 50 eval
|
| 75 |
+
scenes) and convert to one `scene.h5` per scene (CAM_FRONT images, sparse LiDAR
|
| 76 |
+
depth, camera extrinsics + intrinsics). Lands under
|
| 77 |
+
`${user.data_root}/test/nuscenes/trainval/<scene>/scene.h5`.
|
| 78 |
+
|
| 79 |
+
See [`preprocess_nuscenes.md`](../../src/dvlt/scripts/preprocess/preprocess_nuscenes.md)
|
| 80 |
+
for download + preprocessing. Consumed by
|
| 81 |
+
[`test_datasets/nuscenes.yaml`](../../src/dvlt/config/experiments/data/test_datasets/nuscenes.yaml).
|
| 82 |
+
|
| 83 |
+
---
|
| 84 |
+
|
| 85 |
+
## ScanNet++ (training + evaluation)
|
| 86 |
+
|
| 87 |
+
Indoor DSLR captures. Render per-frame metric depth from the aligned GT mesh and
|
| 88 |
+
rectify the fisheye images/depth to a pinhole model. The train split
|
| 89 |
+
(`nvs_sem_train`) lands under `${user.data_root}/train/scannetpp`, the eval split
|
| 90 |
+
(`nvs_sem_val`) under `${user.data_root}/test/scannetpp`.
|
| 91 |
+
|
| 92 |
+
See [`preprocess_scannetpp.md`](../../src/dvlt/scripts/preprocess/preprocess_scannetpp.md)
|
| 93 |
+
for download + preprocessing. Consumed by
|
| 94 |
+
[`train_datasets/scannetpp.yaml`](../../src/dvlt/config/experiments/data/train_datasets/scannetpp.yaml)
|
| 95 |
+
and
|
| 96 |
+
[`test_datasets/scannetpp.yaml`](../../src/dvlt/config/experiments/data/test_datasets/scannetpp.yaml).
|
| 97 |
+
|
| 98 |
+
---
|
| 99 |
+
|
| 100 |
+
## Training datasets
|
| 101 |
+
|
| 102 |
+
Only **ScanNet++** is included as a runnable training dataset in this release.
|
| 103 |
+
The other training-dataset configs under
|
| 104 |
+
[`train_datasets/`](../../src/dvlt/config/experiments/data/train_datasets/) are
|
| 105 |
+
kept so that the per-dataset frame/view-sampling configuration stays visible
|
| 106 |
+
(`view_ranking`, `view_sampling`, `window_size_ratio`, `max_depth_thresh`,
|
| 107 |
+
etc.), but their loaders and preprocess scripts are WIP.
|
| 108 |
+
|
| 109 |
+
---
|
| 110 |
+
|
| 111 |
+
## Data pipeline (overview)
|
| 112 |
+
|
| 113 |
+
Parsers convert dataset-specific formats into a unified representation in three
|
| 114 |
+
stages:
|
| 115 |
+
|
| 116 |
+
1. **Parse + per-frame preprocess** - `TrainDataset.get_data()` (training) or
|
| 117 |
+
`EvalDataset.__getitem__()` (eval): sample frames, read raw data, then
|
| 118 |
+
resize/crop each frame and update intrinsics/depth/world-points accordingly.
|
| 119 |
+
Output: per-frame numpy arrays.
|
| 120 |
+
2. **Sequence-level processing** - `MultiSourceDataset._build_sample()`: color
|
| 121 |
+
augmentations (training), scene normalization (centre + scale factor), and
|
| 122 |
+
conversion to PyTorch tensors.
|
| 123 |
+
3. **Batch assembly** - `default_collate_fn()`: stack samples into a batch with
|
| 124 |
+
field-specific padding.
|
| 125 |
+
|
| 126 |
+
The batched sample the model consumes (keys are `DataField`s):
|
| 127 |
+
|
| 128 |
+
```python
|
| 129 |
+
{
|
| 130 |
+
DataField.IMAGES: torch.Tensor, # [B, S, C, H, W], float32, [0,1]
|
| 131 |
+
DataField.DEPTHS: torch.Tensor, # [B, S, H, W], float32
|
| 132 |
+
DataField.EXTRINSICS_C2W:torch.Tensor, # [B, S, 4, 4], float32 (normalized)
|
| 133 |
+
DataField.INTRINSICS: torch.Tensor, # [B, S, 3, 3], float32
|
| 134 |
+
DataField.WORLD_POINTS: torch.Tensor, # [B, S, H, W, 3], float32 (normalized)
|
| 135 |
+
DataField.POINT_MASKS: torch.Tensor, # [B, S, H, W], bool
|
| 136 |
+
DataField.SCALE_FACTOR: torch.Tensor, # [B], float32
|
| 137 |
+
}
|
| 138 |
+
```
|
packages/dvlt/{pyproject.toml → repo/pyproject.toml}
RENAMED
|
@@ -3,7 +3,7 @@ name = "dvlt"
|
|
| 3 |
version = "0.0.1"
|
| 4 |
description = "Déjà View: Looping Transformers for Multi-View 3D Reconstruction"
|
| 5 |
readme = "README.md"
|
| 6 |
-
requires-python = ">= 3.
|
| 7 |
license = { file = "LICENSE" }
|
| 8 |
authors = [
|
| 9 |
{name = "Tobias Fischer", email = "tobiasfischer623@gmail.com"},
|
|
@@ -24,17 +24,17 @@ dependencies = [
|
|
| 24 |
# core
|
| 25 |
"accelerate==1.8.1",
|
| 26 |
"h5py==3.16.0",
|
| 27 |
-
"huggingface-hub
|
| 28 |
"hydra-core==1.3.2",
|
| 29 |
"numpy==2.4.4",
|
| 30 |
"omegaconf==2.3.0",
|
| 31 |
"opencv-python==4.11.0.86",
|
| 32 |
"Pillow==11.2.1",
|
| 33 |
-
"pydantic=
|
| 34 |
"safetensors==0.5.3",
|
| 35 |
"scipy==1.16.0",
|
| 36 |
-
"torch>=2.5
|
| 37 |
-
"torchvision>=0.20
|
| 38 |
"tqdm==4.67.1",
|
| 39 |
# logging + console
|
| 40 |
"rich==14.3.3",
|
|
@@ -50,6 +50,7 @@ dependencies = [
|
|
| 50 |
|
| 51 |
[project.optional-dependencies]
|
| 52 |
demos = [
|
|
|
|
| 53 |
"gradio==6.1.0",
|
| 54 |
"onnxruntime-gpu==1.25.0",
|
| 55 |
"requests==2.32.4",
|
|
@@ -63,10 +64,104 @@ dev = [
|
|
| 63 |
]
|
| 64 |
all = ["dvlt[demos,dev]"]
|
| 65 |
|
|
|
|
|
|
|
| 66 |
[build-system]
|
| 67 |
requires = ["setuptools>=61.0", "wheel"]
|
| 68 |
build-backend = "setuptools.build_meta"
|
| 69 |
|
|
|
|
| 70 |
[tool.setuptools.packages.find]
|
| 71 |
where = ["src"]
|
| 72 |
include = ["dvlt*"]
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 3 |
version = "0.0.1"
|
| 4 |
description = "Déjà View: Looping Transformers for Multi-View 3D Reconstruction"
|
| 5 |
readme = "README.md"
|
| 6 |
+
requires-python = ">= 3.11"
|
| 7 |
license = { file = "LICENSE" }
|
| 8 |
authors = [
|
| 9 |
{name = "Tobias Fischer", email = "tobiasfischer623@gmail.com"},
|
|
|
|
| 24 |
# core
|
| 25 |
"accelerate==1.8.1",
|
| 26 |
"h5py==3.16.0",
|
| 27 |
+
"huggingface-hub==1.16.4",
|
| 28 |
"hydra-core==1.3.2",
|
| 29 |
"numpy==2.4.4",
|
| 30 |
"omegaconf==2.3.0",
|
| 31 |
"opencv-python==4.11.0.86",
|
| 32 |
"Pillow==11.2.1",
|
| 33 |
+
"pydantic>=2.0",
|
| 34 |
"safetensors==0.5.3",
|
| 35 |
"scipy==1.16.0",
|
| 36 |
+
"torch>=2.5.1",
|
| 37 |
+
"torchvision>=0.20.1",
|
| 38 |
"tqdm==4.67.1",
|
| 39 |
# logging + console
|
| 40 |
"rich==14.3.3",
|
|
|
|
| 50 |
|
| 51 |
[project.optional-dependencies]
|
| 52 |
demos = [
|
| 53 |
+
# interactive gradio demos
|
| 54 |
"gradio==6.1.0",
|
| 55 |
"onnxruntime-gpu==1.25.0",
|
| 56 |
"requests==2.32.4",
|
|
|
|
| 64 |
]
|
| 65 |
all = ["dvlt[demos,dev]"]
|
| 66 |
|
| 67 |
+
|
| 68 |
+
# Using setuptools as the build backend
|
| 69 |
[build-system]
|
| 70 |
requires = ["setuptools>=61.0", "wheel"]
|
| 71 |
build-backend = "setuptools.build_meta"
|
| 72 |
|
| 73 |
+
# setuptools configuration
|
| 74 |
[tool.setuptools.packages.find]
|
| 75 |
where = ["src"]
|
| 76 |
include = ["dvlt*"]
|
| 77 |
+
|
| 78 |
+
# Black configuration
|
| 79 |
+
[tool.black]
|
| 80 |
+
line-length = 120
|
| 81 |
+
target-version = ["py310"]
|
| 82 |
+
include = '\.pyi?$'
|
| 83 |
+
extend-exclude = '''
|
| 84 |
+
# A regex preceded with ^/ will apply only to files and directories
|
| 85 |
+
# in the root of the project.
|
| 86 |
+
^/build/
|
| 87 |
+
'''
|
| 88 |
+
|
| 89 |
+
# Ruff configuration
|
| 90 |
+
[tool.ruff]
|
| 91 |
+
line-length = 120
|
| 92 |
+
target-version = "py310"
|
| 93 |
+
|
| 94 |
+
# Enable various linting rules:
|
| 95 |
+
# E: pycodestyle errors (PEP 8 style guide)
|
| 96 |
+
# F: Pyflakes (detects logical errors)
|
| 97 |
+
# I: isort (import sorting)
|
| 98 |
+
# N: pep8-naming (naming conventions)
|
| 99 |
+
# W: pycodestyle warnings
|
| 100 |
+
# B: flake8-bugbear (additional bug detection)
|
| 101 |
+
# UP: pyupgrade (upgrade syntax to newer Python)
|
| 102 |
+
# PL: Pylint (general Python linting)
|
| 103 |
+
# RUF: Ruff-specific rules
|
| 104 |
+
lint.select = ["E", "F", "I", "W", "B", "PLE", "PLW", "PLC", "PLR"]
|
| 105 |
+
lint.ignore = [
|
| 106 |
+
"E731", # lambda expression
|
| 107 |
+
"E501", # Line too long.
|
| 108 |
+
"PLR2004", # Magic value used in comparison.
|
| 109 |
+
"PLR0915", # Too many statements.
|
| 110 |
+
"PLR0913", # Too many arguments.
|
| 111 |
+
"PLC0414", # Import alias does not rename variable. (this is used for exporting names)
|
| 112 |
+
"PLC1901", # Use falsey strings.
|
| 113 |
+
"PLR0911", # Too many return statements.
|
| 114 |
+
"PLR0912", # Too many branches.
|
| 115 |
+
"PLW2901", # For loop variable overwritten.
|
| 116 |
+
"B027", # Allow empty methods in abstract base class
|
| 117 |
+
]
|
| 118 |
+
|
| 119 |
+
# Specify directories that should be checked
|
| 120 |
+
include = ["src/**/*.py", "tests/**/*.py"]
|
| 121 |
+
|
| 122 |
+
# Exclude a variety of commonly ignored directories.
|
| 123 |
+
exclude = [
|
| 124 |
+
".bzr",
|
| 125 |
+
".direnv",
|
| 126 |
+
".eggs",
|
| 127 |
+
".git",
|
| 128 |
+
".git-rewrite",
|
| 129 |
+
".hg",
|
| 130 |
+
".mypy_cache",
|
| 131 |
+
".nox",
|
| 132 |
+
".pants.d",
|
| 133 |
+
".pytype",
|
| 134 |
+
".ruff_cache",
|
| 135 |
+
".svn",
|
| 136 |
+
".tox",
|
| 137 |
+
".venv",
|
| 138 |
+
"__pypackages__",
|
| 139 |
+
"_build",
|
| 140 |
+
"buck-out",
|
| 141 |
+
"build",
|
| 142 |
+
"dist",
|
| 143 |
+
"node_modules",
|
| 144 |
+
"venv",
|
| 145 |
+
]
|
| 146 |
+
|
| 147 |
+
# Allow unused variables when underscore-prefixed.
|
| 148 |
+
lint.dummy-variable-rgx = "^(_+|(_+[a-zA-Z0-9_]*[a-zA-Z0-9]+?))$"
|
| 149 |
+
|
| 150 |
+
[tool.ruff.lint.mccabe]
|
| 151 |
+
max-complexity = 10
|
| 152 |
+
|
| 153 |
+
[tool.ruff.lint.isort]
|
| 154 |
+
known-first-party = ["dvlt", "tests"]
|
| 155 |
+
force-single-line = false
|
| 156 |
+
lines-after-imports = 2
|
| 157 |
+
|
| 158 |
+
[tool.ruff.lint.flake8-quotes]
|
| 159 |
+
docstring-quotes = "double"
|
| 160 |
+
inline-quotes = "single"
|
| 161 |
+
|
| 162 |
+
[tool.ruff.lint.pydocstyle]
|
| 163 |
+
convention = "google"
|
| 164 |
+
|
| 165 |
+
[tool.pytest.ini_options]
|
| 166 |
+
testpaths = ["tests"]
|
| 167 |
+
python_files = ["test_*.py"]
|
packages/dvlt/{src → repo/src}/dvlt/__init__.py
RENAMED
|
File without changes
|
packages/dvlt/{src → repo/src}/dvlt/callbacks/__init__.py
RENAMED
|
File without changes
|
packages/dvlt/{src → repo/src}/dvlt/callbacks/base.py
RENAMED
|
File without changes
|
packages/dvlt/{src → repo/src}/dvlt/callbacks/evaluators/__init__.py
RENAMED
|
File without changes
|
packages/dvlt/{src → repo/src}/dvlt/callbacks/evaluators/base.py
RENAMED
|
File without changes
|
packages/dvlt/{src → repo/src}/dvlt/callbacks/evaluators/depth.py
RENAMED
|
File without changes
|
packages/dvlt/{src → repo/src}/dvlt/callbacks/evaluators/pointmap.py
RENAMED
|
File without changes
|
packages/dvlt/{src → repo/src}/dvlt/callbacks/evaluators/pose.py
RENAMED
|
File without changes
|
packages/dvlt/{src → repo/src}/dvlt/callbacks/logging.py
RENAMED
|
File without changes
|
packages/dvlt/{src → repo/src}/dvlt/callbacks/util.py
RENAMED
|
File without changes
|
packages/dvlt/{src → repo/src}/dvlt/callbacks/visualization.py
RENAMED
|
File without changes
|
packages/dvlt/{src → repo/src}/dvlt/common/__init__.py
RENAMED
|
File without changes
|
packages/dvlt/{src → repo/src}/dvlt/common/amp.py
RENAMED
|
File without changes
|
packages/dvlt/{src → repo/src}/dvlt/common/constants.py
RENAMED
|
File without changes
|
packages/dvlt/{src → repo/src}/dvlt/common/geometry.py
RENAMED
|
File without changes
|
packages/dvlt/{src → repo/src}/dvlt/common/io.py
RENAMED
|
File without changes
|
packages/dvlt/{src → repo/src}/dvlt/common/numpy/__init__.py
RENAMED
|
File without changes
|
packages/dvlt/{src → repo/src}/dvlt/common/numpy/geometry.py
RENAMED
|
File without changes
|
packages/dvlt/{src → repo/src}/dvlt/common/numpy/projection.py
RENAMED
|
File without changes
|
packages/dvlt/{src → repo/src}/dvlt/common/numpy/rotation.py
RENAMED
|
File without changes
|
packages/dvlt/{src → repo/src}/dvlt/common/pose.py
RENAMED
|
File without changes
|
packages/dvlt/{src → repo/src}/dvlt/common/projection.py
RENAMED
|
File without changes
|
packages/dvlt/{src → repo/src}/dvlt/common/rays.py
RENAMED
|
File without changes
|
packages/dvlt/{src → repo/src}/dvlt/common/rotation.py
RENAMED
|
File without changes
|
packages/dvlt/{src → repo/src}/dvlt/common/tensor.py
RENAMED
|
File without changes
|
packages/dvlt/{src → repo/src}/dvlt/common/types.py
RENAMED
|
File without changes
|
packages/dvlt/{src → repo/src}/dvlt/config/__init__.py
RENAMED
|
File without changes
|
packages/dvlt/{src → repo/src}/dvlt/config/cli.py
RENAMED
|
File without changes
|
packages/dvlt/{src → repo/src}/dvlt/config/completion.py
RENAMED
|
File without changes
|
packages/dvlt/{src → repo/src}/dvlt/config/experiments/da3-base.yaml
RENAMED
|
File without changes
|