must3r:高效的多视图网络3D重建开源项目
项目介绍
must3r 是一个基于多视图网络进行立体3D重建的开源项目,由 Naver 实验室开发。该项目旨在通过使用多视图网络对一系列图像进行相机姿态和3D结构的实时预测,实现高效、准确的3D重建。must3r 项目采用对称的 DUSt3R 架构,并引入了多层记忆机制,使其能够处理不同分辨率的图像,并在多个场景中实现出色的性能。
项目技术分析
must3r 项目采用了多种先进的技术,包括:
- 对称的 DUSt3R 架构:该架构通过使用多个视角的图像来预测相机姿态和3D结构,从而提高了重建的准确性和效率。
- 多层记忆机制:该机制能够存储多个时间点的图像和相机姿态信息,从而实现了在线预测和持续更新。
- RoPE 位置嵌入:该技术用于对图像进行编码,并提高重建的精度。
- 预训练模型:must3r 项目提供了多个预训练模型,方便用户快速进行3D重建。
项目及技术应用场景
must3r 项目在多个场景中都有广泛的应用,包括:
- 虚拟现实和增强现实:must3r 项目可以用于创建逼真的虚拟环境和增强现实场景,从而提供更加沉浸式的体验。
- 机器人导航和自动驾驶:must3r 项目可以用于生成精确的3D地图,从而帮助机器人进行导航和自动驾驶。
- 历史建筑保护:must3r 项目可以用于重建历史建筑和文物,从而帮助历史建筑的保护和传承。
项目特点
must3r 项目具有以下特点:
- 高效:must3r 项目采用了多层记忆机制和预训练模型,从而实现了高效的3D重建。
- 准确:must3r 项目采用了多种先进的技术,从而提高了重建的准确性。
- 易用:must3r 项目提供了详细的文档和示例代码,方便用户快速上手和使用。
- 开源:must3r 项目是一个开源项目,用户可以自由地使用和改进该项目。
总结
must3r 是一个高效、准确、易用的多视图网络3D重建开源项目,具有广泛的应用场景。该项目采用了多种先进的技术,并提供了详细的文档和示例代码,方便用户快速上手和使用。我们相信,must3r 项目将会在3D重建领域发挥重要的作用。
使用说明
安装
micromamba create -n must3r python=3.11 cmake=3.14.0
micromamba activate must3r
pip3 install torch==2.7.0 torchvision==0.22.0 torchaudio==2.7.0 --index-url https://download.pytorch.org/whl/cu126 # 使用与您的系统兼容的正确版本的cuda
pip3 install -U xformers==0.0.30 --index-url https://download.pytorch.org/whl/cu126
git clone --recursive https://github.com/naver/must3r.git
cd must3r
# 如果您已经克隆了must3r:
# git submodule update --init --recursive
pip install -r dust3r/requirements.txt
pip install -r dust3r/requirements_optional.txt
pip install -r requirements.txt
# 安装 asmk
pip install faiss-cpu # 或者使用官方支持的方式(未经测试): micromamba install -c pytorch faiss-cpu=1.11.0 # faiss-gpu=1.11.0
mkdir build
cd build
git clone https://github.com/jenicek/asmk.git
cd asmk/cython/
cythonize *.pyx
cd ..
pip install .
cd ../..
# 可选步骤:MUST3R 依赖于 RoPE 位置嵌入,您可以为更快的运行时编译一些 cuda 内核。
cd dust3r/croco/models/curope/
pip install .
cd ../../../../
示例
python demo.py --weights /path/to/MUSt3R_512.pth --retrieval /path/to/MUSt3R_512_retrieval_trainingfree.pth --image_size 512 --viser
# 使用 --amp bf16 如果您的gpu支持
# 使用 --local_network 使其在本地网络上可用,或 --server_name 手动指定url
# 使用 --server_port 更改端口,默认情况下,它将从 7860 开始搜索可用的端口
# 使用 --device 使用不同的设备,默认情况下是 "cuda"
# --viser 用于同时启动 viser 服务器(用于实时更新)。您需要打开一个新标签页来查看此内容。注意:仅启动了一个实例,因此不支持多个实例。它将在端口 8080(如果可用)上启动。
# --allow_local_files 添加一个用于从本地目录加载图像的第二个标签页
# 其他示例
# 512分辨率 bf16,允许本地文件
python demo.py --weights /path/to/MUSt3R_512.pth --retrieval /path/to/MUSt3R_512_retrieval_trainingfree.pth --image_size 512 --amp bf16 --viser --allow_local_files
# 224分辨率,fp16,允许本地文件
python3 demo.py --weights /path/to/MUSt3R_224_cvpr.pth --retrieval /path/to/MUSt3R_224_retrieval_trainingfree.pth --image_size 224 --viser --allow_local_files --amp fp16
# 768分辨率(将使用插值位置嵌入)
python demo.py --weights /path/to/MUSt3R_512.pth --retrieval /path/to/MUSt3R_512_retrieval_trainingfree.pth --image_size 768 --amp bf16 --viser
选择图像
"细化迭代次数" 增加它以在关键帧上进行多次传递(对于回路闭合很有用)
重要
"最大批处理大小" -> 如果您使用的是小型gpu或您有很多图像,请将其设置为1以限制vram使用。
模式: 1 - 对于简单的视频序列,将其保留为 "序列:linspace"
2 - 对于无序的图像集合,更改为 "无序:检索"
这两个模式共享相同的参数:
选择内存图像数量(我会说尽可能多,但不要超过300,图像越多,速度越慢/内存需求越大)
将 "渲染一次" 切换关闭。 如果 "细化迭代次数" > 0,您可以将其切换为打开
3 - 对于较长的视频序列: "序列:slam关键帧"
4 - 对于较长的视频序列,如果 KDTree/slam 对您来说太慢: "序列:本地上下文和linspace关键帧"
默认参数应该足够好,可能在高分辨率下增加 slam 的子采样。
在线版本等价于 "序列:slam关键帧" 且 local_context=0。
点击 "运行"
在线视觉里程计演示 (open3d)
# 示例
# 从网络摄像头进行 slam 演示(512模型)
python slam.py --chkpt /path/to/MUSt3R_512.pth --res 512 --subsamp 4 --gui --input cam:0
# 从图像目录进行 slam 演示(224模型)
python slam.py \
--chkpt "/path/to/MUSt3R_224_cvpr.pth" \
--res 224 \
--subsamp 2 \
--keyframe_overlap_thr 0.05 \
--min_conf_keyframe 1.5 \
--overlap_percentile 85 \
--input "/path_to/TUM_RGBD/rgbd_dataset_freiburg1_xyz/rgb" \ # 可以是一个视频帧的文件夹,或网络摄像头:cam:0
--gui
# 没有gui的 slam 演示(它将写入最终内存状态 <memory.pkl> 和相机轨迹 <all_poses.npz>,可选重新渲染 with --rerender)
python slam.py --chkpt /path/to/MUSt3R_512.pth --res 512 --subsamp 4 --input /path/to/video.mp4 --output /path/to/export
在右上角点击启动切换
培训
注意事项
must3r 的培训自 CVPR 以来已经发展,我将写一些注意事项:
- 首先,MUSt3R 是实现的
重要
"最大批处理大小" -> 如果您使用的是小型gpu或您有很多图像,请将其设置为1以限制vram使用。
模式: 1 - 对于简单的视频序列,将其保留为 "序列:linspace"
2 - 对于无序的图像集合,更改为 "无序:检索"
这两个模式共享相同的参数:
选择内存图像数量(我会说尽可能多,但不要超过300,图像越多,速度越慢/内存需求越大)
将 "渲染一次" 切换关闭。 如果 "细化迭代次数" > 0,您可以将其切换为打开
3 - 对于较长的视频序列: "序列:slam关键帧"
4 - 对于较长的视频序列,如果 KDTree/slam 对您来说太慢: "序列:本地上下文和linspace关键帧"
默认参数应该足够好,可能在高分辨率下增加 slam 的子采样。
在线版本等价于 "序列:slam关键帧" 且 local_context=0。
点击 "运行"
在线视觉里程计演示 (open3d)
# 示例
# 从网络摄像头进行 slam 演示(512模型)
python slam.py --chkpt /path/to/MUSt3R_512.pth --res 512 --subsamp 4 --gui --input cam:0
# 从图像目录进行 slam 演示(224模型)
python slam.py \
--chkpt "/path/to/MUSt3R_224_cvpr.pth" \
--res 224 \
--subsamp 2 \
--keyframe_overlap_thr 0.05 \
--min_conf_keyframe 1.5 \
--overlap_percentile 85 \
--input "/path_to/TUM_RGBD/rgbd_dataset_freiburg1_xyz/rgb" \ # 可以是一个视频帧的文件夹,或网络摄像头:cam:0
--gui
# 没有gui的 slam 演示(它将写入最终内存状态 <memory.pkl> 和相机轨迹 <all_poses.npz>,可选重新渲染 with --rerender)
python slam.py --chkpt /path/to/MUSt3R_512.pth --res 512 --subsamp 4 --input /path/to/video.mp4 --output /path/to/export
在右上角点击启动切换
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考