Co-Slam论文及复现记录

news2025/1/11 8:18:27

Overview

在这里插入图片描述

输入RGB-D流: { I t } t = 1 N { D t } t = 1 N \{I_t\}^{N}_{t=1}\{D_t\}^{N}_{t=1} {It}t=1N{Dt}t=1N,它们带有已知相机内参 K ∈ R 3 × 3 K\in \mathbb{R}^{3\times 3} KR3×3。通过联合优化相机姿态 { ξ t } t = 1 N \{\xi_t\}^{N}_{t=1} {ξt}t=1N和神经场景表示 f t h e t a f_{theta} ftheta来实现密集映射和追踪。

隐式表示方式将世界坐标 x \mathrm{x} x映射为颜色 c \mathrm{c} c和TSDF(截断符号距离) s s s的值: f θ ( x ) → ( c , s ) f_{\theta}(\mathrm{x})\rightarrow(\mathrm{c},s) fθ(x)(c,s)

在每次映射迭代中对从全局像素集中随机采样的一组像素执行全局捆绑调整,联合优化场景表示 θ \theta θ和所有相机姿态 ξ t \xi_{t} ξt

联合坐标和参数编码

采用坐标编码进行场景表示,通过是使用稀疏参数编码加速训练:使用One-blob编码 γ ( x ) \gamma(x) γ(x),而非将空间坐标嵌入到多个频带中。作为场景表示,采用基于多分辨率哈希的特征网格 V α = { V α l } l = 1 L \mathcal{V}_{\alpha}=\{\mathcal{V}^{l}_{\alpha}\}^{L}_{l=1} Vα={Vαl}l=1L。每个级别的空间分辨率以渐进的方式设置在最粗略(coarsest)的 R m i n R_{min} Rmin和最精细(finest)的分辨率 R m a x R_{max} Rmax之间。通过三线性插值查询每个采样点 x \rm{x} x处的特征向量 V α ( x ) \mathcal{V}_{\alpha}(\rm{x}) Vαx。几何解码器输出预测的SDF值 s s s和特征向量 h \rm{h} h f τ ( γ ( x ) , V α ( x ) ) → ( h , s ) f_{\tau}(\gamma(\mathrm{x}),\mathcal{V}_{\alpha}(\mathrm{x}))\rightarrow(\mathrm{h},s) fτ(γ(x),Vα(x))(h,s)

最终,颜色多层感知机预测RGB值: f ϕ ( γ ( x ) , h ) → c f_{\phi}(\gamma(\mathrm{x}),h)\rightarrow\mathrm{c} fϕ(γ(x),h)c

这里的 θ = { α , ϕ , τ } \theta=\{\alpha,\phi,\tau\} θ={α,ϕ,τ}是可学习的参数。基于哈希的多分辨率特征网格表示中注入One blob编码,可以实现在线SLAM所需的快速收敛、高效内存使用和孔洞填充。

深度和颜色渲染

沿采样光线整合预测值来渲染深度和颜色。具体来说,给定相机原点 o \mathrm{o} o和光线方向 r \mathrm{r} r,均匀采样 M M M个点: x i = o + d i r , i ∈ { 1 , . . . , M } \mathrm{x}_i=\mathrm{o}+d_i\mathrm{r},i\in \{1,...,M\} xi=o+dir,i{1,...,M},这些点具有深度值 { t 1 , . . . , t M } \{t_1,...,t_M\} {t1,...,tM}以及预测的颜色 { c 1 , . . . , c M } \{\mathrm{c_1,...,\mathrm{c}_M}\} {c1,...,cM}

渲染公式如下: c ^ = 1 ∑ i = 1 M w i ∑ i = 1 M w i c i , d ^ = 1 ∑ i = 1 M w i ∑ i = 1 M w i d i \hat{\mathrm{c}}=\frac{1}{\sum^{M}_{i=1}w_i}\sum^{M}_{i=1}w_i\mathrm{c}_i,\hat{d}=\frac{1}{\sum^{M}_{i=1}w_i}\sum^{M}_{i=1}w_id_i c^=i=1Mwi1i=1Mwici,d^=i=1Mwi1i=1Mwidi

其中, { w i } \{w_i\} {wi}是沿着光线计算的权重。需要一个转换函数将预测的SDF值 s i s_i si转换为权重 w i w_i wi。与Neus中提出的渲染方程相反,这里采用简易的钟形(bell-shaped)模型并通过两个Sigmoid函数 σ ( ⋅ ) \sigma(·) σ()直接计算权重 w i w_i wi w i = σ ( s i t r ) σ ( − s i t r ) w_i=\sigma(\frac{s_i}{tr})\sigma(-\frac{s_i}{tr}) wi=σ(trsi)σ(trsi)

