LinK3D论文详解

news2024/9/22 5:24:00

摘要

        特征提取和匹配是许多计算机视觉任务的基本部分,例如二维或三维物体检测、识别和配准。众所周知,二维特征提取和匹配已经取得了很大的成功。遗憾的是,在3D领域,由于描述能力差和效率低,目前的方法无法支持3D激光雷达传感器在视觉任务中的广泛应用。为了解决这一局限性,我们提出了一种新的3D特征表示方法:用于3D LiDAR点云的线性关键点表示,称为LinK3D。LinK3D的新颖之处在于它充分考虑了LiDAR点云的特点(如场景的稀疏性、复杂性),并用其健壮的相邻关键点来表示当前关键点,这对当前关键点的描述提供了强大的约束。提出的LinK3D已在两个公共数据集(即KITTI和Steven VLP16)上进行了评估,实验结果表明,我们的方法在匹配性能方面大大优于现有技术。更重要的是,LinK3D显示了出色的实时性能(基于LiDAR的10 Hz频率)。LinK3D从64射线激光束采集的点云中提取特征平均只需32毫秒,在配备Intel Core i7@2.2 GHz处理器的笔记本电脑中执行时,匹配两次LiDAR扫描只需约8毫秒。此外,我们的方法可以广泛扩展到各种三维视觉应用。在本文中,我们将LinK3D应用于3D注册、LiDAR里程计和地点识别任务,并与最先进的方法相比取得了具有竞争力的结果。
        关键词:三维激光雷达点云,特征提取、匹配、高效,可扩展到三维视觉任务。

图1. 描述了LinK3D的核心思想和匹配结果。图1展示了基于LinK3D两次激光雷达扫描的匹配结果,其中绿线表示有效的匹配项。当前关键点的描述符用其相邻的关键点表示,描述符的每个维度对应一个扇区(180个扇区对应180个维度)。第一个维度对应当前关键点最接近的关键点所在的扇区,其他维度对应逆时针排列的区域。如果扇区中有关键点,则搜索扇区中最接近的。

提出的方法

        我们方法的流程图主要由两部分组成:特征提取(即关键点提取和描述符生成,如图 2 所示)和特征匹配。如图 2 所示,首先提取LiDAR扫描的边缘点,然后将其输入边缘关键点聚合算法,在该算法中提取稳健的聚合关键点,以便随后生成描述符。然后,描述符生成算法首先建立距离表和方向表,用于快速描述符生成。我们将在以下三个小节中分别详细介绍所提出方法的每个部分。

图2. 展示了LinK3D在关键点提取和描述方面的工作流程。首先,输入的点云被关键点提取算法处理。然后,执行LinK3D描述以获得高效的关键点描述符。

A. 关键点提取

1) edge边缘点提取:在关键点提取中,我们使用类似于2D图像关键点的策略,即角点或边缘点。在这里,我们还提取了代表性的边缘点作为三维激光雷达扫描的关键点。激光雷达扫描大致可分为两种类型:边缘点和平面点。边缘点和平面点之间的主要区别在于点所在的局部曲面的平滑度

 $\nabla_i=\frac{1}{|S|}\left\|\sum_{j \in P_s, j \neq i}\left(\vec{p}_j-\vec{p}_i\right)\right\|^2$

图3. (a) 中的分散边缘点(用红色虚线框标记)和聚集边缘关键点(用蓝色虚线框标识)。聚集边缘关键点就是我们所需要的。(b)显示了通过算法1提取的边缘关键点。

2) edge关键点聚类:然而,在收集边缘点的过程中,通常有许多点高于阈值但不稳定。具体来说,这些不稳定点出现在当前扫描中,但可能不会出现在下次扫描中。如图 3a 中红色虚线框所示,不稳定点通常是分散的。如果我们利用这些点进行匹配,很可能会导致不匹配。因此,有必要过滤掉这些点并找到正的有效边关键点。如图 3a 中的蓝色虚线框所示,有效的边缘关键点通常垂直分布在簇中。

