Co-Slam论文及复现记录

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.rhkb.cn/news/487056.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

无代码,无问题:面向手动测试人员的人工智能自动化

“质量比数量更重要。一个本垒打比两个二垒打好得多。” ——史蒂夫乔布斯 在软件测试领域,这句话再贴切不过了。如果你是一名手动测试人员,你就会知道交付高质量结果的压力,而且通常是在紧迫的期限和有限的资源内。 然而,在当今…

transformers生成式对话机器人

简介 生成式对话机器人是一种先进的人工智能系统,它能够通过学习大量的自然语言数据来模拟人类进行开放、连贯且创造性的对话。与基于规则或检索式的聊天机器人不同,生成式对话机器人并不局限于预定义的回答集,而是可以根据对话上下文动态地…

模版方法模式的理解和实践

在软件开发中,设计模式为我们提供了一套经过验证的解决方案,用于解决常见的设计问题。其中,模版方法模式(Template Method Pattern)是一种行为设计模式,它定义了一个算法的框架,并允许子类在不改…

YOLO系列正传(二)YOLOv3论文精解(上)——从FPN到darknet-53

系列文章 YOLO系列基础 YOLO系列基础合集——小白也看得懂的论文精解-CSDN博客 YOLO系列正传 YOLO系列正传系列(一)类别损失与MSE损失函数、交叉熵损失函数-CSDN博客 背景 随着YOLOv11版本的发布,YOLO算法在视觉检测领域独领风骚&#x…

批处理读取文本第n行并赋值给变量?--遍历所有行并赋值给变量数组

::TraceLines.bat goto :test1http://www.bathome.net/thread-27229-1-1.html#批处理如何获取txt文本中某行某列的内容/指定行指定列的内容 http://www.bathome.net/thread-47304-1-1.html#如何用批处理读取文本第二行并赋值给变量? https://github.com/npocmaka/ba…

Blender中使用BlenderGIS插件快速生成城市建筑模型

导入下载 BlenderGIS 插件 去github上下载其压缩包,地址如下: https://github.com/domlysz/BlenderGIS 在BlenderGIS中导入这个插件压缩包: 点击上方菜单栏的编辑,点击偏好设置 在插件>从磁盘安装中导入刚刚下载的压缩包 可…

5G Multicast/Broadcast Services(MBS) (八) MBS多播DRX

这里简单看下多播DRX的内容。 1 MBS multicast 对于MBS多播,RRC可配置 MAC entity使其具备per G-RNTI 或per G-CS-RNTI DRX 功能,从而控制 UE 对 MAC entity的G-RNTI和G-CS-RNTI 的 PDCCH 监听活动。当处于 RRC_CONNECTED 状态时,如果为 G-RNTI 或 G-CS-RNTI 配置了多播…

Mybatis中SQL的执行过程

文章目录 Mybatis 框架SQL执行过程数据库操作映射方式SQL的执行过程- SQL解析- SQL参数映射- SQL预编译- SQL执行- 结果映射- 事务处理- 缓存处理- 日志记录与监控 扩展#与$的区别- $ 符号- # 符号总结示例 Mybatis SQL分类- 动态 SQL- 静态 SQL静态SQL和动态SQL选择${}、#{}与…

2024年深圳杯数学建模C题编译器版本的识别问题解题全过程文档及程序

2024年深圳杯数学建模 C题 编译器版本的识别问题 原题再现: 作为一种重要的工具,电子计算机自诞生以来,经历了极为快速的发展。区区百年的时间内,无论从体积、能耗、计算速度,还是应用能力等方面,电子计算…

12.09 C++作业2

利用函数重载&#xff0c;实现对整形数组的冒泡排序&#xff0c;对浮点型数组的冒泡排序 #include <iostream>using namespace std;int maopao(int(&ra)[10]) {//求数组长度int len sizeof(ra)/sizeof(ra[0]);int i,j,t;for(int i0;i<len;i){cin >>ra[i];}…

阿里云轻量应用服务器开放端口,图文教程分享

