文章目录
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卷积来生成上采样特征图。同时拼接了跳接层。
设计缘由:高的空间分辨率 & 大的感受野。
局部特征提取部分每层细节如下:
- Conv0:1个卷积层(32个kernels,大小为5x5x5,stride=1)
- Conv1:1个卷积层(32个kernels,大小为2x2x2,stride=2 )+ 2个一样残差层(32个kernels,大小为3x3x3, stride=1)
- Conv2:1个卷积层(64个kernels,大小为2x2x2,stride=2 )+ 2个一样残差层(64个kernels,大小为3x3x3, stride=1)
- Conv3:1个卷积层(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)=(n1∑j=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)=∣∣x−y∣∣2是衡量嵌入的
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就已经足够了,再大的时候不一定好。