【点云系列】MinkLoc3D: Point Cloud Based Large-Scale Place Recognition

1. Motivation

PointNet架构不能够很好的捕获局部几何结构 且不足够有效

2. Method

网络架构主要有两部分组成:局部特征提取网络 + 池化层

局部特征提取网络:

为了捕获局部特征,且有更好的语义内容,使用Feature Pyramid Network(FPN)架构。

池化层:

使用了一个简单的Generalized-Mean poolint层,来替代NetVLAD以聚合局部特征到一个可区分的全局特征。

3. Implement details

预处理:

输入:点云 P = { ( x i , y i , z i ) } P=\{(x_i, y_i, z_i)\} P={(xi,yi,zi)}
操作:稀疏量化,使用MinkowskiEngine.SparseTensor进行操作
输出:单通道稀疏的表达 P ^ = { ( x ^ i , y ^ i , z ^ i , 1 ) } \hat{P}=\{(\hat{x}_i, \hat{y}_i, \hat{z}_i, 1)\} P^={(x^i,y^i,z^i,1)}。对于非空的体素,这个通道取值为1。

特征提取:

输入:稀疏化后的点云 P ^ = { ( x ^ i , y ^ i , z ^ i ) } \hat{P}=\{(\hat{x}_i, \hat{y}_i, \hat{z}_i)\} P^={(x^i,y^i,z^i)}
操作:局部特征提取
输出:稀疏3D特征图 F ^ = { ( x ^ j , y ^ j , z ^ j , f j ( 1 ) , . . . , f j ( c ) ) } \hat{F}=\{(\hat{x}_j, \hat{y}_j, \hat{z}_j, f^{(1)}_j, ..., f^{(c)}_j)\} F^={(x^j,y^j,z^j,fj(1),...,fj(c))}, 其中 c c c表示特征维度(实验当中选取256, j j j表示第几个点云对应的特征)

局部特征提取描述
自底向上:4个卷积块, 目的是降低空间尺寸,同时增加感受野。
自顶向下:1个transposed卷积来生成上采样特征图。同时拼接了跳接层。
设计缘由:高的空间分辨率 & 大的感受野。
在这里插入图片描述
局部特征提取部分每层细节如下:

  • Conv01个卷积层(32个kernels,大小为5x5x5,stride=1)
  • Conv11个卷积层(32个kernels,大小为2x2x2,stride=2 )+ 2个一样残差层(32个kernels,大小为3x3x3, stride=1)
  • Conv21个卷积层(64个kernels,大小为2x2x2,stride=2 )+ 2个一样残差层(64个kernels,大小为3x3x3, stride=1)
  • Conv31个卷积层(64个kernels,大小为2x2x2,stride=2 )+ 2个一样残差层(64个kernels,大小为3x3x3, stride=1)
  • 1x1Conv2: 1个卷积层 (256个kernels,大小为1x1x1, stride=1)
  • 1x1Conv3: 1个卷积层(256个kernels,大小为1x1x1, stride=1)
  • TConv3: 1个transposed卷积层(256个kernels,大小2x2x2, stride=2)

在这里插入图片描述
具体来讲怎么做的呢,要参考 Feature Pyramid Networks for Object Detection这篇文章。
在这里插入图片描述

特征池化:

输入:稀疏3D特征图 F ^ = { ( x ^ j , y ^ j , z ^ j , f j ( 1 ) , . . . , f j ( c ) ) } \hat{F}=\{(\hat{x}_j, \hat{y}_j, \hat{z}_j, f^{(1)}_j, ..., f^{(c)}_j)\} F^={(x^j,y^j,z^j,fj(1),...,fj(c))}
操作:GeM(是全局最大池化与平均池化的泛化版),公式如下: g ( k ) = ( 1 n ∑ j = 1 , . . . n ( f j ( k ) ) p ) 1 p g^{(k)}=(\frac{1}{n}\sum_{j=1,...n}(f^{(k)}_j)^p)^{\frac{1}{p}} g(k)=(n1j=1,...n(fj(k))p)p1。其中 g ( k ) g^{(k)} g(k)是全局描述子g的第k个元素,也即第k个通道的特征描述。 n n n是点云数量, p p p是可学习的池化参数。 来源于文章:Fine-tuning CNN Image Retrieval with No Human Annotation
输出g

训练:

Triplet margin Loss[14]:
L ( a i , p i , n i ) = m a x { d ( a i , p i ) − d ( a i , n i ) + m , 0 } L(a_i, p_i, n_i) = max\{d(a_i, p_i) - d(a_i, n_i) + m, 0\} L(ai,pi,ni)=max{d(ai,pi)d(ai,ni)+m,0},其中 d ( x , y ) = ∣ ∣ x − y ∣ ∣ 2 d(x, y)=||x-y||_2 d(x,y)=xy2是衡量嵌入的 x x x y y y的欧式距离; a i a_i ai, p i p_i pi, n i n_i ni分别是锚点,第 i i i训练三元组的正样本与负样本, m m m是margin超参数。该损失函数使用随机下降梯度方法Adam来优化。

训练策略,参考[14],基于batch hard negative mining。
也即挖掘 hardest positive 和 hardest negative样例,并且为此构建训练三元组。
每个batch包括 n个样本对应生成n个训练三元组。

训练过程

  • Step 1: 构建batch。在每个epoch中,随机将训练集分成batches。 每个batch的大小是n,由 n 2 \frac{n}{2} 2n个结构相似的样本对构成。
  • Step 2: 计算两个 n × n n \times n n×n的掩码,取值是0或者1,其中1表示结构相似,0则为结构不相似。
  • Step 3:将batches扔给网络训练

动态batch策略

  • 实验发现:大的batch size会让训练坍塌,让所有嵌入值都相同。为了克服这个问题,使用了动态batch大小策略
  • 使用:开始时,batch size比较小,例如16。在epoch结束时,检验活跃三元组(产生非零损失的三元组)的平均值。如果 活 跃 三 元 组 所 有 三 元 组 \frac{活跃三元组}{所有三元组} <预设的阈值,则通过扩展率 α \alpha α来减小batch size的大小。

4. Experiments

Baseline效果

可以看到其还是非常不错的
在这里插入图片描述

Refine效果

相当可以
在这里插入图片描述

消融实验:池化层。

消融实验其实也在说明如果使用MinkFPN,其实用NetVLAD效果并不明显,普通的MAC其实也就ok了。
在这里插入图片描述

消融实验: 全局特征输出大小。

可以看到基本256就已经足够了,再大的时候不一定好。
在这里插入图片描述

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值