【论文阅读】CubeSLAM: Monocular 3D Object SLAM

news2024/11/26 2:42:42

一、基于单目图像的3d目标检测

这一部分是论文中最难理解的一章,作者的主要想法,是利用2d图像来生成3d的目标包围框(bounding box),一方面这个思路本身就不是很好懂,另一方面,作者写这一章还是用的倒叙,显得更难理解了。

3d包围框的定义

对于本文的3d包围框,需要使用九个量来定义,可以分为三组:位置(三维场景下的xyz坐标),旋转矩阵R(rpy一共三自由度)以及三个方向上的尺度。简单来说,3d包围框本身是一个立方体,立方体的朝向就对应旋转矩阵R,立方体中心的坐标就是位置,立方体的长宽高对应的就是三个方向上的尺度,所以一共是九个自由度来描述一个空间物体的包围框。

对于这篇论文,我们使用的是图像,所以最基础的包围框应该是2d包围框,文章的3d包围框生成都是基于假设:2d包围框同时也是3d包围框在2d平面上的投影,或者说,3d包围框的投影刚好是2d物体的最小外接矩形。在这个假设的基础上,我们需要使用消失点VP来进行物体的计算。消失点在前面MSC-VO里面也出现过,本身描述的是现实中平行的两条线,由于成像过程的畸变,导致在图像中不再是平行,而在图像中的角点,就被叫做消失点VP。

我们使用的3d包围框,本身是一个规则的立方体,最多可以同时观测到三个面,也就是做多可以计算出3个消失点,根据论文的内容,消失点的坐标可以用相机内参和物体的旋转矩阵进行计算:
在这里插入图片描述

3d包围框的计算

定义好2d与3d的包围框,接下来就是如何利用2d的包围框去计算出3d的包围框,这篇文章使用的方法是采样计算后利用评分机制选择分数最高的3d包围框。根据物体的朝向,2d下的观测情况一共有三种,文章主要是以最规则的第一种进行的介绍:
在这里插入图片描述
想要恢复3d的包围框,首先需要知道三个消失点以及物体投影最上方的点,也就是图a中最上面的点1,利用这四个点就可以循环计算出来剩余的2-7号点,具体来说就是用线的角点,VP1与点1可以确定一条线,这条线与BC的角点就是2号点,VP2和点1确定的线与AD的交点就是4号点,如此重复计算就可以计算出所有的点,这些点被称为2d边缘点。

得到2d边缘点之后,就可以利用这些点,重新恢复出3d包围框的边缘点,这里论文区分了两种情况:任意物体和地面上的物体。对于任意物体,恢复3d包围框主要是使用pnp进行计算,根据空间位置和当前位置的关系,可以列出3d包围框端点与2d成像平面之间的位置关系:
在这里插入图片描述
一个包围框是九个自由度,也就是说用四个点就可以解出除了尺度以外的八个自由度,所以这里使用的是八对点中随机取四个进行计算的方法。论文也没有仔细讲,为什么计算时不去考虑尺度,只说了四个点进行pnp计算,反正都是在计算,取四个点和取五个点的差别也不会太大,为什么不直接把尺度在这里一起计算。

对于在地面上的物体,由于物体一定会与地面产生联系,所以计算过程可以大大简化,也就是说物体的横滚角roll和俯仰角pitc都是0,论文说可以直接利用反投影线与地面的角点来计算与地面接触的点的坐标:
在这里插入图片描述
考虑到实际实现过程的复杂性,文章后续的实验全都是使用的地面物体,对于与地面没有接触的物体,论文并没有进行提取。可以看出,文章使用的2d包围框到3d包围框的计算,本身是一个比较复杂的计算过程,它需要先得到三个消失点以及最上方的2d边缘点,在此基础上才能计算出剩下的所有点,而VP的计算需要依赖于旋转矩阵R,或者说是3d包围框的朝向,朝向依赖于当前帧的位姿和相机的内参矩阵,在只考虑地面物体的情况下,3d包围框的朝向又会被进一步简化为物体的偏航角,所以说我们需要得到物体的yaw才能进行上面的一大堆计算,但是对于一个物体而言,yaw只有一个,这样说只能计算出来一个3d包围框,就不用谈后续的打分筛选机制,yaw的计算和最上方2d边缘点的计算,写在了第六章里面,yaw和最上方2d边缘点的计算都是一个采样的过程,所以会计算出来多个包围框,这才会与后续的打分机制相对应。

