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

关键字:点云,大规模位置识别,深度学习



一、摘要和总结

基于点云的位置识别检索相比于基于图像,仍然是一个没有被开发和解决的问题,它很庞大,因为从一个点云中提取出局部特征描述符并且能够再之后被编码到一个全局的描述符用于检索任务是很困难的。因此,在这篇文章中,结合最近比较成功的深度网络,提出了PointNetVLAD来解决基于点云的位置识别搜索。主要有以下几个点:

  • 这个模型(PointNetVLAD)是现存的两个模型 PointNetNetVLAD 的组合,可以进行端到端的训练并且能够从一个给定的3D点云中提取出全局的描述符
  • 提出了一个损失函数:lazy triplet and quadruplet 来实现更容易辨别和泛化的全局描述符来处理检索任务
  • 对基于点云的检索任务创建基准数据集并且在此之上的实验结果也显示了模型的可行性

1、存在的问题

基于图像的位置识别的成功很大程度上归因于提取图像特征描述符的能力,比如说:SIFT,之后会被整合到词袋中来获得全局描述符。但是,并没有算法对雷达扫描提取和SIFT相似的局部特征,因此,它对于通过词袋方法来计算全局描述符去做基于雷达的位置识别是至关重要的。

2、优势

和图像相比,从激光雷达获取的几何信息对于极端的光照变化是不变的,比如早晚或者是不同的季节,也因此鲁棒性更好。从下图也可以看出光照和季节变换对点云数据几乎不会产生太大的影响
两对点云和真实图片信息

二、框架和方法

对于位置识别问题,通常的做法是:首先存储一个关于环境的地图作为一个关于3D点云从来自运动的结构的图像或者具有同时定位和建图的激光雷达扫描创建的数据库。给定一个局部场景的图像或是雷达扫描的查询,能够通过搜索数据库检索到最佳的匹配,然后告诉我们查询图像/扫描相对于参考地图的确切位姿。

1、问题的定义

  1. reference map M M M:一个关于固定参考帧的3D点云定义的数据库
  2. { m 1 m_{1} m1,…, m k m_{k} mk}:参考图(reference map)被分为 K K K个子图
  3. AOC:覆盖区域,所有子图的的覆盖区域认为是近似相同的,AOC( m 1 m_{1} m1) ≈ \approx AOC( m K m_{K} mK)
  4. ∣ m i ∣ |m_{i}| mi ≪ \ll ∣ M ∣ |M| M:每一个子图中的点的数量保持很少
  5. ϱ ( . ) \varrho(.) ϱ(.):一个下采样的过滤来确保所有下采样子图中点的数量是相同的, ∣ ϱ ( m 1 ) ∣ |\varrho(m_{1})| ϱ(m1) = ∣ ϱ ( m K ) ∣ |\varrho(m_{K})| ϱ(mK)

(1)对于一个给定的查询3D点云q,有AOC( q q q) ≈ \approx AOC( m i m_{i} mi) 和 ∣ ϱ ( q ) ∣ |\varrho(q)| ϱ(q) = ∣ ϱ ( m i ) ∣ |\varrho(m_{i})| ϱ(mi)目的是去数据库 M M M中检索子图 m ∗ m_{*} m使其与 q q q更相似。

(2)为了达到这个目的,通过定义的深度网络来学习一个函数 f ( . ) f(.) f(.),将把一个给定的下采样3D点云 p ˉ \bar{p} pˉ = ϱ ( p ) \varrho(p) ϱ(p) 映射到一个固定尺寸的全局描述符向量 f ( p ˉ ) f(\bar{p}) f(pˉ)且满足如下条件 d ( f ( p ˉ ) , f ( p ˉ r ) ) < d ( f ( p ˉ ) , f ( p ˉ s ) ) d(f(\bar{p}),f(\bar{p}_{r})) < d(f(\bar{p}),f(\bar{p}_{s})) d(f(pˉ),f(pˉr))<d(f(pˉ),f(pˉs)) d ( . ) d(.) d(.)表示距离函数。

(3)这样问题就会被简化为在数据库中检索子图 m ∗ m_{*} m ∈ \in M M M,使其全局描述符向量 f ( m ˉ ∗ ) f(\bar{m}_{*}) f(mˉ)和查询q的全局描述符向量 f ( q ˉ ) f(\bar{q}) f(qˉ)的距离最小,即 d ( f ( p ˉ ) , f ( m ∗ ˉ ) ) < d ( f ( q ˉ ) , f ( m ˉ i ) ) d(f({\bar{p}}),f(\bar{m_{*}})) < d(f(\bar{q}),f(\bar{m}_{i})) d(f(pˉ),f(mˉ))<d(f(qˉ),f(mˉi)) ∀ i ≠ ∗ \forall i\neq * i=

2、网络架构

下图是网络的结构图,整体的网络可以概括为三部分组成,分别为:PointNetNetVLAD 以及一个全连接网络,网络的输入和PointNet一样,是一个由一系列3D点组成的点云, P P P = { \{ { p 1 , . . . , p N ∣ p n ∈ R 3 {p_{1},...,p_{N} | p_{n} \in R^{3}} p1,...,pNpnR3 } \} },这里P是通过 ϱ ( . ) \varrho(.) ϱ(.)之后固定尺寸的点云。

