CubeSLAM: Monocular 3D Object SLAM——论文简述

一、简介

提出一种在动态和静态环境中同时进行3D目标检测和定位建图的方法,并且能够互相提升准确度。具体地,对于3D目标,其位置、方向和尺寸通过slam进行了优化;而3D目标作为slam中的路标,可以提供额外的语义和几何约束,从而提升相机位姿估计并减少尺度漂移,且无需回环检测和假设相机的高度不变。
在这里插入图片描述

二、Single Image 3D Object Detection

3D box proposal generation

作者利用2D的bbox来生成3D的proposal,而非直接采样。对于一个3D的cuboid,用九个自由度进行表示:R、t以及长宽高(dx,dy,dz),其本身的坐标轴建立在中心位置。而2D的bbox只能提供四条边4个约束,这显然是不够的,因此需要用到物体尺寸和方向等其他信息。

本文没有依赖预测得到的长宽高来减少回归参数,而是采用vanishing point(在两个平行的线条中,两个线条会消失在远方的一点)。对于一个3D的cuboid,可以在xyz轴方向上形成3个VP。
在这里插入图片描述
其中K代表相机内参,R代表相对于相机坐标的旋转矩阵,col(i)代表R的第i列。

接下来需要基于得到的VP来获取3D cuboid的8个2D坐标。
在这里插入图片描述
如上所示,我们已经得到了估计的3个VP,仅需估计一个2D点,就可以通过两直线的交点,求出剩余的2D点。

求解3D物体的位姿时,需要区分两种情况:任意姿态物体和地面物体。

对于任意姿态物体,采用 PnP 来求解3D cuboid的位置和尺寸,但由于单目视觉的尺度不确定性,需要确定一个scale。在3D cuboid坐标系下,8个3D点可以表示为[±dx, ±dy, ±dz] / 2,从而3D到2D的投影关系为
在这里插入图片描述
其中π是相机投影函数。这里选择如2、3、4、5这样相邻关系的4个点,每个点提供2个约束,加上提前确定的scale,即可估计3D cuboid的位姿。

对于地面物体,在地平面上建立世界坐标系,那么物体的滚动角和俯仰角均为零,且scale由投影过程中的摄像机高度决定。我们可以直接将下方的2D点反向投影到三维地平面,然后计算其他3D角,形成一个3D cuboid。例如对于图(a)中的p5,用[n,m](相机坐标系下的法向量和距离)表示,其相应的3D点P5是反投影射线 K-1p5 与地平面的交点:
在这里插入图片描述
基于上述讨论,求3D物体的proposal转变为求3个VP及1个2D点。VP是由R决定的,可以通过大量的数据训练来直接预测,但本文选择手动采样,然后对它们进行评分排序,以达到普适性的目的。

对于任意姿态物体,需要对整个R进行采样,但对于地面物体,使用相机的滚动角/俯仰角(在数据集SUN RGBD和KITTI中已经提供)和物体的偏航角来计算R。对于视频数据,我们使用slam来估计相机的位姿。因此,采样空间大大缩小。在本文的实验中,只考虑地面物体

Proposal scoring

在这里插入图片描述
代价函数如下:
在这里插入图片描述
其中I代表图像,O代表3D cuboid的9个自由度R、t、d,w1和w2是权重参数,在对小样本数据集进行手动搜索后,设定 w1 = 0.8,w2 = 1.5。本文将损失分为三种:

Distance error:2D cuboid的边缘应与实际图像边缘相匹配。首先进行Canny边缘检测,及距离变换。然后对于每个可见的立方体边缘,对其上的10个点进行均匀采样,并将所有距离值除以2D box的对角线,原理与倒角距离类似。