3d包围框的筛选

得到的多个3d包围框,我们使用一个评分标准来选择最合适的包围框,打分公式为:
在这里插入图片描述
这个打分公式由三部分组成:距离偏差、角度偏差以及形状偏差。这里简单说一下这三部分偏差,只能大概看懂怎么计算,但是为什么这么计算,并不能搞清楚。距离偏差的计算,首先需要进行边缘检测和距离变换图的计算,距离变换图可以参考链接,之后对于每个可视的包围框的投影边,均匀采样十个点并在距离变换图的对应位置取和,结果除以2d包围框的对角线,以此作为距离偏差。角度偏差则是在计算场景内长线段和消失点之间的角度关系,对于一个消失点,我们可以计算出一定范围内具有最大倾斜程度和最小倾斜程度的两条线,角度偏差的计算就基于消失点和这两条线的端点:
在这里插入图片描述
除此之外形状偏差则是最好理解的,这个误差主要是为了让3d包围框的形状更加均匀:
在这里插入图片描述
简单来说,对于这部分的2d包围框转3d包围框,首先需要得到三个消失点、最顶端的2d边缘点以及2d包围框,在此基础上,首先利用消失点和边缘点,计算出来剩余的2d边缘点,之后恢复出3d包围框的边缘点,由于消失点和边缘点的计算是基于采样的,所以会计算出来好多个3d包围框,对于这些包围框,利用打分机制,将形状、角度以及距离变换图的结果纳入考虑,从中选择最合适的包围框作为最终物体检测的结果。

二、基于物体的SLAM

在CubeSLAM里面,物体主要是用在了后端的BA优化中,也就是说,前端的跟踪还是ORBSLAM基于点的那一套,而在后端的优化中,物体作为第三个元素,与相机位姿和地图点一起进行优化。其中物体进行优化主要是指对物体包围框的位姿进行优化:
在这里插入图片描述

相机位姿与物体之间的约束

关于相机位姿与物体之间的约束,文章分了两种情况进行讨论,因为物体的包围框虽然是三维的,但可以通过投影转换到二维平面上,在我们比较与真实位置的偏差时,就有二维平面和三维平面两种情况。

当3d物体的检测比较准确的时候,我们使用3d的偏差,也就是将路标物体转换到相机坐标系下,然后比较相机坐标系下物体的位姿和测量值:
在这里插入图片描述
反之,如果要使用2d的偏差,那么就需要将物体投影到成像平面,比较投影位置和检测出的2d包围框之间的偏差,由于是物体向2d平面投影,所以必然会存在重叠,这里我们使用取最大值的方法去得到2d下的投影包围框:
在这里插入图片描述
投影得到的2d包围框会与检测出来的包围框进行比较,从而得到2d的偏差:
在这里插入图片描述
对于这两种方法,2d偏差由于多了一个投影的过程,本身会丢失一定的信息,但反过来看我们利用2d包围框生成3d包围框的过程本身也是一个存在误差的过程,所以这两种方法没有太多纠结误差谁大谁小的意义。

物体与地图点之间的约束

物体与地图点之间的约束,主要是根据特征点相对于物体的范围,如果一个点落在了物体内部,那么这个点对应的地图点也应该在物体对应的3d包围框中:
在这里插入图片描述
所以根据这个理论,物体与地图点之间的约束可以表示为:
在这里插入图片描述

相机位姿与地图点之间的约束

这部分约束就是ORBSLAM里面的重投影误差,并没有什么改动。
在这里插入图片描述
需要注意的是,物体同样需要在帧之间建立联系,相当于特征的匹配,这里使用了一个简单一些的方法,并不是对物体进行语义上的描述,而是利用其内部的特征点。具体来说,首先要将2d包围框附近的特征点与包围框建立联系,如果包围框内部的特征点能够在连续两帧内被观测到且空间坐标距离物体中心的距离不超过1m,就认为这个特征点是属于这个物体的,那么在匹配物体时,就可以利用这些特征点,如果特征点匹配数目超过阈值,就认为物体也是匹配的。

