{"slug": "lingbot-map-a-3d-foundation-model-for-reconstructing-scenes-from-streaming-data", "title": "Lingbot-map: A 3D foundation model for reconstructing scenes from streaming data", "summary": "LingBot-Map, a feed-forward 3D foundation model for streaming scene reconstruction, achieves state-of-the-art performance at ~20 FPS on long sequences exceeding 10,000 frames. The model uses a Geometric Context Transformer with paged KV cache attention and has been released with evaluation benchmarks and demo scripts for multiple datasets.", "body_md": "## teaser.mp4\n\n### 🗺️ Meet LingBot-Map! We've built a feed-forward 3D foundation model for streaming 3D reconstruction! 🏗️🌍\n\nLingBot-Map has focused on:\n\n**Geometric Context Transformer**: Architecturally unifies coordinate grounding, dense geometric cues, and long-range drift correction within a single streaming framework through anchor context, pose-reference window, and trajectory memory.**High-Efficiency Streaming Inference**: A feed-forward architecture with paged KV cache attention, enabling stable inference at ~20 FPS on 518×378 resolution over long sequences exceeding 10,000 frames.**State-of-the-Art Reconstruction**: Superior performance on diverse benchmarks compared to both existing streaming and iterative optimization-based approaches.\n\n## Click to expand\n\n**2026-06-28**— Fixed an SDPA KV cache bug.** The SDPA backend now performs better on long sequences**. We still recommend the FlashInfer backend for the best performance.** 2026-05-25**— 📊** Evaluation benchmark released**. We released the evaluation scripts for KITTI and Oxford Spires — see[benchmark/](/Robbyant/lingbot-map/blob/main/benchmark)for the pipeline, and runto prepare Oxford Spires data before evaluation.`preprocess/oxford.py`\n\n**2026-04-29**— 📹** Long-video demo released**. We released a very-long-video example (~25 000 frames, 13-minute indoor walkthrough) rendered with the offline pipeline — see[Worked Example](#worked-example--long-indoor-walkthrough-25-000-frames-13-minutes)for the command, flag rationale, and rendered output.**2026-04-27**— 🚀** LingBot-Map accelerated**. Pull the latest`main`\n\nand run`python demo.py --compile ...`\n\nor`python gct_profile.py --backend flashinfer --dtype bf16 --compile`\n\nto verify on your hardware.**2026-04-24**— Fixed a FlashInfer KV cache bug where`--keyframe_interval > 1`\n\nsilently cached non-keyframes.**You should now see better pose and reconstruction quality when running with more than 320 frames**.\n\n- ✅ Release evaluation benchmark\n- ✅ Oxford Spires dataset\n- ✅ KITTI dataset\n- ✅ VBR dataset\n- ✅ Droid-W dataset\n- ✅ TUM-D dataset\n- ✅ 7-scenes dataset\n- ✅ ETH3D dataset\n- ✅ Tanks and Temples dataset\n- ✅ NRGBD dataset\n\n- ✅ Release demo scripts\n- ✅ Indoor long-video demo (\n[Featured indoor walkthrough](#-featured-indoor-walkthrough-25-000-frames-13-minutes)) - ✅ Outdoor long-video demo\n- ✅ LingBot-World demo (\n[Worked example](#worked-example--lingbot-world-scenes)) - ✅ Aerial long-video demo\n\n- ✅ Indoor long-video demo (\n\n**1. Create conda environment**\n\n```\nconda create -n lingbot-map python=3.10 -y\nconda activate lingbot-map\n```\n\n**2. Install PyTorch (CUDA 12.8)**\n\n```\npip install torch==2.8.0 torchvision==0.23.0 --index-url https://download.pytorch.org/whl/cu128\n```\n\nPyTorch 2.8.0 is the recommended version because NVIDIA Kaolin (required by the batch rendering pipeline) has prebuilt wheels for\n\n`torch-2.8.0_cu128`\n\n. If you only need`demo.py`\n\nyou may use a newer PyTorch, but the batch renderer then requires building Kaolin from source. For other CUDA versions, see[PyTorch Get Started].\n\n**3. Install lingbot-map**\n\n```\npip install -e .\n```\n\n**4. Install FlashInfer (recommended)**\n\nFlashInfer 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:\n\n```\npip install --index-url https://pypi.org/simple flashinfer-python\n```\n\n`--index-url https://pypi.org/simple`\n\nis only needed if your default pip index is an internal mirror that doesn't have`flashinfer-python`\n\n. (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/`\n\n. See[FlashInfer installation]for details. If FlashInfer is not installed, the model falls back to SDPA (PyTorch native attention) via`--use_sdpa`\n\n.\n\n**5. Visualization dependencies (optional)**\n\n```\npip install -e \".[vis]\"\n```\n\n| Model Name | Huggingface Repository | ModelScope Repository | Description |\n|---|---|---|---|\n| lingbot-map-long |\n|\n\n[Robbyant/lingbot-map](https://www.modelscope.cn/models/Robbyant/lingbot-map)[robbyant/lingbot-map](https://huggingface.co/robbyant/lingbot-map)[Robbyant/lingbot-map](https://www.modelscope.cn/models/Robbyant/lingbot-map)[robbyant/lingbot-map](https://huggingface.co/robbyant/lingbot-map)[Robbyant/lingbot-map](https://www.modelscope.cn/models/Robbyant/lingbot-map)🚧\n\nComing soon:we're training an stronger model that supports longer sequences — stay tuned.\n\nAfter installation, run your first scene with one command:\n\n```\npython demo.py --model_path /path/to/lingbot-map-long.pt \\\n    --image_folder example/courthouse --mask_sky\n```\n\nThis launches an interactive [viser](https://github.com/nerfstudio-project/viser) viewer at `http://localhost:8080`\n\n. See [Interactive Demo](#-interactive-demo-demopy) below for the full set of scenes and flags, or jump to [Offline Rendering Pipeline](#-offline-rendering-pipeline-demo_renderbatch_demopy) for long-sequence batch rendering.\n\nRun `demo.py`\n\nfor interactive 3D visualization via a browser-based [viser](https://github.com/nerfstudio-project/viser) viewer (default `http://localhost:8080`\n\n).\n\nWe provide four example scenes in `example/`\n\nthat you can run out of the box:\n\n```\n# courthouse scene\npython demo.py --model_path /path/to/lingbot-map-long.pt \\\n    --image_folder example/courthouse --mask_sky\n```\n\n## output_pointcloud_side_by_side.mp4\n\n```\n# University scene\npython demo.py --model_path /path/to/lingbot-map-long.pt \\\n    --image_folder example/university --mask_sky\n```\n\n## output_pointcloud_side_by_side.mp4\n\n```\n# Loop scene (loop closure trajectory)\npython demo.py --model_path /path/to/lingbot-map-long.pt \\\n    --image_folder example/loop\n```\n\n## output_pointcloud_side_by_side.mp4\n\n```\n# Oxford scene with sky masking (outdoor, large scale scene)\npython demo.py --model_path /path/to/lingbot-map-long.pt \\\n    --image_folder example/oxford --mask_sky\n```\n\n## output_pointcloud_side_by_side.mp4\n\n*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.*\n\nWe will provide more examples in the follow-up.\n\nUse `--keyframe_interval`\n\nto 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.).\n\n**Dataset:** Download the demo sequences from [robbyant/lingbot-map-demo](https://huggingface.co/datasets/robbyant/lingbot-map-demo/tree/main) on Hugging Face.\n\nExample run on the `travel`\n\nsequence from the dataset above (sky masking on, 4 camera optimization iterations, keyframe every 2 frames):\n\n```\npython demo.py \\\n    --image_folder /path/to/lingbot-map-demo/travel/ \\\n    --model_path /path/to/lingbot-map-long.pt \\\n    --mask_sky \\\n    --camera_num_iterations 4 \\\n    --keyframe_interval 2\n```\n\n## output_pointcloud_side_by_side.mp4\n\nNote 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`\n\n) — in most cases tuning`--keyframe_interval`\n\nalone is enough and the rest of the windowed parameters can stay at their defaults.\n\n```\npython demo.py --model_path /path/to/lingbot-map-long.pt \\\n    --video_path video.mp4 --fps 10 \\\n    --mode windowed --window_size 128 --overlap_keyframes 16 --keyframe_interval 2\n```\n\nSky masking uses an ONNX sky segmentation model to filter out sky points from the reconstructed point cloud, which improves visualization quality for outdoor scenes.\n\n**Setup:**\n\n```\n# Install onnxruntime (required)\npip install onnxruntime        # CPU\n# or\npip install onnxruntime-gpu    # GPU (faster for large image sets)\n```\n\nThe sky segmentation model (`skyseg.onnx`\n\n) will be automatically downloaded from [HuggingFace](https://huggingface.co/JianyuanWang/skyseg/resolve/main/skyseg.onnx) on first use.\n\n**Usage:**\n\n```\npython demo.py --model_path /path/to/checkpoint.pt \\\n    --image_folder /path/to/images/ --mask_sky\n```\n\nSky masks are cached in `<image_folder>_sky_masks/`\n\nso subsequent runs skip regeneration. You can also specify a custom cache directory with `--sky_mask_dir`\n\n, or save side-by-side mask visualizations with `--sky_mask_visualization_dir`\n\n:\n\n```\npython demo.py --model_path /path/to/checkpoint.pt \\\n    --image_folder /path/to/images/ --mask_sky \\\n    --sky_mask_dir /path/to/cached_masks/ \\\n    --sky_mask_visualization_dir /path/to/mask_viz/\n```\n\n| Argument | Default | Description |\n|---|---|---|\n`--port` |\n`8080` |\nViser viewer port |\n`--conf_threshold` |\n`1.5` |\nVisibility threshold for filtering low-confidence points |\n`--point_size` |\n`0.00001` |\nPoint cloud point size |\n`--downsample_factor` |\n`10` |\nSpatial downsampling for point cloud display |\n\n```\npython demo.py --model_path /path/to/checkpoint.pt \\\n    --image_folder /path/to/images/ --use_sdpa\n```\n\nIf you run into out-of-memory issues, try one (or both) of the following:\n\n— offload per-frame predictions to CPU during inference (on by default; use`--offload_to_cpu`\n\n`--no-offload_to_cpu`\n\nonly if you have memory to spare).— reduce the number of bidirectional scale frames from the default 8 down to 2, which shrinks the activation peak of the initial scale phase.`--num_scale_frames 2`\n\nLower the number of iterative refinement steps in the camera head to trade a small amount of pose accuracy for wall-clock speed:\n\n```\npython demo.py --model_path /path/to/checkpoint.pt \\\n    --image_folder /path/to/images/ --camera_num_iterations 1\n```\n\n`--camera_num_iterations`\n\ndefaults to `4`\n\n; setting it to `1`\n\nskips three refinement passes in the camera head (and shrinks its KV cache by 4×).\n\nUse this pipeline when your sequence is too long for the interactive viser viewer — for example, the [indoor walkthrough featured above](#-featured-indoor-walkthrough-25-000-frames-13-minutes). `demo_render/batch_demo.py`\n\nis 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`\n\n.\n\nFor 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](https://github.com/ureeey/lingbot-map-rtx4060-8g/commit/eeee84a89cc97c1e39b736b46df4ee315275700b)\n\n**1. Rendering Python dependencies**\n\n```\npip install -e \".[vis,render]\"\n```\n\n`render`\n\npulls in `open3d>=0.19`\n\nand `pyyaml`\n\n(the core `numpy<2`\n\nconstraint comes from the base `lingbot-map`\n\ninstall). Sky masking in this pipeline uses `onnxruntime-gpu`\n\nfor batched segmentation; install it if you don't already have the CPU `onnxruntime`\n\n:\n\n```\npip install onnxruntime-gpu\n```\n\n**2. Kaolin** — matches the PyTorch 2.8.0 + CUDA 12.8 recommended above:\n\n```\npip install --index-url https://pypi.org/simple \\\n    kaolin -f https://nvidia-kaolin.s3.us-east-2.amazonaws.com/torch-2.8.0_cu128.html\n```\n\n`--index-url https://pypi.org/simple`\n\nbypasses any internal mirror that might otherwise serve the PyPI placeholder wheel (which raises`ImportError`\n\non 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`\n\n, needs local CUDA toolkit). For other torch/CUDA combinations see[NVIDIA Kaolin installation].\n\n**3. ffmpeg**\n\n```\nsudo apt install ffmpeg    # or: brew install ffmpeg\n```\n\n**4. CUDA extensions** (required before first run)\n\n```\ncd demo_render/render_cuda_ext && python setup.py build_ext --inplace && cd ../..\n```\n\nThis builds `voxel_morton_ext`\n\nand `frustum_cull_ext`\n\nin place — both are imported by `rgbd_render`\n\nfor GPU voxelization and frustum culling.\n\n**Dataset:** Download the example video from [robbyant/lingbot-map-demo](https://huggingface.co/datasets/robbyant/lingbot-map-demo/tree/main) on Hugging Face.\n\n```\n    python demo_render/batch_demo.py \\\n    --video_path /data/demo_videos/indoor_travel.MP4 \\\n    --output_folder /data/outputs/indoor_travel/ \\\n    --model_path /path/to/lingbot-map.pt \\\n    --config demo_render/config/indoor.yaml \\\n    --mode windowed --window_size 128 \\\n    --keyframe_interval 10 --overlap_keyframes 8 \\\n    --sky_mask_dir /data/outputs/sky_masks \\\n    --sky_mask_visualization_dir /data/outputs/sky_mask_viz \\\n    --camera_vis default --keyframes_only_points \\\n    --frame_tag --frame_tag_position top_right \\\n    --save_predictions\n```\n\nFlag-by-flag rationale:\n\n| Flag | Why it's there |\n|---|---|\n`--mode windowed --window_size 128` |\nSliding-window inference is required once the sequence exceeds the ~320-frame RoPE training range; each window resets the KV cache. — the first `window_size` counts KV-cache slots, not actual frames`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. |\n`--keyframe_interval 10` |\nCache only every 10th frame as a keyframe. Non-keyframes still emit per-frame predictions but don't grow the KV cache |\n`--overlap_keyframes 8` |\nAdjacent 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. |\n`--config demo_render/config/indoor.yaml` |\nSeed 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. |\n`--sky_mask_dir` / `--sky_mask_visualization_dir` |\nPersist 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` .) |\n`--camera_vis default` |\nOverlay the trajectory trail + recent-frame points on the rendered video. |\n`--keyframes_only_points` |\nOnly 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. |\n`--frame_tag --frame_tag_position top_right` |\nStamp a `<i> / <N> Frames` counter in the top-right corner of the MP4. |\n`--save_predictions` |\nPersist per-frame NPZs alongside the MP4. Useful for inspection or for re-rendering with different camera/overlay settings later. |\n\nReplacing keyframe_interval = 10 with image_stride = 10 speeds up rendering. Then, comment out the camera follow section in demo_render/config/indoor.yaml and set the birdeye's ranges to [2000, 2500] to reproduce the indoor fly-through effect shown in the demo:\n\n**Dataset:** Download the example video from [robbyant/lingbot-map-demo](https://huggingface.co/datasets/robbyant/lingbot-map-demo/tree/main) on Hugging Face.\n\n```\n    python demo_render/batch_demo.py \\\n    --video_path /data/demo_videos/drive_frames.mp4 \\\n    --output_folder /data/outputs/drive/ \\\n    --model_path /path/to/lingbot-map.pt \\\n    --config demo_render/config/outdoor_drive.yaml \\\n    --mode windowed --window_size 128 \\\n    --max_non_keyframe_gap 100 --overlap_keyframes 8 \\\n    --image_stride 1 \\\n    --sky_mask_dir /data/outputs/sky_masks \\\n    --sky_mask_visualization_dir /data/outputs/sky_mask_viz \\\n    --camera_vis default --keyframes_only_points \\\n    --frame_tag --frame_tag_position top_right \\\n    --save_predictions\n```\n\nWhat differs from the indoor walkthrough above:\n\n| Flag | Why it's there |\n|---|---|\n`--config demo_render/config/outdoor_drive.yaml` |\nSeed defaults from the outdoor preset: sky masking enabled, deeper render range (`max_depth: 250` ), and a follow cam tuned for vehicle trajectories with a final birdeye reveal. |\n`--image_stride 1` |\nUse every video frame. Increase it to subsample long or high-FPS drive footage. |\n`--max_non_keyframe_gap 100` |\nUpper bound on consecutive non-keyframes before a keyframe is forced. Only active with flow-based keyframe selection (`--flow_threshold > 0` ); in the default fixed-interval mode it has no effect. |\n\nThe remaining flags (`--mode windowed --window_size 128`\n\n, `--overlap_keyframes 8`\n\n, sky-mask caching, overlays, `--save_predictions`\n\n) carry over unchanged from the indoor example — see the flag-by-flag table above.\n\nReconstruct videos generated by LingBot-World, our world model — the same pipeline works on generated footage out of the box.\n\n**Dataset:** Download the example videos (`lingbo_world_frames.mp4`\n\n, `lingbo_world2_frames.mp4`\n\n) from [robbyant/lingbot-map-demo](https://huggingface.co/datasets/robbyant/lingbot-map-demo/tree/main) on Hugging Face.\n\n```\n    python demo_render/batch_demo.py \\\n    --video_path /data/demo_videos/lingbo_world_frames.mp4 \\\n    --output_folder /data/outputs/lingbo_world/ \\\n    --model_path /path/to/lingbot-map.pt \\\n    --config demo_render/config/outdoor_drive.yaml \\\n    --mode windowed --window_size 128 \\\n    --max_non_keyframe_gap 100 --overlap_keyframes 8 \\\n    --image_stride 1 \\\n    --sky_mask_dir /data/outputs/sky_masks \\\n    --sky_mask_visualization_dir /data/outputs/sky_mask_viz \\\n    --camera_vis default --keyframes_only_points \\\n    --frame_tag --frame_tag_position top_right \\\n    --save_predictions\n```\n\nFor the second clip, run the same command with `--video_path /data/demo_videos/lingbo_world2_frames.mp4 --output_folder /data/outputs/lingbo_world2/`\n\n(and separate `--sky_mask_dir`\n\n/ `--sky_mask_visualization_dir`\n\nfolders if you want to keep the cached masks apart).\n\nAll flags are identical to the [outdoor drive scene](#worked-example--outdoor-drive-scene) above — only the input video and output folder change. See the drive scene and indoor walkthrough tables for the flag-by-flag rationale.\n\nThe virtual camera path is described by the `camera.segments`\n\nlist in the YAML preset passed via `--config`\n\n. Edit the YAML to design your own shot — no need to touch CLI flags.\n\nBuilt-in presets live in `demo_render/config/`\n\n: `default.yaml`\n\n, `indoor.yaml`\n\n, `outdoor_drive.yaml`\n\n. Copy one and edit the `camera:`\n\nblock.\n\n```\ncamera:\n  fov: 60.0          # camera field of view in degrees\n  transition: 30     # frames blended between adjacent segments\n  segments:\n    - mode: follow            # chase cam following the input trajectory\n      frames: [0, 1500]       # rendered-frame range this segment covers (-1 = end)\n      back_offset: 0.3        # how far behind the input camera (fraction of scene scale)\n      up_offset: 0.08         # vertical lift above the input camera\n      look_offset: 0.4        # how far ahead the lookat target points\n      smooth_window: 30       # trajectory smoothing window in frames\n    - mode: birdeye           # rise up for a top-down reveal of the whole scene\n      frames: [1500, 1800]\n      reveal_height_mult: 2.5 # birdeye height = scene scale × this factor\n    - mode: follow            # drop back into chase cam\n      frames: [1800, -1]\n      back_offset: 0.3\n      up_offset: 0.08\n      look_offset: 0.4\n```\n\n`transition`\n\ncontrols how many frames are blended between adjacent segments; `frames: [0, -1]`\n\nmeans \"the whole sequence\".\n\n`mode` |\nBehavior | Tunable fields |\n|---|---|---|\n`follow` |\nChase cam tracks the input trajectory with smooth offsets. The most cinematic option for walkthroughs. | `back_offset` , `up_offset` , `look_offset` , `smooth_window` , `scale_frames` |\n`birdeye` |\nTop-down reveal of the whole scene. Useful for hero / overview shots. | `reveal_height_mult` |\n`static` |\nFixed eye + lookat, auto-derived from the segment's start frame. | — |\n`pivot` |\nFixed eye, lookat sweeps along the trajectory. | — |\n\n**Pure follow** (most common):\n\n```\ncamera:\n  fov: 60.0\n  segments:\n    - mode: follow\n      frames: [0, -1]\n      back_offset: 0.3\n      up_offset: 0.08\n      look_offset: 0.4\n      smooth_window: 30\n```\n\n**Full birdeye** (good for overview / hero shots):\n\n```\ncamera:\n  fov: 60.0\n  segments:\n    - mode: birdeye\n      frames: [0, -1]\n      reveal_height_mult: 2.5\n```\n\n**Follow with birdeye inserts**: just list multiple segments in order under `segments:`\n\n— adjacent segments are interpolated using `transition`\n\nframes.\n\nCaveat: when\n\n`--config`\n\nloads a YAML preset, passinganysegment-shaping CLI flag (`--camera_mode`\n\n,`--back_offset`\n\n,`--up_offset`\n\n,`--look_offset`\n\n,`--smooth_window`\n\n,`--follow_scale_frames`\n\n,`--birdeye_start`\n\n,`--birdeye_duration`\n\n,`--reveal_height_mult`\n\n) discards the YAML's`segments`\n\nand rebuilds the camera path from those flags instead. To stay fully YAML-driven, don't pass any of them on the command line.\n\nFor a given output name (e.g. `<scene>`\n\nor `<video_name>`\n\n):\n\n| File | Description |\n|---|---|\n`<name>_pointcloud.mp4` |\nRendered point-cloud flythrough |\n`<name>_pointcloud_rgb.mp4` |\nOriginal RGB frames encoded as video |\n`<name>_pointcloud_config.yaml` |\nFull config snapshot of this run |\n`batch_results.json` |\nPer-scene success / duration summary |\n\nThis project is released under the Apache License 2.0. See [LICENSE](/Robbyant/lingbot-map/blob/main/LICENSE.txt) file for details.\n\n```\n@article{chen2026geometric,\n  title={Geometric Context Transformer for Streaming 3D Reconstruction},\n  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},\n  journal={arXiv preprint arXiv:2604.14141},\n  year={2026}\n}\n```\n\nWe thank Shangzhan Zhang, Jianyuan Wang, Yudong Jin, Christian Rupprecht, and Xun Cao for their helpful discussions and support.\n\nThis work builds upon several excellent open-source projects:", "url": "https://wpnews.pro/news/lingbot-map-a-3d-foundation-model-for-reconstructing-scenes-from-streaming-data", "canonical_source": "https://github.com/Robbyant/lingbot-map", "published_at": "2026-07-17 00:07:49+00:00", "updated_at": "2026-07-17 01:36:54.901050+00:00", "lang": "en", "topics": ["computer-vision", "machine-learning", "artificial-intelligence", "ai-infrastructure"], "entities": ["LingBot-Map", "Geometric Context Transformer", "FlashInfer", "KITTI", "Oxford Spires", "PyTorch", "NVIDIA Kaolin"], "alternates": {"html": "https://wpnews.pro/news/lingbot-map-a-3d-foundation-model-for-reconstructing-scenes-from-streaming-data", "markdown": "https://wpnews.pro/news/lingbot-map-a-3d-foundation-model-for-reconstructing-scenes-from-streaming-data.md", "text": "https://wpnews.pro/news/lingbot-map-a-3d-foundation-model-for-reconstructing-scenes-from-streaming-data.txt", "jsonld": "https://wpnews.pro/news/lingbot-map-a-3d-foundation-model-for-reconstructing-scenes-from-streaming-data.jsonld"}}