Angle alignment error:Distance error对物体表面纹理等假阳性边缘非常敏感。因此,我们还用LSD检测长线段(如图 3 中的绿线所示),并测量其角度是否与VP一致。首先根据点-线关系,将这些线段与1个VP相关联。然后,对于每个VP,可以找到斜率最小和最大的两条线段,<a, b>表示具有两个端点a、b的直线的角度。
在这里插入图片描述
Shape error:前两个代价可以在2D图像空间中有效评估。为了生成更准确的3D proposal,惩罚具有较大长宽比的立方体。我们还可以应用更严格的先验,例如特定类型物体的估计尺寸或固定尺寸。
在这里插入图片描述
其中s代表最大长宽比,σ在实验中设置为1。

三、OBJECT SLAM

将单图像3D目标检测扩展到多视角object slam,以共同优化物体和相机位姿。该系统使用基于特征点的ORB SLAM2。需要使得BA共同优化目标、路标特征点和相机位姿。
在这里插入图片描述

Bundle Adjustment Formulation

BA可以表示为一个非线性最小二乘问题,为了改善鲁棒性,使用 Huber核函数:
在这里插入图片描述
其中C、O、P分别代表相机位姿、3D cuboid和路标点,Σ是不同误差测量值的协方差矩阵。可以使用GN或LM来解决优化问题。GN属于线搜索方法,先找到方向,再确定长度,HΔx=g;LM属于信赖区域方法(Trust Region),认为近似只在区域内可靠,(H+λI)Δx=g,相比于GN,能够保证增量方程的正定性,即认为近似只在一定范围内成立,如果近似不好则缩小范围,从增量方程上来看,可以看成一阶和二阶的混合,参数λ控制着两边的权重。

Measurement Errors

Camera-Object measurement:需要分为3D和2D。

对于3D,在三维物体检测准确的情况下使用。3D物体位姿可以表示为[Tom d]。为了计算3D物体的测量误差,将其转换到相机坐标系:
在这里插入图片描述
om:object measurement, log将SE3的误差映射到6DOF的切向量空间,所以e是9维的。

如果没有物体的先验模型,我们基于图像的cuboid检测就无法区分物体的正面或背面。例如,我们可以通过将物体坐标系旋转90度并交换长度和宽度值来表示相同的长方体。因此,我们需要沿高度方向旋转 0,±90,180,以找到最小误差。

对于2D,将路标投影到图像平面上来获得2D的bbox,然后与检测的bbox比较。简单来说,就是将8个角点投影到平面内,寻找最小和最大的投影像素x,y坐标来建立一个矩形框:
在这里插入图片描述
其中c是2D bbox的中心坐标,s是大小。所以可以得到2D下的co误差:
在这里插入图片描述
由于检测过程复杂,与点相比,误差协方差 Σ 或hessian矩阵 W 的建模和估计并不简单。 因此,我们简单地赋予几何接近对象更多的权重。假设cuboid-camera距离为 d,物体的 2D 检测概率为 p,那么我们可以在 KITTI 数据上定义 w = p × max(70 − d,0) / 50,其中 70m 是截断距离。 参数可能因不同的数据集而异。

Object-point measurement:两者之间可以互相提供约束,如果点 P 属于3D物体的对象,则它应该位于 3D cuboid内部。 因此,我们首先将点变换到3D cuboid坐标系,然后与cuboid尺寸进行比较,得到三维误差:
在这里插入图片描述
Camera-point measurement
在这里插入图片描述
zm 是 3D 点 P 的像素坐标。

Data association

跨帧数据关联是slam的另一个重要部分。与特征点匹配相比,物体关联似乎更容易,因为包含了更多的纹理,可以使用许多二维物体跟踪或模板匹配方法。 在一些简单的场景中,甚至二维方框重叠也可以work。 但是,如果存在严重的物体遮挡和重复物体,这些方法就不稳健了。此外,在目前的slam优化中,需要检测并移除动态物体,但标准的物体跟踪方法无法分类是否静态,除非使用特定的运动分割方法。
在这里插入图片描述
作者提出了另一种基于特征点匹配的物体关联方法。对于许多基于特征点的slam方法,不同视图中的特征点可以通过描述子匹配和对极几何检查进行有效匹配。因此,我们首先将特征点与对应的物体关联起来,条件是至少有两帧图像在二维物体边界框中观察到了特征点,且特征点与立方体中心的三维距离小于 1 米。

