文章目录
1. 概要
一句话:第一篇基于深度学习的点云点特征的点云检索文章
论文:https://arxiv.org/abs/1804.03492
代码:https://github.com/mikacuy/pointnetvlad
说明:原版代码是tensorflow的,github上有pytorch版本,可自行寻找使用哈。
2. 动机
首先普及一下,场景识别是点云检索的一种实例。主要针对自动驾驶当中,可识别当前场景是否在已规划路线当中并进行判断。
为什么要做点云 场景识别呢? 图像不就可以了嘛?
No,不然。看下面的图就知道了,图像在光线变化(白天、黑夜),或者一些季节变化之后,想要识别出来是非常困难的,肉眼都不一定能看出来是同一个地方。而点云呢,可以明显的看到不受这些影响,就很容易检索出来相同的场景。所以,需要对大场景下做 点云 场景识别。说白了,就是鲁棒性好。不受天气或光线的一些影响。
本质来讲,这篇文章是PointNet + NetVLAD 的结合 = 获取到能够具有全局表达性的点云特征,用来检索。
其中,使用PointNet来提取点云的特征,使用NetVLAD来编码这些特征。
很符合检索三个阶段
- 特征提取
- 特征编码
- 匹配
这篇文章着重在1&2上。3用了简单的ranking排序。
3. 方法
3.1 问题定义
假设数据库集合为M,点云队列为Q,我们的目标就是检索出点云队列Q当中的每个点云其在数据集合M当中结构最相似的一个。设计任务点有:
● 如何表达一副点云? 这就需要 获得 点云的 紧实表达的 特征
● 相似度如何衡量? 损失函数如何设置
3.2 整体网络框架
包括两大部分: PointNet部分 + NetVLAD部分。
然后最后在对这些编码后的特征压缩一下变成最终的全局特征描述子,这里用来最简单的max-pooling。
3.3 PointNet模块
去除最后一层使用,也就是没有用最后一层的max-pooling。
3.4 NetVLAD模块
分配到最优可能的聚类中心。来自于图像。
公式解析:每个局部特征的表达
- 一个点云 P = { p 1 , . . . , p N ∣ p n ∈ R 3 } P=\{p_1, ...,p_N| p_n\in \mathbb{R}^3\} P={ p1,...,pN∣pn∈R3}
- 输出特征 P ′ = { p 1 ′ , . . . , p N ′ ∣ p N ′ ∈ R D } P' = \{p'_1, ..., p'_N| p'_N\in \mathbb{R}^D\} P′={ p1′,...,pN′∣pN′∈RD}
- K K K个聚类中心:{ c 1 , . . . , c k ∣ c k ∈ R D c_1, ..., c_k | c_k \in \mathbb{R}^D c1,...,