KKHouse Blog

PointNetVLAD:Deep Point Cloud Based Retrieval for Large-Scale Place Recognition

PointNetVLAD: Deep Point Cloud Based Retrieval for Large-Scale Place Recognition(CVPR2018)

本文主要是使用纯激光的信息去做场景的检索,问题有别于回环检测但是方法的思想有相似之处可以借鉴,并且文章结合了pointnet。

三维场景的检索可以理解为已经拥有了某一区域的三维点云信息,当物体在其他任何时间、任何季节经过某一场景的时候能够识别出来,也就是”where am I in a given reference map”。

1

简单回顾

文章方法介绍

先做问题的一些假设和定义,假设现在已有某区域的reference map $\mathcal{M}$,其中的三维点云是相对于一个固定的全局坐标系而建立。接着通过某一种切割的方式将这个$\mathcal{M}$切成$M$块使得每一块场景覆盖的区域基本相同,然后通过降采样将每个场景的点云的数量变为相同的。

2

3

对于query场景$q$来说,它有N个点,将这N个点输入到下面的框架中得到该场景的全局描述子:

4

该框架主要由两个部分组成,Pointnet和NetVLAD。接下来分别讲解一下这两个部分,首先我们有一片输入的点云$P={p_1,…,p_N}$,经过pointnet的学习框架得到高维的逐点特征,假设有$D»3$维,则每个点对应一个$1\times D$的向量,则得到$P’ = {p’_1,…,p’_N}$,接下来进入NetVLAD部分,因为pointnet的缺陷是不能很好得到点云局部的信息,所以作者采用的聚类的方式,NetVLAD将$P’$作为输入分别走两条线最后合成VLAD core,首先通过聚类得到$K$个聚类中心${c_1,…,c_K | c_k\in \mathbb{R}^D}$(ps:从代码中发现,这里的$K$是固定的,也就是说提前就设定好了$K$的值,个人觉得这样的处理方式不妥,因为不是每个submap都适合分成相同数量的聚类集合),然后对于每一个$p’_i$,其与聚类中心$k$联系是否紧密,通过softmax得到一个$[0,1]$之间的概率 最后再把$P’$和系数$a$以及聚类中心组合起来形成VLAD core 输出$(D\times K)$维特征向量$V(P’) = [V_1(P’),…,V_k(P’)]$。最后通适当降维(这里降维是因为直接输出的特征向量维数太高,会影响计算时间并且会包含冗余信息)和$L_2$normalization后得到该场景的全局描述符。

接下来介绍如何进行learning,文章提出了一种”Lazy Triplet”的三元组训练方式,对于某一区域,切割出了$M$块场景,对于某一场景设为anchor point cloud,这些$M-1$块中存在一个场景跟它是structural similar,记为$P_{pos}$,还有一些不相似的,组成了集合${P_{neg}}$,最终形成三元组$\mathcal{T} = {P_a, P_{pos},{P_{neg}}}$。训练的目标是为了让相似的距离更近,不相似的距离更远 其中$[…]_+$ 是hinge loss,$\alpha$是一个平衡边界的常数。

最后再贴一张图形象解释这个切割reference map的过程

5

代码理解

本文的代码可以主要从三个部分去阅读,分别是数据集的预处理、文章方法框架的编写和训练部分的代码。