在公式 11 中计算 BA 过程中的对象点测量误差时,也会用到这种对象点关联。

如果不同帧中的两个物体之间共享的特征点数量最多,并且超过了一定的阈值(论文中为 10 个),我们就会匹配这两个物体。属于移动物体的动态特征点会被丢弃,因为无法满足对极约束。因此,相关特征点较少的物体被视为动态物体。

四、DYNAMIC SLAM

提出了一种联合估计相机位姿和动态物体轨迹的方法。对物体做了一些假设,以减少未知参数的数量,使问题变得可解。

常用的两个假设是:物体是刚性的,并遵循某种物理上可行的运动模型。

刚体假设:一个点在其相关物体上的位置不会随时间改变。这样,我们就可以利用重投影误差来优化其位置。
运动模型:最简单的形式是匀速恒定运动模型。对于某些特定物体(如车辆),还需要遵循nonholonomic wheel model(没有侧滑)。

使用“动态点”来指代与运动物体相关的特征点。对于运动物体 Oi 上的动态点 Pk,我们用 iPk 表示其在物体上的锚定位置,该位置基于刚性假设是固定的。其世界坐标系下的位姿会随时间变化,不适合slam优化。

动态物体估计的系数图如图 6 所示。蓝色节点是静态 SLAM 组件,红色节点代表动态物体、点和运动速度。绿色方格是测量因子,
如上图所示,绿色节点代表误差中的各项约束。有了这些因子,相机的位姿也可以通过动态元素来约束。

Object motion model:物体运动可以用变换矩阵T来表示。我们可以将T应用于之前的位姿,然后计算当前位姿误差。在这里,我们采用了nonholonomic wheel model,汽车运动由速度v和转向角Φ表示,根据先验假设,其变换矩阵为:
在这里插入图片描述
状态转移可以表示为:
在这里插入图片描述
其中 L 为前后车轮中心之间的距离。请注意,该模型要求 x、y、θ 定义在后轮中心,而我们的目标坐标系定义在车辆中心。这两个坐标系有 L/2 的偏移。最终的运动模型误差:
在这里插入图片描述

Dynamic point observation:动态点是锚定在相关物体上的,因此首先要将其转换到世界坐标系,然后再投射到相机坐标系上。假设第 k 个点在第 i 个物体上的位置为 iPk,而第 j 幅图像中的物体位姿为jToi,则该点的重投影误差为:
在这里插入图片描述
在数据关联方面,上节中针对静态环境的关联方法并不适用于动态情况,原因是难以匹配动态点特征。跟踪特征点的典型方法是描述子匹配,然后检查对极约束。然而,对于单目动态情况,很难准确预测物体和点的移动。

所以通过二维 KLT 稀疏光流算法直接跟踪特征点,不需要三维点位置。

假设两帧图像的投影矩阵分别为 M1、M2。这两个帧中的三维点位置分别为 P1、P2,对应的像素分别为 z1、z2。两帧之间的物体移动变换矩阵为 ∆T,那么我们可以推断出 P2 = ∆TP1。根据投影规则,我们可以得出:
在这里插入图片描述
可以用 SVD 求解三角化。

当像素位移较大时,KLT 跟踪仍可能失败。因此,在动态目标跟踪中,直接使用视觉物体跟踪算法。首先跟踪物体的二维边界框,并根据上一帧预测其位置,然后将其与当前帧中重叠率最大的检测边界框进行匹配。

五、实验

2D目标检测方面,采用yolo检测室内场景,ms-cnn检测室外场景。

slam方面采用ORB SLAM2。

展望一下,使用object建立稠密图,更全面的场景理解等等。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【统计学精要】:使用 Python 实现的统计检验— 1/10