三、动态物体SLAM

一般动态特征在SLAM里面都会认为是对系统产生负面影响的特征,在CubeSLAM里面,作者单独对动态物体进行了处理,使用动态物体的运动模型来对物体包围框进行计算上的修正:
在这里插入图片描述
基于这种运动模型,运动物体包围框的偏差公式就变为了:
在这里插入图片描述
同时动态物体上的特征点也变为:
在这里插入图片描述

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

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

相关文章

【linux】虚拟机安装部署

找了很多教程,有的不成功,记录一下成功的参考,感谢大佬们! 1.虚拟机VMware安装 安装教程:https://blog.csdn.net/qq_45793637/article/details/128159966 2.安装centos7 Linux镜像下载地址:centos-7-is…

使用多模态数据映射大脑网络

前言 人脑由解剖和功能性的网络组织而成,这些网络涉及大规模分布但相互作用的脑区。不同脑区之间的同步性已在手指敲击或视觉刺激等实验任务活动中观察到,但更重要的是,也在无任务条件下(即静息态)测量的内源性活动中被观察到。即使在休息时…

密歇根大学Python 系列之三:Python 数据科学应用项目

Python在数据科学领域的应用已经成为了趋势,同时也在不断地发展和演化。对于从事数据科学相关工作的从业者来说,熟练掌握Python已经成为了必备技能之一。而对于其他从业者来说,了解Python在数据科学领域的应用也可以帮助他们更好地理解数据科…

linux系统中的用户态和内核态

linux系统中的用户态和内核态 文章目录 linux系统中的用户态和内核态[TOC](文章目录) 定义一、Linux系统简介Linux内核结构 二、总结 定义 在Linux系统中,用户态和内核态是两种不同的运行模式,它们主要区别在于程序所处的权限和访问硬件资源的方式。 用…

NVIDIA-SMI has failed because it couldn‘t communicate with the NVIDIA driver.解决

利用ubuntu自带的“软件与更新”安装完nvidia显卡驱动之后出现了如下提示。 NVIDIA-SMI has failed because it couldnt communicate with the NVIDIA driver. Make sure that the latest NVIDIA driver is installed and running.重启系统,在进行ubuntu启动引导的…

智能学习 | MATLAB实现PSO-SVM多输入单输出回归预测(粒子群算法优化支持向量机)

