# DinoVision DinoVision is a DINOv3 feature roundtrip for Meta Quest. A frozen DINOv3 encoder turns a passthrough frame into patch features; a decoder trained with [Meganeura](https://github.com/kvark/meganeura) reconstructs RGB; and [Blade](https://github.com/kvark/blade) renders the result in OpenXR. Both training and deployment use Meganeura—the decoder is not trained or exported through PyTorch. This repository is the implementation and developer guide. The related material has deliberately separate jobs: - [Hugging Face](https://huggingface.co/mad-bot/dinovision) distributes the decoder weights, model card, machine-readable results, and reproducibility bundle. - [REPORT.md](REPORT.md) is the audited, paper-facing case study and the only place in this repository that states experimental results. - [experiments/README.md](experiments/README.md) defines the frozen protocols; [experiments/AUDIT.md](experiments/AUDIT.md) records rejected evidence. ## Get the weights Download the selected decoder from the DinoVision artifact: ```sh hf download mad-bot/dinovision decoder.bin --local-dir ref ``` The encoder checkpoint is gated and is not redistributed with DinoVision. Accept Meta's terms on the [`facebook/dinov3-vits16-pretrain-lvd1689m`](https://huggingface.co/facebook/dinov3-vits16-pretrain-lvd1689m) repository, then download it separately: ```sh hf download facebook/dinov3-vits16-pretrain-lvd1689m model.safetensors \ --local-dir ref ``` The Hugging Face model card documents the selected weight format, provenance, base-model hash, training data, evaluation records, and license obligations; those details are not duplicated here. ## Run on a host The windowed viewer uses screen capture but otherwise follows the same asynchronous inference path as the headset application: ```sh cargo run --release --features capture --example viewer -- \ ref/model.safetensors ref/decoder.bin ``` Useful development entry points: ```sh # One static preview (synthetic weights are used when no model is supplied). cargo run --release --example preview -- preview.png ref/model.safetensors # Compute benchmark. cargo run --release --example bench -- 20 # Train a decoder with Meganeura. cargo run --release --example train_decoder -- \ ref/model.safetensors \ [steps] [images] [layers] [size] [seed] [output-directory] ``` Use the artifact protocol rather than ad-hoc commands when generating a result for citation. ## Build and run on Quest Install the Rust Android target and `cargo-apk`, and provide Android SDK API 34 with NDK r27. The checked build wrapper injects host-specific toolchain paths, builds the native benchmark and evaluator, builds the XR APK, inspects its manifest, and hashes every output: ```powershell .\tools\build_android_artifacts.ps1 -OutputDir C:\tmp\dinovision-android ``` The XR app loads `model.safetensors` and `decoder.bin` from `/data/local/tmp/dinovision/`. It falls back to synthetic weights when the encoder file is absent. A Quest must be both awake and worn before Horizon OS will actually start an OpenXR activity; `SensorLockActivity` means the launch is still blocked by the proximity lock. For paper measurements, use the recovery-aware correctness and timing wrappers in [experiments/README.md](experiments/README.md). They preserve pre-existing device files, retain raw records and device-state snapshots, and reject incomplete runs. ## Code map | Path | Responsibility | |---|---| | `src/dinov3.rs` | DINOv3 graph, configuration, axial RoPE, and LayerScale layout | | `src/decoder.rs` | Trainable feature-to-RGB decoder shared by training and inference | | `src/preprocess.rs` | Image crop, resize, normalization, and patch layout | | `src/weights.rs` | Checkpoint-to-graph parameter binding | | `src/inference.rs` | Asynchronous inference worker and display modes | | `src/render.rs` | Blade rendering of the latest completed result | | `src/source.rs` | Test, desktop-capture, and headset-camera frame sources | | `src/bench.rs` | Host/device benchmark workloads and JSON records | | `android-xr/` | OpenXR passthrough application | | `examples/` | Training, evaluation, reference verification, and interactive tools | | `tools/` | Audited dataset, build, device, artifact, and summary automation | Training caches features from the frozen encoder and optimizes a decoder-only batch graph. Deployment joins a batch-one encoder and decoder into one inference graph. The decoder definition, learned parameters, graph operators, compiler, and runtime are shared; calling the training and deployment graphs identical would be inaccurate. On Quest, Meganeura receives the same `blade_graphics::Context` used by the renderer. Inference remains asynchronous, but compute and graphics share a Vulkan queue. Meganeura's submission-chunk control lets the application trade isolated throughput for opportunities to interleave rendering. The current camera path still includes CPU conversion and explicit transfers; it is not a zero-copy or capture-to-photon demonstration. ## Validate changes ```sh cargo test --workspace --all-targets cargo clippy --workspace --all-targets ``` For an independent encoder comparison, install Torch and Transformers, then generate and verify the reference bundle: ```sh python tools/dump_reference.py --out ref/reference cargo run --release --example verify -- ref/reference ref/model.safetensors ``` DinoVision pins Blade to the exact revision selected by Meganeura so the two crates share one `blade_graphics` type identity. Bump both pins together. The paper artifact records immutable DinoVision, Meganeura, and Blade revisions; the neighboring working-tree locations are never treated as provenance. ## License DinoVision source is MIT-licensed. DINOv3 and the distributed decoder have additional terms described in the [DinoVision model card](https://huggingface.co/mad-bot/dinovision).