must3r:高效的多视图网络3D重建开源项目

must3r:高效的多视图网络3D重建开源项目

must3r MUSt3R: Multi-view Network for Stereo 3D Reconstruction must3r 项目地址: https://gitcode.com/gh_mirrors/mu/must3r

项目介绍

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

在右上角点击启动切换

must3r MUSt3R: Multi-view Network for Stereo 3D Reconstruction must3r 项目地址: https://gitcode.com/gh_mirrors/mu/must3r

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

从错误信息来看,`cv2.hconcat` 函数在尝试水平拼接两个图像时失败了。具体来说,OpenCV 抛出了一个断言错误,表示输入的图像必须满足以下条件: 1. 图像的维度(dims)应小于等于2。 2. 输入的所有图像的高度(rows)应该相同。 3. 所有输入图像的数据类型(type)应该一致。 为了排查和解决这个问题,请检查以下几个方面: ### 1. 检查图像尺寸是否匹配 确保 `img_i` 和 `img_j` 的高度相等,并且它们都是二维矩阵(即没有多余的通道或额外的维度)。你可以通过打印它们的形状来确认这一点: ```python print("Shape of img_i:", img_i.shape) print("Shape of img_j:", img_j.shape) ``` 如果它们的高度不同或者不是二维数组,则需要进行调整。例如,如果你有一个灰度图和一个彩色图,你需要将它们转换为相同的格式: ```python if len(img_i.shape) == 2: # 如果是灰度图 img_i = cv2.cvtColor(img_i, cv2.COLOR_GRAY2BGR) if len(img_j.shape) == 2: # 如果是灰度图 img_j = cv2.cvtColor(img_j, cv2.COLOR_GRAY2BGR) # 确保两幅图像是同一大小 height_i, width_i, _ = img_i.shape height_j, width_j, _ = img_j.shape if height_i != height_j: raise ValueError(f"Images must have the same height. Got {height_i} and {height_j}") ``` ### 2. 检查图像数据类型是否一致 确保 `img_i` 和 `img_j` 的数据类型相同。可以使用 `.dtype` 属性来检查并转换数据类型: ```python print("Type of img_i:", img_i.dtype) print("Type of img_j:", img_j.dtype) # 将两者都转换为uint8类型 img_i = img_i.astype(np.uint8) img_j = img_j.astype(np.uint8) ``` ### 3. 调试代码中的其他部分 如果以上步骤仍然无法解决问题,建议逐步调试代码,查看是否有其他地方导致了图像的形状或类型不正确。特别是函数 `visualize_matches` 中可能对图像进行了某些处理,确保这些处理不会改变图像的基本属性。 ### 示例修复代码 结合上述检查点,以下是修正后的代码示例: ```python def visualize_matches(img_i, img_j, idx_i2j, valid_match_j, Xii, Xji): print("Shape of img_i:", img_i.shape) print("Shape of img_j:", img_j.shape) # Convert grayscale images to BGR if necessary if len(img_i.shape) == 2: img_i = cv2.cvtColor(img_i, cv2.COLOR_GRAY2BGR) if len(img_j.shape) == 2: img_j = cv2.cvtColor(img_j, cv2.COLOR_GRAY2BGR) # Ensure both images have the same height height_i, _, _ = img_i.shape height_j, _, _ = img_j.shape if height_i != height_j: raise ValueError(f"Images must have the same height. Got {height_i} and {height_j}") # Ensure both images have the same dtype if img_i.dtype != img_j.dtype: img_j = img_j.astype(img_i.dtype) # Now try concatenating the images horizontally vis = cv2.hconcat([img_i, img_j]) # Draw matches... # ... (rest of your visualization logic) ``` 希望这些建议能帮助你找到并解决这个问题!如果有进一步的问题,请随时联系我。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

伏崴帅

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值