这里的 t r tr tr是截断距离。

深度引导采样:使用深度引导采样:除了在最近除和最远处之间均匀采样 M c M_c Mc个点外,对于具有有效深度测量的射线,还需要对 [ d − d s , d + d s ] [d−d_s,d+d_s] [ddsd+ds]范围内的 M f M_f Mf个近表面点进行均匀采样,其中 d s d_s ds是一个小偏移。

追踪和捆绑调整

目标函数:追踪和捆绑调整是通过最小化与可学习参数 θ \theta θ和相机参数 ξ t \xi_t ξt相关的目标函数来实现的。颜色和深度渲染的损失是渲染结果和观测值之间的 l 2 \mathcal{l}_2 l2误差: L r g b = 1 N ∑ n = 1 N ( c ^ n − c n ) 2 , L d = 1 ∣ R d ∣ ∑ r ∈ R d ( d ^ r ) − D [ u , v ] 2 \mathcal{L}_{rgb}=\frac{1}{N}\sum^{N}_{n=1}(\hat{c}_n-c_n)^2,\mathcal{L}_d=\frac{1}{|R_d|}\sum_{r\in R_d}(\hat{d}_r)-D[u,v]^2 Lrgb=N1n=1N(c^ncn)2,Ld=Rd1rRd(d^r)D[u,v]2

其中, R d R_d Rd是具有有效深度测量的光线几何, u , v u,v u,v是图像平面上的对应像素。

为了实现具有详细几何形状准确、平滑的重建,这里应用近似SDF和特征平滑度损失。

对于截断区域内的样本,比如 ∣ D [ u , v ] − d ≤ t r ∣ |D[u,v]-d\leq tr| D[u,v]dtr这些点,使用采样点与其观测到的深度值之间的距离作为真实SDF近似值的监督: L s d f = 1 ∣ R d ∣ ∑ r ∈ R d 1 ∣ S r t r ∣ ∑ p ∈ S r t r ( s p − ( D [ u , v ] − d ) ) 2 \mathcal{L}_{sdf}=\frac{1}{|R_d|}\sum_{r\in R_d}\frac{1}{|S^{tr}_{r}|} \sum_{p\in S^{tr}_{r}}(s_p-(D[u,v]-d))^2 Lsdf=Rd1rRdSrtr1pSrtr(sp(D[u,v]d))2

对于远离表面的点,比如 ∣ D [ u , v ] − d > t r ∣ |D[u,v]-d>tr| D[u,v]d>tr,使用一个自由空间损失,迫使SDF预测为截断距离 t r tr tr L f s = 1 ∣ R d ∣ ∑ r ∈ R d 1 ∣ S r f s ∣ ∑ p ∈ S r f s ( s p − t r ) 2 \mathcal{L}_{fs}=\frac{1}{|R_d|}\sum_{r\in R_d}\frac{1}{|S^{fs}_{r}|} \sum_{p\in S^{fs}_{r}}(s_p-tr)^2 Lfs=Rd1rRdSrfs1pSrfs(sptr)2

为了防止在未观察到的自由空间区域中由哈希碰撞引起的噪声重建,这里对插值特征 V α ( x ) \mathcal{V}_{\alpha}(\mathrm{x}) Vα(x)进行了额外的正则化: L s m o o t h = ∑ x ∈ G Δ x 2 + Δ y 2 + Δ z 2 \mathcal{L}_{smooth}=\sum_{x\in \mathcal{G}}\Delta^2_x+\Delta^2_y+\Delta^2_z Lsmooth=xGΔx2+Δy2+Δz2。这里的 Δ x , y , z = V α ( x + ϵ x , y , z − V α ( x ) ) \Delta_{x,y,z}=\mathcal{V}_{\alpha}(\mathrm{x}+\epsilon_{x,y,z}-\mathcal{V}_{\alpha}(\mathrm{x})) Δx,y,z=Vα(x+ϵx,y,zVα(x))表示哈希网格上沿三维相邻采样顶点之间的特征度量差异。由于对整个特征网格执行正则化在计算上对于实时映射是不可行的,因此在每次迭代中只在一个小的随机区域中执行正则化。