具体做法是,我们首先将以LiDAR坐标系原点为中心的水平面平均划分为 N_{\text {sect }} 扇区,然后只对每个扇区中的点进行聚类。应该注意的是,当我们在实验中设置 N_{\text {sect }}=120 时,我们的算法运行速度大约是经典KMeans的25倍[47]。提取的边缘关键点如图 3b 所示。可以观察到,我们的算法可以过滤掉无效的边缘点,并找到正的有效边缘关键点。此外,计算每个簇点的质心并将其命名为聚合关键点,该关键点可以表示其簇并用于后续的描述符生成。

B. 描述符生成

图4展示了以当前关键点ko为中心的水平平面被划分为180个扇形区域。我们首先搜索k0的最近关键点k1,然后主方向是从k0到k1的向量。此外,第一个扇形区域由主方向对半分。其他区域按逆时针顺序排列。当前关键点(Current Keypoint,CK)是指正在处理的LiDAR扫描中的一个关键点。即每个关键点都有对应的描述符。100个关键点有100个描述符。

        在描述符生成中,首先将所有聚集关键点投影到水平面,这样可以消除聚集边缘关键点沿垂直方向分布不均匀所带来的影响。为了快速匹配,我们的LinK3D表示为多维向量,它使用0或当前关键点与其相邻关键点之间的距离作为每个维度。图 4 所示,我们将水平面划分为以当前关键点 k0 为中心的180个扇区,描述符的每个维度对应一个扇区。受二维描述符SIFT[10]的启发,该描述符搜索主方向以确保姿势不变性,LinK3D的主方向也被搜索并表示为从当前关键点 k0 到其最近关键点 k1 的方向矢量,该关键点位于第一扇区。其他扇区按逆时针顺序排列。然后,在每个扇区中搜索最近的关键点 k0 。如果存在最近的关键点,则使用当前关键点和最近关键点之间的距离作为描述符的相应值,否则,该值设置为0

在此过程中,从当前点到其他点 $k_i(i \neq 1)$的方向表示为 $\vec{m}_{0 i}$,我们使用$\vec{m}_{0 i}$和主方向$\vec{m}_{0 1}$之间的角度来确定 $k_i$ 属于哪个扇区。该角度的计算公式为:

$\theta_i= \begin{cases}\arccos \frac{\vec{m}_{01} \cdot \vec{m}_{0 i}}{\left|\vec{m}_{01}\right|\left|\vec{m}_{0 i}\right|} & \text { if } D_i>0 \\ 2 \pi-\arccos \frac{\vec{m}_{01}}{\left|\vec{m}_{01}\right|\left|\vec{m}_{0 i}\right|} & \text { if } D_i<0\end{cases}$

其中 $D_i$ 定义为:

$D_i=\left|\begin{array}{ll}x_1 & y_1 \\ x_i & y_i\end{array}\right|$

        上述算法有两个主要问题。一个问题是算法对最近的关键点敏感。如果存在异常关键点的干扰,匹配将失败。另一个问题是,我们必须经常计算两点之间的相对距离和方向,因此会有大量重复计算。为了解决第一个问题,我们搜索一定数量的最近关键点(具体数量在实验部分评估)。假设我们搜索3个最接近的关键点,并计算出相应的3个关键点描述符,如图 5 所示。Des1对应于最接近的键点,Des3对应于第三个最近的键点。我们根据这三个距离值定义优先级。Des1的优先级最高,因为它距离最近,Des3的优先级最低,因为它距离最远。最终描述符中每个维度的值对应于其中优先级最高的非零值。如图 5 中红色虚线框所示,Des1有一个非零值$D_0^1$ ,那么由于它的高优先级,它在最终描述符中的对应值也被设置为 $D_0^1$ 。其他两种情况如图 5 中的紫色和黑色虚线框所示。它大大提高了LinK3D对异常值的鲁棒性。为了解决第二个问题,我们建立了距离表,所有关键点的方向表都可以通过直接参考表来获得,以避免重复计算。

 图5 最终描述符中每个维度的值对应于Des1、Des2和Des3中具有最高优先级的非零值。