PointNet的作用是:把每一个在输入点云中的点映射到一个更高维的空间中: P P P = { \{ { p 1 , . . . , p N ∣ p n ∈ R 3 {p_{1},...,p_{N} | p_{n} \in R^{3}} p1,...,pNpnR3 } \} } → \rightarrow P ′ P^{'} P = { \{ { p 1 ′ , . . . , p N ′ ∣ p n ′ ∈ R D {p^{'}_{1},...,p^{'}_{N} | p^{'}_{n} \in R^{D}} p1,...,pNpnRD } \} } D ≫ 3 D\gg3 D3,这里,PointNet可以看作一个组件能够学习到从每一个输入的3D点中提取一个D维的局部特征描述符

网络架构图
然后把这个输出的局部特征描述符传入NetVLAD层中去,NetVLAD层原本是用来提取局部图像特征的,但是这里通过传入点云的局部特征描述符到这个层中,同样也能整合到一个关于输入点云的全局的描述符向量

NetVLAD层学习K个集群中心,也就是视觉单词 { \{ { c 1 , . . . , c W ∣ c w ∈ R D {c_{1},...,c_{W} | c_{w} \in R^{D}} c1,...,cWcwRD } \} },并且输出一个 ( D × W ) (D\times W) (D×W)维的向量 V ( P ′ ) V(P^{'}) V(P),这个 V ( P ′ ) V(P^{'}) V(P) = [ V 1 ( P ′ , . . . , V W ( P ′ ) ] [V_{1}(P^{'},...,V_{W}(P^{'})] [V1(P,...,VW(P)]是一个局部特征向量的聚合表示,具体的计算公式如下: V k ( P ′ ) = ∑ i = 1 n e α w T p i ′ + b w ∑ k ′ e α w ′ T p i ′ + b w ′ ( p i ′ − c w ) V_{k}(P^{'}) = \sum_{i=1}^{n}\frac{e^{\alpha^{T}_{w}p^{'}_{i}}+b_{w}}{\sum_{k^{'}}e^{\alpha^{T}_{w^{'}}p^{'}_{i}}+b_{w^{'}}}(p^{'}_{i}-c_{w}) Vk(P)=i=1nkeαwTpi+bweαwTpi+bw(picw),其中 α \alpha α b b b是权重和偏置,且均可学习。

通过NetVLAD之后的输出是VLAD描述符,但是这个描述符仍然是一个高维的向量,在进行最近邻搜索的时候会产生很高的计算代价,所以在最后采用了全连接来进行降维压缩,然后通过L2归一化来产生最终的全局描述符向量。

3、度量、损失

(1)在训练的时候会从训练数据集中获取一系列的训练元组 τ = ( P a , P p o s , { P n e g } ) \tau = (P_{a},P_{pos},\left \{ P_{neg} \right \}) τ=(Pa,Ppos,{Pneg}),其中 P a P_{a} Pa P p o s P_{pos} Ppos { P n e g } \left \{ P_{neg} \right \} {Pneg}分别表示一个锚点点云,一个结构上与锚点相似的(“正”)点云,以及一组结构上与该锚点不同的(“负”)点云。
(2)损失函数被设计为最小化 P a P_{a} Pa P p o s P_{pos} Ppos的全局描述符向量之间的距离并最大化 P a P_{a} Pa和一些 P n e g P_{neg} Pneg ∈ \in { P n e g } \left \{ P_{neg} \right \} {Pneg}的全局描述符向量之间的距离

  • Lazy triplet:这个和正常的triplet loss的形式基本相似,这里不过多的介绍了,需要说明的是,在进行最大值操作的时候,会选择在(“负”)点云 P n e g P_{neg} Pneg ∈ \in { P n e g } \left \{ P_{neg} \right \} {Pneg} 中最近的 P n e g P_{neg} Pneg 使得在一个特定的迭代中,计算的距离最小,但最近的 P n e g P_{neg} Pneg 对于每一个训练元组都会发生改变,因为确定 f ( . ) f(.) f(.) 的网络参数在训练期间中会更新,因此在 { P n e g } \left \{ P_{neg} \right \} {Pneg}中一个不同的点云可能在每次迭代中被映射到一个最接近 P a P_{a} Pa的全局描述符
  • Lazy quadruplet:在介绍 lazy triplet 的时候,选择最大化 f ( P a ) f(P_{a}) f(Pa) 和最近的 f ( P n e g ) f(P_{neg}) f(Pneg) 之间的距离可能会导致在最近的 f ( P n e g ) f(P_{neg}) f(Pneg) 和另一个点云 f ( P f a l s e ) f(P_{false}) f(Pfalse) 之间的距离出现我们不希望的减少,这个 P f a l s e P_{false} Pfalse 是在结构上和最近的 P n e g P_{neg} Pneg相似。为了缓解这个问题,会最大化另一个距离: d ( f ( P n e g ∗ ) , f ( P n e g k ) ) d(f(P_{neg*}),f(P_{negk})) d(f(Pneg),f(Pnegk)),然后将这一项与之前的triplet一起组成quadruplet loss,具体形式不在这里说明,详细公式见论文。这一个部分感觉和 triplet loss 的相关改进类似。

小结

整篇论文理解起来不是特别困难,主要还是模型的组合以及增加的损失项的内容,相关内容像NetVLAD以及几何验证等在这里不进行详细说明,有机会会对论文进行单独介绍,谢谢!!

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