相机追踪:追踪每一帧相机到世界坐标系的转换矩阵 T w c = exp ⁡ ( ξ t ∧ ) ∈ S E ( 3 ) \mathrm{T}_{wc} = \exp(\xi ^\wedge_t) \in \mathbb{SE}(3) Twc=exp(ξt)SE(3)。当新的一帧输入时,首先初始化当前帧 i i i的姿态,使用恒定速度假设: T t = T t − 1 T t − 2 − 1 T t − 1 \mathrm{T}_t=\mathrm{T}_{t-1}\mathrm{T}^{-1}_{t-2}\mathrm{T}_{t-1} Tt=Tt1Tt21Tt1。然后在当前帧中选择 N t N_t Nt个像素,并通过最小化与相机参数 ξ t \xi_t ξt相关的目标函数来优化姿态。

捆绑调整:在Co-SLAM中,不再需要存储完整的关键帧图像或关键帧选择。相反,只存储像素的一个子集(约 5 % 5\% 5%)来表示每个关键帧。这使我们能够更频繁地插入新的关键帧,并维护一个更大的关键帧数据库。为了进行联合优化,我们从全局关键帧列表中随机采样 N g N_g Ng射线的总数,以优化场景表示和相机姿态。关节优化以交替的方式进行。具体来说,我们首先优化 k m k_m km步长的场景表示 θ θ θ,并使用相机参数 { ξ t } \{\xi_t\} {ξt}的累积梯度更新相机姿态。由于每个相机姿态只使用6个参数,这种方法可以提高相机姿态优化的鲁棒性,而梯度累积的额外计算成本可以忽略不计。

复现过程中遇到的困难

这个过程中遇到最麻烦的问题就是pytorch会报错内存问题以及tiny-cuda-nn和pytorch3d的安装,这两个库花了快一天时间,再加上师兄给催的比较紧,所以当时没怎么思考就不断尝试,最后熬夜静下心来好好整理一下,解决。

首先先把requirements.txt中的最后两行删掉,我们要手动安装,采用它们的方式肯定会有问题。

git+https://github.com/facebookresearch/pytorch3d.git
git+https://github.com/NVlabs/tiny-cuda-nn/#subdirectory=bindings/torch

pytorch

项目的开源baseline:[HengyiWang/Co-SLAM: CVPR’23] Co-SLAM: Joint Coordinate and Sparse Parametric Encodings for Neural Real-Time SLAM中用的是以下方法安装的pytorch:

在这里插入图片描述

但是我在多个服务器用该方法安装都不成功,有的会报错显存不足,有的直接kill掉安装指令。后来查询之后发现是因为这种方式下载的临时文件很大,超出了系统分配的预置空间,所以不能用这个指令,可以直接在pytorch官网Previous PyTorch Versions | PyTorch上找对应版本的安装指令:

在这里插入图片描述

这里有个小细节,发现AutoDL上的服务器用给定的指令:

conda install pytorch==1.10.0 torchvision==0.11.0 torchaudio==0.10.0 cudatoolkit=11.3 -c pytorch -c conda-forge

无法安装,可以把后面的conda-forge修改成功nvidia:

conda install pytorch==1.10.0 torchvision==0.11.0 torchaudio==0.10.0 cudatoolkit=11.3 -c pytorch -c nvidia

这样pytorch就安装成功了。

tiny-cuda-nn

项目的开源baseline:[HengyiWang/Co-SLAM: CVPR’23] Co-SLAM: Joint Coordinate and Sparse Parametric Encodings for Neural Real-Time SLAM中提到:
在这里插入图片描述

我们要手动从源代码中安装,先clone对应的repo,可以任意指定文件夹:

# Build tinycudann 
git clone --recursive https://github.com/nvlabs/tiny-cuda-nn

相关依赖

这时候不要着急去安装,先去tiny-cuda-nn的官网: https://github.com/nvlabs/tiny-cuda-nn上查看,可以发现此处需要一些相关依赖:

在这里插入图片描述

windows的c环境直接安装visual studio 2019就行,linux需要安装gcc且版本需要在8以上。先使用

gcc --version

查看gcc版本,基本大多数服务器都在8以上,所以这里不考虑升级。

cuda需要在10.2以上,也很容易解决。

CMake的3.21版本确实要求很高,这里单独安装一下:

我用3.24版本比较多,这里直接去它的官网:https://cmake.org/download/,下载cmake-3.24.1.tar.gz,然后解压:

tar -zxvf cmake-3.24.1.tar.gz

进入到解压后的文件夹,然后执行bootstrap文件进行检查:

