demo.py 是 LingBot-Map 的交互式入口,适合第一次验证模型是否安装正确,也适合用自己的图片序列快速查看重建效果。
它做的事情可以拆成四步:
读取图片序列
从一个目录中按文件名顺序加载 RGB 图像,例如 000001.jpg、000002.jpg、000003.jpg。
加载 LingBot-Map 权重
使用本地 checkpoint,或从 HuggingFace / ModelScope 下载后的模型目录加载。
流式执行 3D 重建
按帧送入模型,维护流式上下文,包括关键帧、轨迹记忆和几何上下文。
启动 viser 浏览器可视化
在本地启动一个 Web 服务,把相机轨迹、点云 / 几何结果显示在浏览器中。
典型使用场景:
demo.py 期望输入是一组连续图片,而不是单张图片。目录结构通常类似:
textexamples/ └── room/ ├── 000000.jpg ├── 000001.jpg ├── 000002.jpg ├── 000003.jpg └── ...
建议图片文件名使用固定宽度数字编号,方便按时间顺序读取:
text000000.jpg 000001.jpg 000002.jpg
如果文件名是:
textframe_1.jpg frame_10.jpg frame_2.jpg
需要注意排序问题,最好提前改成数字递增格式。
README 中提供了两个模型下载入口:
robbyant/lingbot-mapRobbyant/lingbot-map推荐先下载到本地,例如:
bashmkdir -p checkpoints
huggingface-cli download robbyant/lingbot-map \
--local-dir checkpoints/lingbot-map之后在运行 demo.py 时把本地模型目录传进去。
如果网络环境更适合 ModelScope,可以用 ModelScope 下载到本地后传入同样的模型目录路径。
demo.py 会启动 viser 服务。运行后终端通常会打印一个本地地址,例如:
texthttp://localhost:8080
在浏览器打开这个地址即可查看重建结果。
常见的交互内容包括:
如果默认端口被占用,可以换一个端口,例如 8090。
不同版本的 demo.py 参数名可能会有小幅变化,运行前建议先看帮助:
bashpython demo.py --help下面是交互式 Demo 中常见参数的含义。
| 参数 | 作用 | 适用场景 |
|---|---|---|
--image_dir / --img_dir |
图片序列目录 | 加载示例场景或自己的图片 |
--model_path / --ckpt |
模型权重路径 | 指向下载后的 LingBot-Map 模型 |
--port |
viser 服务端口 | 默认端口被占用时修改 |
--keyframe_interval |
关键帧间隔 | 长序列提速、降低显存 |
--window_size |
窗口推理长度 | 超长序列减少内存压力 |
--sky_mask / --mask_sky |
天空区域遮罩 | 户外场景减少天空干扰 |
--compile |
启用编译优化 | CUDA 环境稳定后用于提速 |
--dtype |
推理精度,如 bf16 |
支持 BF16 的 GPU 上节省显存 |
--backend |
注意力 / KV cache 后端 | 长序列推荐高性能后端,例如 FlashInfer |
如果你的版本中参数名不同,以 python demo.py --help 输出为准。
下面示例假设仓库中有一个示例图片目录:
textexamples/room/
如果你的目录名不同,把命令里的路径替换成实际目录即可。
bashgit clone https://github.com/Robbyant/lingbot-map.git
cd lingbot-mapbashconda create -n lingbot-map python=3.11 -y conda activate lingbot-map
bashpip install -r requirements.txt
如果项目 README 中要求额外安装 CUDA、PyTorch、FlashInfer 或其他依赖,优先按照 README 的安装章节执行。
bashmkdir -p checkpoints
huggingface-cli download robbyant/lingbot-map \
--local-dir checkpoints/lingbot-map如果没有安装 HuggingFace CLI:
bashpip install -U huggingface_hub
bashpython demo.py \ --model_path checkpoints/lingbot-map \ --image_dir examples/room \ --port 8080
启动后打开浏览器:
texthttp://localhost:8080
如果终端打印的是其他地址,以终端输出为准。
假设你有一段视频,先抽帧到 data/my_room/images:
bashmkdir -p data/my_room/images
ffmpeg -i my_room.mp4 \
-vf "fps=10" \
data/my_room/images/%06d.jpg运行 Demo:
bashpython demo.py \ --model_path checkpoints/lingbot-map \ --image_dir data/my_room/images \ --port 8080
打开:
texthttp://localhost:8080
这个例子会以 10 FPS 抽帧后的图片作为流式输入。第一次测试时不建议直接使用原视频全部帧,先抽稀可以更快定位环境问题。
对于几千帧甚至上万帧的序列,可以先设置关键帧间隔:
bashpython demo.py \ --model_path checkpoints/lingbot-map \ --image_dir data/long_walk/images \ --keyframe_interval 5 \ --port 8080
含义是:不是每一帧都作为关键帧进入长期上下文,而是每隔一定帧数保留更关键的几何信息。
适合场景:
一般可以从下面几个值开始试:
text1 质量优先,显存和计算压力最大 3 平衡质量和速度 5 长序列常用 10 快速预览或非常长的视频
如果图片数量超过 3000 帧,建议启用窗口化推理,避免上下文过长导致显存增长。
示例:
bashpython demo.py \ --model_path checkpoints/lingbot-map \ --image_dir data/very_long_walk/images \ --keyframe_interval 5 \ --window_size 3000 \ --port 8080
窗口推理更适合:
窗口大小不是越大越好。窗口越大,上下文更完整,但显存和耗时也更高。
户外场景中,天空没有稳定几何结构,可能影响深度和点云质量。可以开启天空遮罩:
bashpython demo.py \ --model_path checkpoints/lingbot-map \ --image_dir data/outdoor/images \ --sky_mask \ --port 8080
适合:
不一定适合:
README 中提到可以使用 --compile 加速:
bashpython demo.py \ --model_path checkpoints/lingbot-map \ --image_dir examples/room \ --compile \ --port 8080
建议先不加 --compile 跑通一次。确认模型、显卡和可视化都正常后,再开启编译优化。
如果使用 BF16:
bashpython demo.py \ --model_path checkpoints/lingbot-map \ --image_dir examples/room \ --dtype bf16 \ --compile \ --port 8080
LingBot-Map README 中建议长序列使用 FlashInfer 后端以获得更好性能。安装完成后可以这样运行:
bashpython demo.py \ --model_path checkpoints/lingbot-map \ --image_dir data/long_walk/images \ --backend flashinfer \ --dtype bf16 \ --keyframe_interval 5 \ --port 8080
如果 FlashInfer 安装失败或当前显卡不支持,可以先使用默认后端跑通 Demo。
打开 viser 页面后,建议按这个顺序检查:
相机轨迹是否连续
如果轨迹突然跳变,通常说明输入帧顺序、画面质量或运动幅度有问题。
点云是否和场景轮廓一致
室内墙面、地面、桌椅等应该能形成大致稳定结构。
尺度是否明显漂移
很长的序列中如果后半段开始弯曲或漂移,可以尝试调小 keyframe_interval 或使用更合适的窗口大小。
天空、玻璃、反光区域是否产生噪点
户外开启天空遮罩,室内反光区域需要尽量避免占据画面主体。
浏览器是否卡顿
如果点太多,可以降低可视化点数、增大关键帧间隔,或缩短输入序列。
LingBot-Map 是从连续视觉输入中重建 3D。下面这些输入效果通常不好:
更好的输入方式:
确保文件排序就是时间顺序。推荐命名:
text000000.jpg 000001.jpg 000002.jpg ...
不推荐:
text1.jpg 2.jpg 10.jpg
因为某些排序方式下可能变成:
text1.jpg 10.jpg 2.jpg
可以用下面命令检查前几帧排序:
bashls data/my_room/images | head -20README 中提到模型可在 518×378 分辨率下进行高效流式推理。实际使用时:
如果自己的图片是 4K,建议先缩放后测试:
bashmkdir -p data/my_room_resized/images
ffmpeg -i my_room.mp4 \
-vf "fps=10,scale=518:-2" \
data/my_room_resized/images/%06d.jpg如果启动时报端口占用:
bashpython demo.py \ --model_path checkpoints/lingbot-map \ --image_dir examples/room \ --port 8090
然后打开:
texthttp://localhost:8090
如果 Demo 跑在远程服务器上,本地浏览器不能直接访问 localhost:8080。可以使用 SSH 端口转发:
bashssh -L 8080:localhost:8080 user@server_ip
然后在本地浏览器打开:
texthttp://localhost:8080
如果出现 CUDA OOM,可以按顺序处理:
--keyframe_interval;--window_size;--dtype bf16;示例:
bashpython demo.py \ --model_path checkpoints/lingbot-map \ --image_dir data/long_walk/images \ --dtype bf16 \ --keyframe_interval 8 \ --window_size 2000 \ --port 8080
建议第一次只放 100~300 张图片:
bashmkdir -p data/debug/images
find data/my_room/images -maxdepth 1 -type f | sort | head -300 | while read f; do
cp "$f" data/debug/images/
done确认 Demo 正常后再运行完整序列:
bashpython demo.py \ --model_path checkpoints/lingbot-map \ --image_dir data/debug/images \ --port 8080
这样可以更快定位问题,避免一开始就在长视频上等待很久。