一、介绍 欢迎来到“掌握 Python 统计测试&#xff1a;综合指南”&#xff0c;它将介绍本手册中您需要熟悉使用 Python 的所有基本统计测试和分析方法。本文将为您提供统计测试及其应用的全面介绍&#xff0c;无论您是新手还是经验丰富的数据科学家。 使用来自现实世界的实际示…

stable diffusion(1): webui的本地部署(windows)

一、前言 是的&#xff0c;现在是202308月份了&#xff0c;网上已经有很多打包好的工具&#xff0c;或者直接进一个web就能用SD的功能&#xff0c;但是我们作为程序员&#xff0c;就应该去躺坑&#xff0c;这样做也是为了能够有更多自主操作的空间。 像其他AI一样&#xff0c…

【链表OJ 3】链表的中间结点

前言: 本文收录于http://t.csdn.cn/n6UEP数据结构刷题的博客中,首先欢迎大家的来访&#xff0c;其次如有错误&#xff0c;非常欢迎大家的指正&#xff01;我会及时更正错误&#xff01; 目录 一.链表的中间结点 1.1原理:快慢指针的使用 链表元素个数为奇数时 链表元素个数…

SQL注入实操三(SQLilabs Less41-65)

文章目录 一、sqli-labs靶场1.轮子模式总结2.Less-41 stacked Query Intiger type blinda.注入点判断b.轮子测试c.获取数据库名称d.堆叠注入e.堆叠注入外带注入获取表名f.堆叠注入外带注入获取列名g.堆叠注入外带注入获取表内数据 3.Less-42 Stacked Query error baseda.注入点…

【小沐学C++】C++ 基于CMake构建工程项目(Windows、Linux)

文章目录 1、简介2、下载cmake3、安装cmake4、测试cmake4.1 单个源文件4.2 同一目录下多个源文件4.3 不同目录下多个源文件4.4 标准组织结构4.5 动态库和静态库的编译4.6 对库进行链接4.7 添加编译选项4.8 添加控制选项 5、构建最小项目5.1 新建代码文件5.2 新建CMakeLists.txt…

一、1.汇编指令、寄存器和寻址方式

立即数&#xff1a;可以立即在一条机器指令后找到具体数值的数&#xff0c;如内存中00位写着加指令&#xff0c;01位写着1100_1111&#xff0c;意思就是将1100_1111&#xff08;十进制207&#xff09;加到某处&#xff0c;反之可以表示数据的地址。 低端字节序&#xff1a;16位…

Java实现数字加密

Java实现数字加密 需求分析代码实现小结Time 需求分析 1.首先&#xff0c;考虑方法是否需要接收数据处理&#xff1f; 需要一个4位数&#xff0c;至于是哪一个数&#xff0c;让方法的调用者传递。 所以&#xff0c;方法的参数&#xff0c;就是这个需要加密的四位数 2.接着&…

nsqd的架构及源码分析

文章目录 一 nsq的整体代码结构 二 回顾nsq的整体架构图 三 nsqd进程的作用 四 nsqd启动流程的源码分析 五 本篇博客总结 在博客 nsq整体架构及各个部件作用详解_YZF_Kevin的博客-CSDN博客 中我们讲了nsq的整体框架&#xff0c;各个部件的大致作用。如果没看过的&…

【websocket - Tornado】简易聊天应用

1、背景 项目测试的过程中需要自己搭建一个webscoket站点,确保此类服务接入后台系统后访问不受影响。python的服务框架常用的有Flask、Django、Tornado,每个框架的侧重点不同,导致使用的场景就会有所差异。 Flask轻量级,采用常规的同步编程方式,需要安装其他模块辅助,主…

Pytest测试框架2

目录&#xff1a; pytest参数化用例pytest标记测试用例pytest设置跳过、预期失败用例pytest运行用例pytest测试用例调度与运行pytest命令行常用参数python执行pytestpytest异常处理 1.pytest参数化用例 参数化 通过参数的方式传递数据&#xff0c;从而实现数据和脚本分离。…