cd cmake-3.24.1
./bootstrap

基本不会出错,检查完之后开始编译:

make

这里需要花费几十分钟的时间,编译完成后执行安装:

sudo make install

安装完成后重开一个终端,就能查询到更新后的cmake版本:

cmake --version

安装

这里没有什么坑,直接按照co-slam的要求执行即可:

# Try this version if you cannot use the latest version of tinycudann
#git reset --hard 91ee479d275d322a65726435040fc20b56b9c991
cd tiny-cuda-nn/bindings/torch
python setup.py install

不过安装过程消耗时间也会很久,几十分钟左右。

pytorch3d

linux系统安装pytorch3d确实有些麻烦,这里参考了很多博客:pytorch3d安装|踩坑指南 - 知乎,blog.csdn.net/weixin_60739161/article/details/135680823。可以总结为两个部分,相关依赖和对应库。

相关依赖

官方给的文档如下:

在这里插入图片描述

其他条件基本没问题,主要是fvcore和ioPath这俩需要单独安装。可以直接用conda install,但是注意一定要在虚拟环境下,否则安装过程需要删除掉一些conda库,但是base环境下该库是不能动的。

conda install -c fvcore -c iopath -c conda-forge fvcore iopath

安装

然后在官网Files | Anaconda.org上个下载符合自己环境的安装包,比如我的python是3.7,torch是1.10.0,cuda是11.3,那我就下载pytorch3d-0.7.1-py37_cu113_pyt1110.tar.bz2

下载完成后不用解压,直接安装:

conda install pytorch3d-0.7.1-py37_cu113_pyt1110.tar.bz2

这里也需要很长时间,几十分钟左右。

这样两个依赖就可以完成。

运行

修改config文件夹里的yaml文件,把指定路径索引到数据集,然后命令行输入以下指令即可:

python coslam.py xxx/xxxx.yaml

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2256983.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

《探索形象克隆:科技与未来的奇妙融合》

目录 一、什么是形象克隆 二、形象克隆的技术原理 三、形象克隆的发展现状 四、形象克隆的未来趋势 五、形象克隆的应用场景 六、形象克隆简单代码案例 Python 实现数字人形象克隆 Scratch 实现角色克隆效果(以猫为例) JavaScript 实现 Scratc…

解决view-ui-plus 中表单验证不通过问题,select 组件开启multiple模式 总是提示错误,即使不验证也提示,有值也验证失败

😉 你好呀,我是爱编程的Sherry,很高兴在这里遇见你!我是一名拥有十多年开发经验的前端工程师。这一路走来,面对困难时也曾感到迷茫,凭借不懈的努力和坚持,重新找到了前进的方向。我的人生格言是…

ARM V8 GIC中断模块

