conda create -n lingbot-map python=3.10 -y conda activate lingbot-map FlashInfer provides paged KV cache attention for efficient streaming inference. It is a pure-Python package that JIT-compiles CUDA kernels on first use, so a single wheel works across CUDA/PyTorch versions: 5. Visualization dependencies (optional)
Robbyant Team
https://github.com/user-attachments/assets/fe39e095-af2c-4ec9-b68d-a8ba97e505ab
LingBot-Map has focused on:
preprocess/oxford.py to prepare Oxford Spires data before evaluation.main and run python demo.py --compile ... or python gct_profile.py --backend flashinfer --dtype bf16 --compile to verify on your hardware.--keyframe_interval > 1 silently cached non-keyframes. You should now see better pose and reconstruction quality when running with more than 320 frames.1. Create conda environment
conda create -n lingbot-map python=3.10 -y
conda activate lingbot-map
2. Install PyTorch (CUDA 12.8)
pip install torch==2.8.0 torchvision==0.23.0 --index-url https://download.pytorch.org/whl/cu128
PyTorch 2.8.0 is the recommended version because NVIDIA Kaolin (required by the batch rendering pipeline) has prebuilt wheels for
torch-2.8.0_cu128. If you only needdemo.pyyou may use a newer PyTorch, but the batch renderer then requires building Kaolin from source. For other CUDA versions, see PyTorch Get Started.
3. Install lingbot-map
pip install -e .
4. Install FlashInfer (recommended)
FlashInfer provides paged KV cache attention for efficient streaming inference. It is a pure-Python package that JIT-compiles CUDA kernels on first use, so a single wheel works across CUDA/PyTorch versions:
pip install --index-url https://pypi.org/simple flashinfer-python
--index-url https://pypi.org/simpleis only needed if your default pip index is an internal mirror that doesn't haveflashinfer-python. (Optional) For faster first-use, you can additionally install a CUDA-specific JIT cache:pip install flashinfer-jit-cache -f https://flashinfer.ai/whl/cu128/flashinfer-jit-cache/. See FlashInfer installation for details. If FlashInfer is not installed, the model falls back to SDPA (PyTorch native attention) via--use_sdpa.
5. Visualization dependencies (optional)
pip install -e ".[vis]"
| Model Name | Huggingface Repository | ModelScope Repository | Description |
|---|---|---|---|
| lingbot-map-long | robbyant/lingbot-map | Robbyant/lingbot-map | Better suited for long sequences and large scale scenes (Recommend). |
| lingbot-map | robbyant/lingbot-map | Robbyant/lingbot-map | Balanced checkpoint — trade off all-around performance across short and long sequences. |
| lingbot-map-stage1 | robbyant/lingbot-map | Robbyant/lingbot-map | Stage-1 training checkpoint of lingbot-map — can be loaded into the VGGT model for bidirectional inference (c2w). |
🚧 Coming soon: we're training an stronger model that supports longer sequences — stay tuned.
After installation, run your first scene with one command:
python demo.py --model_path /path/to/lingbot-map-long.pt \
--image_folder example/courthouse --mask_sky
This launches an interactive viser viewer at http://localhost:8080. See Interactive Demo below for the full set of scenes and flags, or jump to Offline Rendering Pipeline for long-sequence batch rendering.
demo.py)Run demo.py for interactive 3D visualization via a browser-based viser viewer (default http://localhost:8080).
We provide four example scenes in example/ that you can run out of the box:
# courthouse scene
python demo.py --model_path /path/to/lingbot-map-long.pt \
--image_folder example/courthouse --mask_sky
https://github.com/user-attachments/assets/aa10f7ab-8024-43c7-92f8-d56159ec85c8
# University scene
python demo.py --model_path /path/to/lingbot-map-long.pt \
--image_folder example/university --mask_sky
https://github.com/user-attachments/assets/212a1744-6ff5-4ccf-9bd4-728608248b57
# Loop scene (loop closure trajectory)
python demo.py --model_path /path/to/lingbot-map-long.pt \
--image_folder example/loop
https://github.com/user-attachments/assets/5ae0a292-b081-40c6-838c-b7c1a0538d75
# Oxford scene with sky masking (outdoor, large scale scene)
python demo.py --model_path /path/to/lingbot-map-long.pt \
--image_folder example/oxford --mask_sky
https://github.com/user-attachments/assets/6b8daa95-9ed4-40b2-9902-7435779b886d
Sequence is too long for the interactive viser viewer — this clip was rendered with the Offline Rendering Pipeline. See that section for the full command.
We will provide more examples in the follow-up.
Use --keyframe_interval to reduce KV cache memory by only keeping every N-th frame as a keyframe. Non-keyframe frames still produce predictions but are not stored in the cache. This is useful for long sequences which exceed 320 frames (We train with video RoPE on 320 views, so performance degrades when the KV cache stores more than 320 views. Using a keyframe strategy allows inference over longer sequences.).
Dataset: Download the demo sequences from robbyant/lingbot-map-demo on Hugging Face.
Example run on the travel sequence from the dataset above (sky masking on, 4 camera optimization iterations, keyframe every 2 frames):
python demo.py \
--image_folder /path/to/lingbot-map-demo/travel/ \
--model_path /path/to/lingbot-map-long.pt \
--mask_sky \
--camera_num_iterations 4 \
--keyframe_interval 2
https://github.com/user-attachments/assets/d350b590-d036-4363-af8c-7af3918338ef
Note on inference range. Our method does not perform state resetting by default, so the maximum inference range is bounded by the longest distance seen during training on the dataset. Beyond that distance, state resetting becomes necessary. If you observe pose collapse, switch to windowed mode (
--mode windowed) — in most cases tuning--keyframe_intervalalone is enough and the rest of the windowed parameters can stay at their defaults.
python demo.py --model_path /path/to/lingbot-map-long.pt \
--video_path video.mp4 --fps 10 \
--mode windowed --window_size 128 --overlap_keyframes 16 --keyframe_interval 2
Sky masking uses an ONNX sky segmentation model to filter out sky points from the reconstructed point cloud, which improves visualization quality for outdoor scenes.
Setup:
# Install onnxruntime (required)
pip install onnxruntime # CPU
# or
pip install onnxruntime-gpu # GPU (faster for large image sets)
The sky segmentation model (skyseg.onnx) will be automatically downloaded from HuggingFace on first use.
Usage:
python demo.py --model_path /path/to/checkpoint.pt \
--image_folder /path/to/images/ --mask_sky
Sky masks are cached in <image_folder>_sky_masks/ so subsequent runs skip regeneration. You can also specify a custom cache directory with --sky_mask_dir, or save side-by-side mask visualizations with --sky_mask_visualization_dir:
python demo.py --model_path /path/to/checkpoint.pt \
--image_folder /path/to/images/ --mask_sky \
--sky_mask_dir /path/to/cached_masks/ \
--sky_mask_visualization_dir /path/to/mask_viz/
| Argument | Default | Description |
|---|---|---|
--port | 8080 | Viser viewer port |
--conf_threshold | 1.5 | Visibility threshold for filtering low-confidence points |
--point_size | 0.00001 | Point cloud point size |
--downsample_factor | 10 | Spatial downsampling for point cloud display |
python demo.py --model_path /path/to/checkpoint.pt \
--image_folder /path/to/images/ --use_sdpa
If you run into out-of-memory issues, try one (or both) of the following:
--offload_to_cpu — offload per-frame predictions to CPU during inference (on by default; use --no-offload_to_cpu only if you have memory to spare).--num_scale_frames 2 — reduce the number of bidirectional scale frames from the default 8 down to 2, which shrinks the activation peak of the initial scale phase.Lower the number of iterative refinement steps in the camera head to trade a small amount of pose accuracy for wall-clock speed:
python demo.py --model_path /path/to/checkpoint.pt \
--image_folder /path/to/images/ --camera_num_iterations 1
--camera_num_iterations defaults to 4; setting it to 1 skips three refinement passes in the camera head (and shrinks its KV cache by 4×).
demo_render/batch_demo.py)Use this pipeline when your sequence is too long for the interactive viser viewer — for example, the indoor walkthrough featured above. demo_render/batch_demo.py is the all-in-one offline entry point: feed it a video or a folder of images and it will run model inference and produce a headless point-cloud flythrough MP4 in a single command. It shares the same PyTorch / FlashInfer / checkpoint stack as demo.py.
For those constrained by limited VRAM or GPU usage, you may also refer to the implementation at: https://github.com/ureeey/lingbot-map-rtx4060-8g/commit/eeee84a89cc97c1e39b736b46df4ee315275700b
1. Rendering Python dependencies
pip install -e ".[vis,render]"
render pulls in open3d>=0.19 and pyyaml (the core numpy<2 constraint comes from the base lingbot-map install). Sky masking in this pipeline uses onnxruntime-gpu for batched segmentation; install it if you don't already have the CPU onnxruntime:
pip install onnxruntime-gpu
2. Kaolin — matches the PyTorch 2.8.0 + CUDA 12.8 recommended above:
pip install --index-url https://pypi.org/simple \
kaolin -f https://nvidia-kaolin.s3.us-east-2.amazonaws.com/torch-2.8.0_cu128.html
--index-url https://pypi.org/simplebypasses any internal mirror that might otherwise serve the PyPI placeholder wheel (which raisesImportErroron import). NVIDIA Kaolin does not publish prebuilt wheels for PyTorch 2.9.x — if you're on 2.9 for other reasons, build Kaolin from source (pip install --no-build-isolation git+https://github.com/NVIDIAGameWorks/kaolin.git, needs local CUDA toolkit). For other torch/CUDA combinations see NVIDIA Kaolin installation.
3. ffmpeg
sudo apt install ffmpeg # or: brew install ffmpeg
4. CUDA extensions (required before first run)
cd demo_render/render_cuda_ext && python setup.py build_ext --inplace && cd ../..
This builds voxel_morton_ext and frustum_cull_ext in place — both are imported by rgbd_render for GPU voxelization and frustum culling.
Dataset: Download the example video from robbyant/lingbot-map-demo on Hugging Face.
python demo_render/batch_demo.py \
--video_path /data/demo_videos/indoor_travel.MP4 \
--output_folder /data/outputs/indoor_travel/ \
--model_path /path/to/lingbot-map.pt \
--config demo_render/config/indoor.yaml \
--mode windowed --window_size 128 \
--keyframe_interval 13 --overlap_keyframes 8 \
--sky_mask_dir /data/outputs/sky_masks \
--sky_mask_visualization_dir /data/outputs/sky_mask_viz \
--camera_vis default --keyframes_only_points \
--frame_tag --frame_tag_position top_right \
--save_predictions
Flag-by-flag rationale:
| Flag | Why it's there |
|---|---|
--mode windowed --window_size 128 | Sliding-window inference is required once the sequence exceeds the ~320-frame RoPE training range; each window resets the KV cache. window_size counts KV-cache slots, not actual frames — the first num_scale_frames (=8) slots hold the scale frames and the remaining 128 − 8 = 120 slots hold keyframes. With keyframe_interval = 13, one window therefore covers 8 + 120 × 13 = 1568 actual frames. |
--keyframe_interval 13 | Cache only every 13th frame as a keyframe. Non-keyframes still emit per-frame predictions but don't grow the KV cache |
--overlap_keyframes 8 | Adjacent windows share 8 keyframes of context, resolved internally to max(num_scale_frames, 8 × keyframe_interval) = 8 × 13 = 104 actual frames of overlap. Recommended whenever keyframe_interval > 1, to keep cross-window pose alignment stable. |
--config demo_render/config/indoor.yaml | Seed render/scene/camera/overlay defaults from the indoor preset (short depth, tighter follow cam). Any CLI flag the user explicitly passes still overrides the YAML value. |
--sky_mask_dir / --sky_mask_visualization_dir | Persist sky masks and their side-by-side visualizations to disk so subsequent reruns reuse them instead of re-running ONNX segmentation. (The render pipeline only consumes them when sky masking is enabled — by the YAML preset or by --mask_sky.) |
--camera_vis default | Overlay the trajectory trail + recent-frame points on the rendered video. |
--keyframes_only_points | Only unproject keyframe depth into the point cloud; non-keyframes still contribute their pose to the trajectory/frustum overlay. Keeps the cloud sparse for very long sequences. |
--frame_tag --frame_tag_position top_right | Stamp a <i> / <N> Frames counter in the top-right corner of the MP4. |
--save_predictions | Persist per-frame NPZs alongside the MP4. Useful for inspection or for re-rendering with different camera/overlay settings later. |
The virtual camera path is described by the camera.segments list in the YAML preset passed via --config. Edit the YAML to design your own shot — no need to touch CLI flags.
Built-in presets live in demo_render/config/: default.yaml, indoor.yaml, indoor_overview.yaml, outdoor_large.yaml, outdoor_large_overview.yaml, surrounding.yaml, lingbo_world.yaml. Copy one and edit the camera: block.
camera:
fov: 60.0 # camera field of view in degrees
transition: 30 # frames blended between adjacent segments
segments:
- mode: follow # chase cam following the input trajectory
frames: [0, 1500] # rendered-frame range this segment covers (-1 = end)
back_offset: 0.3 # how far behind the input camera (fraction of scene scale)
up_offset: 0.08 # vertical lift above the input camera
look_offset: 0.4 # how far ahead the lookat target points
smooth_window: 30 # trajectory smoothing window in frames
- mode: birdeye # rise up for a top-down reveal of the whole scene
frames: [1500, 1800]
reveal_height_mult: 2.5 # birdeye height = scene scale × this factor
- mode: follow # drop back into chase cam
frames: [1800, -1]
back_offset: 0.3
up_offset: 0.08
look_offset: 0.4
transition controls how many frames are blended between adjacent segments; frames: [0, -1] means "the whole sequence".
mode | Behavior | Tunable fields |
|---|---|---|
follow | Chase cam tracks the input trajectory with smooth offsets. The most cinematic option for walkthroughs. | back_offset, up_offset, look_offset, smooth_window, scale_frames |
birdeye | Top-down reveal of the whole scene. Useful for hero / overview shots. | reveal_height_mult |
static | Fixed eye + lookat, auto-derived from the segment's start frame. | — |
pivot | Fixed eye, lookat sweeps along the trajectory. | — |
Pure follow (most common):
camera:
fov: 60.0
segments:
- mode: follow
frames: [0, -1]
back_offset: 0.3
up_offset: 0.08
look_offset: 0.4
smooth_window: 30
Full birdeye (good for overview / hero shots):
camera:
fov: 60.0
segments:
- mode: birdeye
frames: [0, -1]
reveal_height_mult: 2.5
Follow with birdeye inserts: just list multiple segments in order under segments: — adjacent segments are interpolated using transition frames.
Caveat: when
--configloads a YAML preset, passing any segment-shaping CLI flag (--camera_mode,--back_offset,--up_offset,--look_offset,--smooth_window,--follow_scale_frames,--birdeye_start,--birdeye_duration,--reveal_height_mult) discards the YAML'ssegmentsand rebuilds the camera path from those flags instead. To stay fully YAML-driven, don't pass any of them on the command line.
For a given output name (e.g. <scene> or <video_name>):
| File | Description |
|---|---|
<name>_pointcloud.mp4 | Rendered point-cloud flythrough |
<name>_pointcloud_rgb.mp4 | Original RGB frames encoded as video |
<name>_pointcloud_config.yaml | Full config snapshot of this run |
batch_results.json | Per-scene success / duration summary |
This project is released under the Apache License 2.0. See LICENSE file for details.
@article{chen2026geometric,
title={Geometric Context Transformer for Streaming 3D Reconstruction},
author={Chen, Lin-Zhuo and Gao, Jian and Chen, Yihang and Cheng, Ka Leong and Sun, Yipengjing and Hu, Liangxiao and Xue, Nan and Zhu, Xing and Shen, Yujun and Yao, Yao and Xu, Yinghao},
journal={arXiv preprint arXiv:2604.14141},
year={2026}
}
We thank Shangzhan Zhang, Jianyuan Wang, Yudong Jin, Christian Rupprecht, and Xun Cao for their helpful discussions and support.
This work builds upon several excellent open-source projects:
LingBot-Depth: Noisy Depth to Accurate 3D Measurements for Any RGB-D Camera
Kevin Wood | Robotics & AI · 4K views
LingBot-Map: New 3D Model for Fast Reconstruction
AI Research Roundup · 4K views
AntGroup Release LingBotWorld, an Open Source Real Time World Model for Interactive Video Simulation
Marktechpost AI · 3K views
“LingBot-Map: Streaming 3D reconstruction with geometric context transformer”
“Ant Group's Robbyant Unveils LingBot-Map: A Streaming 3D Reconstruction Model for Real-Time Spatial Understanding - Business Wire — Business Wire”
“Ant Group's LingBot-Map Sets New Bar for Real-Time 3D Vision - BriefGlance — BriefGlance”
AI
Companies use AI to filter candidates. I just gave candidates AI to choose companies. Career-Ops (career-ops.org, also known as careerops) turns any AI coding CLI into a full job search command center. Instead of manually tracking applications in a spreadsheet, you get an AI-powered pipeline that: Career-ops is agentic: Claude Code navigates career pages with Playwright, evaluates fit by reasoning about your CV vs the job description (not keyword matching), and adapts your resume per listing.
AI
CLI-Anything: Bridging the Gap Between AI Agents and the World's Software 🌐 CLI-Hub: pip install cli-anything-hub then cli-hub install — browse, install, and manage all community-built CLIs. Want to add your own? Open a PR — the hub updates instantly. 🎬 See Demos: Watch AI agents use generated CLIs plus preview, live preview, and trajectory loops to produce real artifacts — CAD builds, 3D scenes, diagrams, gameplay, subtitles, and more.
AI
A self-hosted AI workspace -- meant to be the self-hosted version of the UI experience you get from ChatGPT and Claude. But with more jank and fun. Running on your own hardware, with your own data -- local-first, privacy-first, and no trojan. A full, hover-to-play tour lives on the landing page (docs/index.html). Defaults work out of the box: clone, run, then configure models/search/email inside Settings. Only edit .env for deployment-level overrides like APPBIND, APPPORT, AUTHENABLED, DATABASEURL, or a pre-seeded admin password.
AI
Most AI material teaches in scattered pieces. A paper here, a fine-tuning post there, a flashy agent demo somewhere else. The pieces rarely line up. You ship a chatbot but can't explain its loss curve. You hook a function to an agent but can't say what attention does inside the model that's calling it. This curriculum is the spine. 20 phases, 503 lessons, four languages: Python, TypeScript, Rust, Julia. Linear algebra at one end, autonomous swarms at the other. Every algorithm gets built from raw math first. Backprop. Tokenizer. Attention. Agent loop. By the time PyTorch shows up, you already know what it's doing under the hood. Each lesson runs the same loop: read the problem, derive the math, write the code, run the test, keep the artifact. No five-minute videos, no copy-paste deploys,