并网逆变器学习笔记6---三电平SVPWM下的连续和不连续调制

之前在学习中总结过一次DPWM策略选择&#xff1a;并网逆变器学习笔记5---三电平DPWM 但是对于三电平逆变器而言&#xff0c;如何从连续调制切换到不连续调制&#xff0c;存在一些疑惑点&#xff0c;下午闲来无事&#xff0c;把SVPWM下的连续调制和不连续调制的开关状态选择&am…

MyCat核心概念、需求案例讲解、环境准备及分片配置

1.MyCat概念介绍 2.MyCat入门需求 2.1 需求分析 2.2 环境准备 输入以下命令检查服务器防火墙状态 dead代表关闭状态&#xff0c;如果不关闭也可以需要开放特定的端口号&#xff01;&#xff01; systemctl status firewalld接着需要在三台服务器上的MySQL上创建三个数据库db0…

(树) 剑指 Offer 36. 二叉搜索树与双向链表 ——【Leetcode每日一题】

❓ 剑指 Offer 36. 二叉搜索树与双向链表 难度&#xff1a;中等 输入一棵二叉搜索树&#xff0c;将该二叉搜索树转换成一个 排序的循环双向链表。要求不能创建任何新的节点&#xff0c;只能调整树中节点指针的指向。 为了让您更好地理解问题&#xff0c;以下面的二叉搜索树为…

相机传感器格式与镜头光圈参数

相机靶面大小 CCD/CMOS图像传感器尺寸&#xff08;sensor format&#xff09;1/2’‘、1/3’‘、1/4’实际是多大 1英寸——靶面尺寸为宽12.7mm*高9.6mm&#xff0c;对角线16mm。 2/3英寸——靶面尺寸为宽8.8mm*高6.6mm&#xff0c;对角线11mm。 1/2英寸——靶面尺寸为宽6.…

SSE技术和WebSocket技术实现即时通讯

文章目录 一、SSE1.1 什么是SSE1.2 工作原理1.3 特点和适用场景1.4 API用法1.5 代码实现 二、WebSocket2.1 什么是WebSocket2.2 工作原理2.3 特点和适用场景2.4 API用法2.5 代码实现 三、SSE与WebSocket的比较 当涉及到实现实时通信的Web应用程序时&#xff0c;两种常见的技术选…

网络安全【黑客技术】自学

1.网络安全是什么 网络安全可以基于攻击和防御视角来分类&#xff0c;我们经常听到的 “红队”、“渗透测试” 等就是研究攻击技术&#xff0c;而“蓝队”、“安全运营”、“安全运维”则研究防御技术。 2.网络安全市场 一、是市场需求量高&#xff1b; 二、则是发展相对成…

每天五分钟机器学习:梯度下降算法和正规方程的比较

本文重点 梯度下降算法和正规方程是两种常用的机器学习算法,用于求解线性回归问题。它们各自有一些优点和缺点,下面将分别对它们进行详细的讨论。 区别 1. 梯度下降算法是一种迭代的优化算法,通过不断迭代调整参数来逼近最优解。它的基本思想是根据目标函数的梯度方向,沿…

openGauss学习笔记-32 openGauss 高级数据管理-批处理模式

文章目录 openGauss学习笔记-32 openGauss 高级数据管理-批处理模式32.1 语法格式32.2 参数说明32.3 示例 openGauss学习笔记-32 openGauss 高级数据管理-批处理模式 openGauss支持从文本文件执行SQL语句。openGauss提供了gsql工具实现SQL语句的批量处理。 以下场景建议使用批…

测试人员简单使用Jenkins

一、测试人员使用jenkins干什么&#xff1f; 部署测试环境 二、相关配置说明 一般由开发人员进行具体配置 1.Repository URL&#xff1a;填写git地址 2.填写开发分支&#xff0c;测试人员可通过相应分支进行测试环境的构建部署 当多个版本并行时&#xff0c;开发人员可以通过…