智能学习 | MATLAB实现PSO-SVM多输入单输出回归预测(粒子群算法优化支持向量机) 目录 智能学习 | MATLAB实现PSO-SVM多输入单输出回归预测(粒子群算法优化支持向量机)预测效果基本介绍模型原理程序设计参考资料预测效果 基本介绍 MATLAB实现PSO-SVM多输入单输出回归预测(粒…

adk部署win10

adksetup.exe安装 百度搜索adk 在这里插入图片描述 https://docs.microsoft.com/en-us/windows-hardware/get-started/adk-install下载adk 注意:要和操作系统版本对应上,我这里是1903版本的win10。

分布式事务处理方案及分布式锁相关

​ 本文偏理论 一、事务处理 1、事务处理的四个特性ACID Atomicity 原子性: 对于数据库的修改,全部执行or全部不执行 Consistency 一致性: Isolation 隔离性 : 亦称为串行化,防止事务间操作混淆,需要串行化或者序列化请求,使…

Java迭代

迭代(iterate)&#xff1a;简单来说&#xff0c; 它就是一个循环。 集合框架中的Iterator接口定义了迭代器的功能&#xff0c; 迭代器的用途是遍历集合&#xff08;容器&#xff09; 中的所有元素。 1. Iterator接口 public interface Iterator<E> {boolean hasNext();…

Zynq-7000、FMQL45T900的GPIO控制(一)-----SDK配置GPIO普通输入输出模式,以及GPIO编号

Zynq-7000系列GPIO排布如下图所示&#xff0c;著名手册ug585第14章&#xff0c;第一个图&#xff0c;这图很清晰的表明&#xff0c;一共54个MIO&#xff0c;64个EMIO&#xff0c;所有这些IO共分为4个bank&#xff0c;其中 Bank0 32bit —>> MIO[0:31] Bank1 22bit —…

Java版本电子招标采购系统源代码—企业战略布局下的采购寻源

智慧寻源 多策略、多场景寻源&#xff0c;多种看板让寻源过程全程可监控&#xff0c;根据不同采购场景&#xff0c;采取不同寻源策略&#xff0c; 实现采购寻源线上化管控&#xff1b;同时支持公域和私域寻源。 询价比价 全程线上询比价&#xff0c;信息公开透明&#xff0c;可…

Ubuntu 安装和配置 Samba服务开启共享文件夹

1、 客户端&#xff1a;windows10 服务端&#xff1a;ubuntu18.04 目的&#xff1a;从ubuntu上共享一个文件夹给windows访问 2、安装Sanba sudo apt install samba 3、查看版本号验证安装是否成功 smbd --version 4、创建一个文件夹&#xff0c;用来共享 sudo mkdir /…

拼多多商品数据如何通过api接口获取

要从拼多多获取商品数据&#xff0c;可以使用拼多多提供的API接口。首先需要注册一个拼多多开放平台的开发者账号&#xff0c;然后创建一个应用程序&#xff0c;获取应用程序的app_id和app_secret&#xff0c;以在API请求中进行身份验证。 以下是一些获取拼多多商品数据的常用…

Java集合——Map接口学习总结

一、HashMap实现类 1.常用方法 增加&#xff1a;put(K key, V value)删除&#xff1a;clear() remove(Object key)修改&#xff1a;查看&#xff1a;entrySet() get(Object key) keySet() size() values()判断&#xff1a;containsKey(Object key) containsValue(Object value…

DateFormat使用时需要注意:多线程下需要特殊处理

前言 工作或学习过程中难免会接触到时间&#xff08;Date&#xff09;相关的内容&#xff0c;比如String类型转为Date类型&#xff0c;或者Date类型转为String类型&#xff0c;jdk为我们提供了一套完善的日期格式化工具&#xff0c;DateFormat类&#xff0c;使用者可以使用该接…

MECE原则

MECE原则 MECE原则|是麦肯锡咨询顾问芭芭拉•明托在《金字塔原理》中提出的一个思考工具。 原则介绍 它是Mutually Exclusive CollectivelyExhaustive的缩写&#xff0c;意思是 “相互独立&#xff0c;完全穷尽〞&#xff0c;也常被称为〞不重叠&#xff0c;不遗漏”。应用MEC…

MJ基础入门之注册:超详细注册 Midjourney 及使用方法

如何注册并使用 Midjourney Midjourney是一款优秀的AI图像生成工具&#xff0c;它的综合能力十分强大且易于上手。使用Midjourney&#xff0c;您可以在一分钟内生成4张图像&#xff0c;这是非常快的。不仅如此&#xff0c;国外的很多图像创作者都在使用Midjourney&#xff0c;并…

最值得学的编程语言是哪个?

如果让我推荐的话&#xff0c;我肯定首选是python啦&#xff01; 编程语言是一个计算机的概念&#xff0c;在我们有了计算机以后&#xff0c;想让它帮助我们做事情&#xff0c;就要通过计算机语言和它进行对话、交互&#xff0c;计算机语言能够被计算机所执行&#xff0c;完成…

电脑高效率工作、学习工具软件推荐

本文介绍在学习、工作时&#xff0c;实测很好用、明显提高工作效率的几个免费电脑软件与小工具。 1 Microsoft To Do 官方网站&#xff1a;https://todo.microsoft.com/tasks/ Microsoft To Do是一款由Microsoft公司开发的待办事项管理应用程序。它提供了一个简单易用的界面&a…

你买票了吗?五一火车票发售量创历史新高,车票总发售2209万张票

五一劳动节已经成为了除春节国庆节外最隆重的节日&#xff0c;是全国性的庆祝节日。在这个节日里&#xff0c;人们可以通过旅游、购物、娱乐等方式来放松身心&#xff0c;充满活力地迎接新的挑战。同时&#xff0c;五一假期也成为了国内外客流量最大的旅游黄金周之一&#xff0…