C. 匹配两个描述符

        在本节中,我们将介绍匹配算法。为了快速测量两个描述符的相似性,我们采用类似于汉明距离的计算方法来定义两个LinK3D描述符的相似分数。它们都计算相应的尺寸。然而,与汉明的异或运算不同,我们只计算了两个描述符的非零维数。具体来说,在两个描述符中计算相应非零维度之间的差值的绝对值。如果该值低于0.2,则相似性分数增加1。如果匹配的相似性分数高于阈值,则认为匹配有效。具体匹配算法见算法 3

实验

        在本节中,我们对我们的方法和最先进的功能进行了一些基本测试和比较,然后评估了一些扩展应用,以证明我们方法的优越性。

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

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

相关文章

uniapp在微信开放平台创建移动应用时,如何生成应用签名的问题

包名在打包的时候是必填项&#xff0c;就不多赘述了… 微信开放平台获取应用签名&#xff0c; 场景&#xff1a; 首先需要在手机或者模拟器上下载签名生成工具&#xff0c;下载地址&#xff1a;下载签名生成工具 然后手机打开&#xff0c; 在这里输入你的app打包时的包名&…

【雕爷学编程】Arduino动手做(148)---MD-PS002压力传感器模块

37款传感器与执行器的提法&#xff0c;在网络上广泛流传&#xff0c;其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块&#xff0c;依照实践出真知&#xff08;一定要动手做&#xff09;的理念&#xff0c;以学习和交流为目的&am…

[解决方案] 在linux运行python代码报错(Illegal instruction (core dumped))

PVE修改CPU类型 在运行Python代码时遇到"Illegal instruction (core dumped)"错误时&#xff0c;意味着你的代码尝试在当前CPU架构不支持的指令上运行 1. 利用lscpu命令查看宿机和虚拟机CPU架构&#xff0c;确定宿机和虚拟机是否支持avx指令集 可以发现宿机是支持avx…

暑期学JavaScript【第四天】

日期对象 创建 //创建 const date new Date(); // 默认使用现在时间常用方法 时间戳的获取方式 date.getTime()new Date()Date.now() 倒计时案例 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta htt…

Redis初步认识

1、概述 redis是一款高性能的NOSQL系列的非关系型数据库&#xff1b; 2、什么是NOSQL&#xff1f; NOSQL(NoSQLNotOnlySQL)&#xff0c;意即“不仅仅是SQL”&#xff0c;是一项全新的数据库理念&#xff0c;泛指非关系型的数据库随着互联网web2.0网站的兴起&#xff0c;传统…

Java中常见的线程池以及ThreadPoolTaskExecutor和ThreadPoolExecutor

线程池的基本组成&#xff1a; 线程管理器&#xff1a;用于创建并管理线程池&#xff0c;负责线程池的创建、销毁以及任务的添加。 工作线程&#xff1a;线程池中的线程&#xff0c;负责执行任务&#xff0c;没有任务时处于等待状态。 任务接口&#xff1a;每个任务必须实现的…

gen1-视频生成论文阅读

文章目录 摘要贡献算法3.1 LDM3.2 时空隐空间扩散3.3表征内容及结构内容表征结构表征条件机制采样 3.4优化过程 实验结果结论 论文&#xff1a; 《Structure and Content-Guided Video Synthesis with Diffusion Models》 官网&#xff1a; https://research.runwayml.com/ge…

aliyun-oss-sdk阿里云OSS视频上传(断点续传)前端实现

问题背景 最近上传视频的功能&#xff0c;突然炸了&#xff0c;两年没动的代码&#xff0c;突然不行辽&#xff0c;首次上传成功&#xff0c;后面继续上传就可以&#xff0c;但凡有一次上传失败&#xff0c;再上传文件就不行。 这里博主使用的是凭证上传方式哈。 凭证上传 …

CMU 15-445 -- Hash Tables - 04