文章目录 1. 缩略语2. 简介2.1. 中断类型2.1.1 SGI软件中断2.1.2 PPI私有外设中断2.1.3 SPI 共享外设中断2.1.4 LPI(locality-specific peripheral interrupts) 2.2. GIC 架构2.2.1 Distributor2.2.2 Redistributor2.2.3 CPU Interfaces 2.3. 属性层次(affinity&…

perl Window安装教程

perl Window安装教程 下载地址 https://platform.activestate.com/tangxing806/ActivePerl-5.28/distributions 运行state-remote-installer.exe 按下图截图步骤 检查perl版本 参考文献: perl安装教程

算法日记(2024.12.09)

1.二叉树的最小深度 给定一个二叉树,找出其最小深度。 最小深度是从根节点到最近叶子节点的最短路径上的节点数量。 说明:叶子节点是指没有子节点的节点。 示例 1: 输入:root [3,9,20,null,null,15,7] 输出:2 …

《操作系统 - 清华大学》6 -5:局部页面置换算法:最不常用置换算法 (LFU, Least Frequently Used)

文章目录 1. 最不常用算法的工作原理2.最不常用算法特征3. 示例 1. 最不常用算法的工作原理 最不常用算法:注意并不是表示算法本身不常用,而是采取最不常使用页面的策略,Least Frequently Used, LFU。LRU 是最久未被访问的页&…

Hive分区值的插入

对于Hive分区表,在我们插入数据的时候需要指定对应的分区值,而这里就会涉及很多种情况。比如静态分区插入、动态分区插入、提供的分区值和分区字段类型不一致,或者提供的分区值是NULL的情况,下面我们依次来展现下不同情况下的表现…

OpenAI12天 –第3天的实时更新,包括 ChatGPT、Sora、o1 等

OpenAI提前开启了假期,推出了为期 12 天的活动,名为“OpenAI 12 天”。在接下来的一周左右的每一天,OpenAI 都将发布现有产品的新更新以及新软件,包括备受期待的 Sora AI 视频生成器。 OpenAI 首席执行官 Sam Altman 表示&#x…

C#导出数据库到Excel文件(.NET)

随着企业业务的增长和复杂性的增加,对数据进行有效的分析、共享和报告变得至关重要;而Excel,作为一款广泛接受的数据处理工具,提供了强大的计算能力、可视化选项以及与多种数据分析工具的兼容性,使得它成为从数据库导出…

基于Java后台实现百度米制坐标转WGS84地理坐标实战

目录 前言 一、需求简介 1、信息查询 二、Java后台转换 1、相关属性 2、相关转换方法 3、实例转换 三、Leaflet可视化 1、准备展示数据 2、Marker标记 3、可视化效果 四、总结 前言 在现代信息技术高速发展的今天,地理信息系统(GIS&#xff0…

声音克隆GPT-SoVITS

作者:吴业亮 博客:wuyeliang.blog.csdn.net 一、原理介绍 GPT-SoVITS,作为一款结合了GPT(生成预训练模型)和SoVITS(基于变分信息瓶颈技术的歌声转换)的创新工具,正在声音克隆领域掀…

自动驾驶数据集的应用与思考

数据作为新型生产要素,是数字化、网络化、智能化的基础,是互联网时代的“石油”“煤炭”,掌握数据对于企业而言是能够持续生存和发展的不竭动力,对于需要大量数据训练自动驾驶系统的企业而言更是如此。 而随着激光雷达、毫米波雷…

开源项目:轻型图像分割 unet_lite

DataBall 助力快速掌握数据集的信息和使用方式,会员享有 百种数据集,持续增加中。 需要更多数据资源和技术解决方案,知识星球: “DataBall - X 数据球(free)” -------------------------------------------------------------…

贪心算法专题(四)

目录 1. 单调递增的数字 1.1 算法原理 1.2 算法代码 2. 坏了的计算器 2.1 算法原理 2.2 算法代码 3. 合并区间 3.1 算法原理 3.2 算法代码 4. 无重叠区间 4.1 算法原理 4.2 算法代码 5. 用最少数量的箭引爆气球 5.1 算法原理 ​5.2 算法代码 1. 单调递增的数字…

【大模型系列篇】GPU资源容器化访问使用指南

在当今的高性能计算和机器学习领域,GPU(图形处理单元)因其卓越的并行计算能力而扮演着至关重要的角色。随着容器化技术如 Docker 的普及,越来越多的数据科学家和开发者选择将他们的应用和工作负载封装到 Docker 容器中&#xff0c…

【力扣】409.最长回文串

问题描述 思路解析 因为同时包含大小写字母,直接创建个ASCII表大小的桶来标记又因为是要回文子串,所以偶数个数的一定可以那么同时,对于出现奇数次数的,我没需要他们的次数-1,变为偶数,并且可以标记出现过…

Linux——管理用户和用户组

一、用户有哪些 root用户 定义:root用户是Linux系统中的最高权限用户,具有对系统所有资源的完全控制权。特性:root用户可以执行系统中的任何操作,包括修改系统配置文件、安装软件、管理系统服务等。由于其拥有最高权限&#xff0c…

SIP系列七:ICE框架(P2P通话)

我的音视频/流媒体开源项目(github) SIP系列目录 目录 一、NAT 1、NAT介绍 2、NAT类型 2.1、 完全圆锥型NAT 2.2、受限圆锥型NAT 2.3、端口受限圆锥型NAT 2.4、对称NAT 3、NAT打洞 3.1、不同一NAT下 3.2、同一NAT下 二、ICE 三、ICE中的SDP 至此&#x…

Spring Boot如何实现防盗链

一、什么是盗链 盗链是个什么操作,看一下百度给出的解释:盗链是指服务提供商自己不提供服务的内容,通过技术手段绕过其它有利益的最终用户界面(如广告),直接在自己的网站上向最终用户提供其它服务提供商的…

5.内容管理模块-课程查询

搞清楚一个项目的业务流程最直接的手段,就是找一个账号登录进去,操作一遍。 3.3设计接口 接口设计分析 post在需要提交很多参数的时候使用,并且post的安全性较高。 接口分析: po包,一般存放和数据库交互的实体类。 …