阿里云轻量应用服务器如何开放端口&#xff1f;在轻量服务器管理控制台的防火墙中添加规则即可开通端口&#xff0c;开通80端口就填80&#xff0c;开通443就填443端口&#xff0c;开通3306端口就填3306。阿里云百科网aliyunbaike.com整理阿里云轻量应用服务器端口号开通图文教程…

MySQL--》如何在SQL中巧妙运用函数与约束,优化数据处理与验证?

目录 函数使用 字符串函数 数值函数 日期函数 流程函数 约束 函数使用 函数是指一段可以直接被另一段程序调用的程序或代码&#xff0c;在mysql当中有许多常见的内置函数&#xff0c;接下来开始对这些内置函数及其作用进行简单的讲解和使用&#xff1a; 字符串函数 my…

《三角洲行动》游戏安全组件运行时发生异常1-0-0,是什么原因?以及要如何解决?

《三角洲行动》游戏安全组件异常1-0-0深度探讨 今天你们安全撤离了吗&#xff1f;在《三角洲行动》这款经典射击游戏里&#xff0c;游戏安全组件运行时发生异常1-0-0的原因及解决方案&#xff0c;并借此机会分享一些有关文件丢失、文件损坏和系统报错等问题的通用解决策略。希…

TensorFlow深度学习实战(1)——神经网络与模型训练过程详解

TensorFlow深度学习实战&#xff08;1&#xff09;——神经网络与模型训练过程详解 0. 前言1. 神经网络基础1.1 神经网络简介1.2 神经网络的训练1.3 神经网络的应用 2. 从零开始构建前向传播2.1 计算隐藏层节点值2.2 应用激活函数2.3 计算输出层值2.4 计算损失值2.4.1 在连续变…

ThinkPHP框架审计--基础

基础入门 搭建好thinkphp 查看版本方法&#xff0c;全局搜version 根据开发手册可以大致了解该框架的路由 例如访问url http://127.0.0.1:8094/index.php/index/index/index 对应代码位置 例如在代码下面添加新方法 那么访问这个方法的url就是 http://127.0.0.1:8094/index.…

哪些银行有银企直联的功能?

银企直联是指集团企业在集团内部建立自己的资金管理系统&#xff0c;通过数据接口将内部资金管理系统与商业银行核心系统、网银或者现金管理平台实现联接。 目前&#xff0c;大型商业银行大部分都开通了银企直联的功能。如民生,浦发,中国,兴业,交通,平安,招商,广发等&#xff…

2024年超大跨径钢结构桥梁创新技术论坛暨钢桥联盟年度工作会议顺利召开

12月5日&#xff0c;由中交公路规划设计院有限公司、装配化钢结构桥梁产业技术创新战略联盟主办&#xff0c;保利长大工程有限公司、中交第二航务工程局有限公司、中交第二公路工程局有限公司、中交路桥建设有限公司、中交西安筑路机械有限公司、南京现代综合交通实验室、巨力锁…

Python毕业设计选题:基于python的电影天堂数据可视化_django+hive

开发语言&#xff1a;Python框架&#xff1a;djangoPython版本&#xff1a;python3.7.7数据库&#xff1a;mysql 5.7数据库工具&#xff1a;Navicat11开发软件&#xff1a;PyCharm 系统展示 管理员登录 管理员功能界面 电影数据 看板展示 我的信息 摘要 电影天堂数据可视化是…

存内架构IR-DROP问题详解-电容电导补偿

一、总述 电容、电导补偿作为大规模数字电路的关键设计理念&#xff0c;是 CIM 架构优化的核心技术。在 CIM 中&#xff0c;平衡电容或电导并实现计算的精准映射&#xff0c;对能效提升和计算精度保障具有关键作用。本文基于近期文献探讨电容、电导补偿在 CIM 中的具体补偿策…

Java 环境配置 + IntelliJ IDEA 使用指南

文章目录 一、Java 程序的运行必须经过3 个步骤&#xff1a;编写、编译、运行&#xff08;1&#xff09;Java 和 JavaScript 的区别&#xff08;2&#xff09;JDK、JRE、JVM 的关系&#xff08;3&#xff09;是否需要 Maven&#xff1f; 二、软件下载2.1、JDK下载与安装 —— 是…