CMU 15-445 -- Hash Tables - 04 引言Hash TablesHash FunctionsHashing Scheme小结 Dynamic Hash TablesChained Hashing (链式哈希)Extendible Hashing(可扩展哈希)Linear Hashing(线性哈希) 总结 引言 本系列为 CMU 15-445 Fall 2022 Database Systems 数据库系统 [卡内基梅…

【IDA疑难杂症修复】

我们在使用IDA进行逆向分析的时候&#xff0c;会遇到一些问题&#xff0c;这篇文章来带领大家学习IDA中疑难杂症的修复&#xff1a;函数大小限制&#xff0c;栈不平衡&#xff0c;switch无法识别&#xff08;跳转表修复&#xff09;&#xff0c;ida Decompile as call。 一.函…

Redis学习(一)数据类型、Java中使用redis、缓存概念

文章目录 常用数据结构String类型Hash类型List类型Set类型SortedSet 类型 通用命令key的层级结构 Spring Data Redis快速入门RedisTemplate的序列化方式StringRedisTemplateRedisTemplate的Hash类型操作 实战操作短信登录发送验证码校验登录信息校验登录状态 商家查询缓存缓存更…

antdesignpro组件Upload传excel文件到后端flask的两种方案

&#xff08;特别提醒&#xff1a;后端xlrd新版本不支持xlsx文件&#xff0c;所以暂用xls文件进行上传&#xff09; 1.第一种方案&#xff1a;组件接收到excel文件,然后解析成list数据&#xff0c;解析是要用到XLSX&#xff08; 安装插件&#xff1a;npm i xlsx --save impor…

【Leetcode】21.合并两个有序链表

一、题目 1、题目描述 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例1: 输入:l1 = [1,2,4], l2 = [1,3,4] 输出:[1,1,2,3,4,4]示例2: 输入:l1 = [], l2 = [] 输出:[]示例3: 输入:l1 = [], l2 = [0] 输…

Cesium 常用标绘线、面、矩形、圆、曲面、曲线、攻击箭头、钳击箭头,标绘与修改。

前言&#xff1a;直接放效果图&#xff0c;符合就往下看&#xff0c;不符合出门右转。 由于篇幅有限&#xff0c;只贴出各个标绘的关键代码。 1、线段 基于坐标点&#xff0c;加载不同的材质。 //动态加载 const entity this._viewer.entities.add({polyline: {positions: …

K8S网络管理

这里写目录标题 1 网络管理1.1Service1.1.1 网络体系1.1.2 工作模型1.1.3 SVC实践1.1.4 IPVS实践 1.2 其他资源1.2.1 域名服务1.2.2 CoreDNS1.2.3 无头服务 1.3 flannel方案1.3.1 网络方案1.3.2 flannel1.3.3 主机网络 1 网络管理 1.1Service 1.1.1 网络体系 学习目标 这一…

Shell脚本 中运行sudo命令

在shell脚本中有时需要使用sudo进行提权&#xff0c;运行包含这类脚本的文件时通常需要我们在终端输入sudo密码&#xff0c;但是在一些无人值守的应用中显然就不太适合了。本文通过构建一个多用户的ubuntu操作环境&#xff0c;来展示脚本中需要使用sudo命令时的应用场景。 我们…

基于vue3+vite+ts,使用nexus发布组件库

1、前提条件 已部署nexus3&#xff0c;可参考&#xff1a; Ubuntu部署和体验Nexus3-腾讯云开发者社区-腾讯云 代理设置&#xff1a; 【Nexus】通过Nexus搭建Npm私库_猫巳的博客-CSDN博客 Docker 是一个开源的应用容器引擎&#xff0c;让开发者可以打包他们的应用以及依赖包到一…

Java --- springboot3之可观测性

目录 一、可观测性 二、定制健康监控的端点 三、定制metrics 四、整合PrometheusGrafana 一、可观测性 导入pom依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId></d…

如何从PCB上直接启动Power DC直流压降仿真分析工具

如何从PCB上直接启动Power DC直流压降仿真分析工具 POWER DC的启动除了可以通过POWER DC.exe直接启动外,还可以直接通过Allegro的PCB界面直接启动,二者软件是支持关联的。如何启动,具体操作如下 用166或者172版本打开PCB点击File点击Change Edi

JVM源码剖析之JVM层面调用Java方法

先看以下2个案例。 Runnable runnable () -> {System.out.println(1); }; new Thread(runnable).start(); 为什么调用Thread的start方法就能执行Runnable的代码&#xff1f; public static void main(String[] args) {System.out.println(1); } 作为Java开发者&#x…