Files
3sixty2cubemap/README.md
T
2026-08-22 15:02:15 +00:00

3.2 KiB

Warning

This project is fully vibecoded and behind no line in this code is human soul.

pipeline_360

Convert equirectangular 360° videos into a COLMAP-ready cubemap camera-rig dataset — sharpest-frame extraction, movable-object masks, an equirect→cubemap projection, and a rig_config.json + nested file tree.

This is the Rust + WebGPU rewrite of the original Python pipeline (now in ../python, kept as legacy reference).

⚡ Status: fully vibecoded, and the rewrite is done. Everything described here is implemented and running on real 8K test footage — GPU sharpness, YOLO segmentation masks on the GPU, cubemap projection, and rig generation all work end-to-end. It should just work; if something doesn't, the Wiki and issue tracker are the place to look.

What it does

video(s) → 01_frames (sharpest, quality-filtered)
         → 03_cubemap/images (equirect → 6 cube faces, on GPU)
         → 03_cubemap/masks  (YOLO11x-seg, on GPU)
         → 04_colmap/{images,masks,rig_config.json} (nested tree for COLMAP)

Everything heavy is on the GPU via WebGPU (wgpu) — Vulkan / Metal / DX12, so it's vendor-neutral. YOLO masks use the system ONNX Runtime with the AMD MIGraphX provider for GPU inference (falls back to CPU). A native egui GUI ships in the same binary.

Build & run

cargo build                    # full pipeline (masks on by default)
cargo run -- rig --self-test   # quick sanity check

# single command, all four stages (cube faces → masks on the GPU):
cargo run -- all --project-dir out --video vid1.mp4 [vid2.mp4 …] \
    --mask-model yolo11x-seg.onnx --mask-device rocm

# native GUI (one binary, --features gui):
cargo build --features gui && ./target/debug/pipeline_360

Prerequisites: a Rust toolchain, ffmpeg/ffprobe on PATH, a GPU with a WebGPU backend, and an ONNX export of the segmentation model (yolo export model=yolo11x-seg.pt format=onnx imgsz=1280 dynamic=True).

Features

  • Extract — GPU sharpness/exposure/contrast scores + quality filtering, parallax (--min-motion) and bad-frame rejection, chunk or spread selection, multi-video, batched.
  • Masks — YOLO11x-seg on the cube-face images (no wasteful round-trip), COLMAP convention (black = excluded), GPU inference with auto cached compiled model (first run compiles, later runs are fast).
  • Cubemap — faithful port of py360convert.e2c, batched, skip/resume.
  • Rig — rig_config.json + nested {FACE}/{stem} tree, symlink/hardlink/copy.
  • GUI — native egui+wgpu, shells out to the CLI for the heavy work.

Project structure

Cargo.toml, main.rs      entry point, CLI, `all` orchestration
src/gpu/                 GpuContext + WGSL shaders
src/stages/              extract, masks, cubemap, rig
src/gui.rs               egui+wgpu GUI (feature `gui`)
wiki/                    the documentation (setup, usage, GPU, troubleshooting)

License

GPL-3.0-or-later — see LICENSE.

More

  • Wiki → wiki/Home.md — setup, CLI reference, pipeline internals, GPU/MIGraphX setup, troubleshooting.
  • Design notes → PLAN.md — the original rewrite plan.