LingBot-Map 是 Robbyant 团队开源的流式 3D 重建基础模型,仓库为 Robbyant/lingbot-map,当前项目热度约 12.6k Stars。
它的定位不是传统的离线 SfM / SLAM / NeRF 优化管线,而是一个 feed-forward 3D foundation model:输入连续到来的图像或视频帧,模型在前向推理过程中直接预测和维护场景的几何结构,用于长序列、实时或准实时的 3D 重建。
项目 README 中对它的核心描述是:
A feed-forward 3D foundation model for reconstructing scenes from streaming data
也就是说,LingBot-Map 更适合下面这些场景:
官方项目页和模型入口:
| 资源 | 地址 |
|---|---|
| GitHub | https://github.com/Robbyant/lingbot-map |
| Project Website | https://technology.robbyant.com/lingbot-map |
| arXiv | https://arxiv.org/abs/2604.14141 |
lingbot-map_paper.pdf |
|
| HuggingFace 模型 | https://huggingface.co/robbyant/lingbot-map |
| ModelScope 模型 | https://www.modelscope.cn/models/Robbyant/lingbot-map |
| License | Apache-2.0 |
LingBot-Map 的能力可以拆成三层来看。
LingBot-Map 的核心架构是 Geometric Context Transformer,README 中强调它把下面三类能力统一到了一个流式模型里:
Coordinate Grounding
Dense Geometric Cues
Long-range Drift Correction
架构里几个重要概念:
| 概念 | 作用 |
|---|---|
| Anchor Context | 为流式重建提供稳定的几何锚点上下文 |
| Pose-reference Window | 在局部窗口内维护姿态参考,帮助短期几何对齐 |
| Trajectory Memory | 维护长程轨迹记忆,用于长序列漂移修正 |
| Paged KV Cache Attention | 用分页 KV 缓存提升长序列 Transformer 推理效率 |
传统 3D 重建经常需要完整数据、反复优化、全局 bundle adjustment 或隐式场景训练。LingBot-Map 的 README 明确强调:
这意味着它更偏向在线处理:数据流持续进入,模型持续输出和更新重建结果。
官方给出的性能目标是:
README 里专门提到:
demo.py:交互式 Demo。demo_render/batch_demo.py:离线渲染管线。--keyframe_interval > 1 的缓存问题已经修复,使用关键帧间隔时应能得到更好的姿态和重建质量。以下入口来自 README 中公开列出的模块和脚本。
| 入口 | 用途 | 适合场景 |
|---|---|---|
demo.py |
交互式流式重建 Demo | 快速试跑示例场景、调参数、观察重建效果 |
demo_render/batch_demo.py |
离线批量渲染管线 | 长视频、批处理、生成展示结果 |
benchmark/ |
评测脚本 | 在 KITTI、Oxford Spires 等数据集上复现实验 |
preprocess/oxford.py |
Oxford Spires 数据预处理 | 评测 Oxford Spires 前的数据准备 |
gct_profile.py |
Geometric Context Transformer 性能测试 | 对比 backend、dtype、compile 等推理设置 |
--backend flashinfer 用在长序列和高吞吐推理README 中推荐 FlashInfer backend 作为最佳性能选择,尤其是长序列推理。
典型使用场景:
bashpython gct_profile.py --backend flashinfer --dtype bf16 --compile
含义:
| 参数 | 作用 |
|---|---|
--backend flashinfer |
使用 FlashInfer 后端加速注意力和 KV cache |
--dtype bf16 |
使用 bfloat16,降低显存压力并提升吞吐 |
--compile |
启用编译优化,适合反复运行或长视频任务 |
如果只是调试,第一次可以不加 --compile,减少编译等待时间。
--keyframe_interval 用在“每帧都算太贵”的视频长视频里每帧都作为关键帧会增加计算和缓存压力。--keyframe_interval 用于控制关键帧间隔。
例如:
bashpython demo.py --keyframe_interval 5
这类配置适合:
需要注意,关键帧间隔过大时,快速运动、转弯、近距离物体变化可能导致重建质量下降。
README 明确把 >3000 frames 作为长序列窗口化推理的典型阈值。
适合:
窗口化推理的目的不是提升单帧精度,而是控制长序列下的显存、缓存和推理稳定性。
README 中列出了 Sky Masking 选项。它适合户外数据,例如道路、校园、城市街区、广场等。
天空区域通常缺少稳定几何结构,如果不处理,可能影响深度和重建质量。启用 sky masking 可以减少天空区域对几何推断的干扰。
下面这个示例不依赖 LingBot-Map 内部 Python 包,只使用标准库。它适合放在仓库根目录运行,用来检查 README 中提到的核心入口是否存在,并根据帧数给出运行建议。
保存为 tools/lingbot_map_overview_check.py:
python#!/usr/bin/env python3
from pathlib import Path
import argparse
import shutil
import sys
ENTRYPOINTS = {
"interactive_demo": "demo.py",
"offline_render": "demo_render/batch_demo.py",
"benchmark_dir": "benchmark",
"oxford_preprocess": "preprocess/oxford.py",
"gct_profile": "gct_profile.py",
}
def exists_status(root: Path, rel: str) -> str:
path = root / rel
return "OK" if path.exists() else "MISSING"
def recommend(frames: int, resolution: str, gpu_memory_gb: int, outdoor: bool) -> list[str]:
tips = []
tips.append(f"输入规模:{frames} frames,分辨率 {resolution},显存约 {gpu_memory_gb} GB")
if frames > 3000:
tips.append("建议:启用 windowed inference,避免长序列 KV cache 持续膨胀。")
else:
tips.append("建议:可以先用 demo.py 做普通流式推理,确认输入和可视化流程。")
if frames > 10000:
tips.append("建议:优先使用 demo_render/batch_demo.py 做离线批处理和渲染。")
if gpu_memory_gb >= 24:
tips.append("建议:尝试 FlashInfer + bf16 + compile,适合长视频或重复实验。")
else:
tips.append("建议:先降低分辨率或增大 keyframe_interval,观察显存占用。")
if outdoor:
tips.append("建议:户外视频开启 sky masking,减少天空区域对几何估计的干扰。")
return tips
def main() -> int:
parser = argparse.ArgumentParser()
parser.add_argument("--root", default=".", help="LingBot-Map 仓库根目录")
parser.add_argument("--frames", type=int, default=2500, help="待处理视频帧数")
parser.add_argument("--resolution", default="518x378", help="输入分辨率,例如 518x378")
parser.add_argument("--gpu-memory-gb", type=int, default=24, help="可用 GPU 显存,单位 GB")
parser.add_argument("--outdoor", action="store_true", help="是否为户外场景")
args = parser.parse_args()
root = Path(args.root).resolve()
print("# LingBot-Map 入口检查")
print(f"仓库目录:{root}")
print()
for name, rel in ENTRYPOINTS.items():
print(f"{name:20s} {rel:32s} {exists_status(root, rel)}")
print()
print("# Python / CUDA 运行环境提示")
print(f"python: {sys.executable}")
print(f"git: {shutil.which('git') or 'NOT FOUND'}")
print()
print("# 运行建议")
for tip in recommend(args.frames, args.resolution, args.gpu_memory_gb, args.outdoor):
print(f"- {tip}")
print()
print("# 下一步可尝试的命令")
print("python demo.py --help")
print("python gct_profile.py --backend flashinfer --dtype bf16 --compile")
print()
print("注意:具体 demo 输入参数以当前仓库的 `python demo.py --help` 输出为准。")
return 0
if __name__ == "__main__":
raise SystemExit(main())在仓库根目录运行:
bashpython tools/lingbot_map_overview_check.py \ --frames 25000 \ --resolution 518x378 \ --gpu-memory-gb 24 \ --outdoor
示例输出会类似:
text# LingBot-Map 入口检查 仓库目录:/path/to/lingbot-map interactive_demo demo.py OK offline_render demo_render/batch_demo.py OK benchmark_dir benchmark OK oxford_preprocess preprocess/oxford.py OK gct_profile gct_profile.py OK # Python / CUDA 运行环境提示 python: /path/to/python git: /usr/bin/git # 运行建议 - 输入规模:25000 frames,分辨率 518x378,显存约 24 GB - 建议:启用 windowed inference,避免长序列 KV cache 持续膨胀。 - 建议:优先使用 demo_render/batch_demo.py 做离线批处理和渲染。 - 建议:尝试 FlashInfer + bf16 + compile,适合长视频或重复实验。 - 建议:户外视频开启 sky masking,减少天空区域对几何估计的干扰。 # 下一步可尝试的命令 python demo.py --help python gct_profile.py --backend flashinfer --dtype bf16 --compile 注意:具体 demo 输入参数以当前仓库的 `python demo.py --help` 输出为准。
如果已经完成项目安装,并且 GPU 环境可用,可以先跑 GCT profile,而不是直接上长视频。
bashpython gct_profile.py --backend flashinfer --dtype bf16 --compile
这个命令适合验证:
--compile 在当前 PyTorch / CUDA 环境下是否正常。如果 FlashInfer 不可用,可以先查看帮助:
bashpython gct_profile.py --help再根据当前仓库支持的 backend 改成 SDPA 或其他可用后端。
完成模型下载后,建议先不要直接处理自己的长视频,而是先确认 demo.py 的参数:
bashpython demo.py --helpREADME 中 demo.py 覆盖了这些能力:
一个实际调试顺序可以是:
bash# 1. 查看 demo 支持哪些输入和模型参数
python demo.py --help
# 2. 查看性能测试脚本支持哪些 backend / dtype
python gct_profile.py --help
# 3. 在当前机器上测试推荐的长序列配置
python gct_profile.py --backend flashinfer --dtype bf16 --compile当这三步正常后,再把自己的视频或图像序列接入 demo.py 或 demo_render/batch_demo.py。
优先入口:
bashpython demo.py --help建议配置方向:
keyframe_interval。适合目标:
优先入口:
bashpython demo_render/batch_demo.py --help建议配置方向:
--compile。适合目标:
优先入口:
bashls benchmark
python preprocess/oxford.py --helpREADME 中说明:
benchmark/。preprocess/oxford.py 准备数据。适合目标:
LingBot-Map 虽然是基础模型,但仍然依赖输入视频中的视觉和几何线索。下面这些情况通常会变难:
README 中强调了 paged KV cache attention,也提到 SDPA / FlashInfer backend 的 KV cache bug 修复记录。实际使用时需要注意:
gct_profile.py。--compile 适合长任务,不一定适合第一次调试--compile 可以提升后续推理性能,但第一次运行可能有额外编译时间。如果只是确认输入路径、模型文件、可视化是否正常,可以先不加。
推荐顺序:
bashpython demo.py --help
python gct_profile.py --backend flashinfer --dtype bf16
python gct_profile.py --backend flashinfer --dtype bf16 --compile增大 keyframe_interval 可以减少计算压力,但会带来信息丢失风险。
适合增大间隔的情况:
不适合过大间隔的情况:
天空没有稳定可重建几何,可能干扰深度和场景结构预测。户外道路、校园、城市街区数据建议开启 README 中提到的 sky masking 相关选项。
README 的 News 中提到过多次 KV cache 和 backend 修复:
--keyframe_interval > 1 的缓存问题已经修复。因此复现实验或比较性能时,应记录:
--compile。