前情提要
在目前的三维目标检测任务中,大致分为单阶段和双阶段的网络。双阶段网络可以依靠pointnet++这样的网络得到的语义信息提供更加精确的结果。单阶段网络虽然具备了快速的优点,但是由于在道路环境下点的数量庞大,大部分的方案都是采用了将点云数据转换为其他数据形式的方式进行训练。这样不可避免的会损失部分的特征信息。
简介
文章提出了一中轻量级的基于点的单阶段网络,并且使用了anchor-free的方法产生最终的结果。
1.Fusion Sampling
为了对原始点云进行采样处理,文章中采用了Pointnet++中的SA模块对于原始点云做一个下采样的处理,砍掉了Pointnet++中的FP和Refinement Module,原因是作者认为这两个模块限制了单阶段网络中使用原始点云效率。根据下表得知,假如算上另外两个模块,时间将大大增加。
但是这么做的后果就是,当通过采样后点不断减少,由于背景点相比较于前景点的数量还是偏多的,当经过几次采样之后,前景点的数量将大大减少。
通过图表分析可得知,当经过采样至512个点的时候,前景点的数量只占了百分之五十。因此许多现存方法中为了提高recall还是加入了FP。
1.1 Feature-FPS
于是为了保存我们需要的前景点,同时在采样时去除无用的背景点。作者提出了一种结合语义信息的采样方式F-FPS。使用特征距离而不是空间距离的最远点采样。
但是同样的,假如完全使用特征距离采样的话,会造成一定的冗余。比方说,一辆车的*和它的窗户的点,它们的特征不同并且都会被采样。但是他们的点都可以用来做回归。
因此作者决定使用同时使用欧氏距离和特征距离的方法:
\(C(A,B)=\lambda L_d(A,B)+\lambda L_f(A,B)\)
\(\lambda L_d(A,B)\)表示的是空间特征的FPS,另外一个是特征距离FPS
#F-FPS代码中的表示
elif fps_method == 'F-FPS':
features_for_fps = tf.concat([tmp_xyz, tmp_points], axis=-1)
features_for_fps_distance = model_util.calc_square_dist(features_for_fps, features_for_fps, norm=False)
fps_idx = farthest_point_sample_with_distance(npoint, features_for_fps_distance)
#从对比可以看出,F-FPS中的最远点采样使用的是特征距离
else: # D-FPS
fps_idx = farthest_point_sample(npoint, tmp_xyz)
1.2 Fusion Sampling
F-FPS有利于回归的进行,但是对于分类任务,由于去掉了大量的背景点,对于分类任务并不友好。文章提到,F-FPS会将背景点当作前景点来处理,因此最后的分类分数会下降。
作者为了解决这个问题,采用融合采样的方法,假如最终采样的点是\(N_m\)个的话,就各自使用\(N_m/2\)的点来做D-FPS和F-FPS。
elif fps_method == 'FS':
features_for_fps = tf.concat([tmp_xyz, tmp_points], axis=-1)
features_for_fps_distance = model_util.calc_square_dist(features_for_fps, features_for_fps, norm=False)
fps_idx_1 = farthest_point_sample_with_distance(npoint, features_for_fps_distance)
fps_idx_2 = farthest_point_sample(npoint, tmp_xyz)
fps_idx = tf.concat([fps_idx_1, fps_idx_2], axis=-1) # [bs, npoint * 2]
2.Box Prediction Network
2.1 Candidate Generation
在进过几个SA模块之后,作者设计了CG层用于生成预测框。
由于D-FPS采样得到的很多都是背景点,于是作者仅用F-FPS后得出的那一部分点(initial center points)做Candidate Point。这里使用的CG层中心点是由Candidate Point确定的中心位置,而不是物体本身的中心位置。这里用initial center points和对应的实例中心做监督训练,和VoteNet一样,回归得到candidate points。然后从candidate points的周围选取F-FPS和D-FPS的点使用MLP进行局部特征提取。
#backbone的结构(配置文件)
ARCHITECTURE: [
[[0], [0], [0.2,0.4,0.8], [32,32,64], [[16,16,32], [16,16,32], [32,32,64]], True,
[-1], ['D-FPS'], [4096],
-1, False, 'SA_Layer', 'layer1', True, -1, 64], # layer1
[[1], [1], [0.4,0.8,1.6], [32,32,64], [[64,64,128], [64,64,128], [64,96,128]], True,
[-1], ['FS'], [512],
-1, False, 'SA_Layer', 'layer2', True, -1, 128], # layer2
[[2], [2], [1.6,3.2,4.8], [32,32,32], [[128,128,256], [128,192,256], [128,256,256]], True,
[512, -1], ['F-FPS', 'D-FPS'], [256, 256],
-1, False, 'SA_Layer', 'layer3', True, -1, 256], # layer3
# vote
[[3], [3], [], [], [], True,
[256, -1], ['F-FPS', 'D-FPS'], [256, 0],
-1, False, 'SA_Layer', 'vote', False, -1, 256],
[[4], [4], -1, -1, [128,], True,
[-1], [-1], [-1],
-1, -1, 'Vote_Layer', 'vote', False, -1, -1], # layer3-vote
# CG layer
[[3], [3], [4.8, 6.4], [16, 32], [[256,256,512], [256,512,1024]], True,
[-1], ['D-FPS'], [256],
-1, False, 'SA_Layer', 'layer4', False, 5, 512], # layer4
]
2.2 Anchor-free Regression Head
原先使用anchor的方法,除了要设定anchor的大小之外,还需要设定不同角度的anchor,这样的话,每增加一个检测的类别,anchor需要增加的数量就是线性的。所以如果是使用在nuScenes数据及上的时候,使用anchor-base的方法就需要增大许多的计算量。考虑到上面的计算量,作者采用的是anchor free的head,回归的也是一样的七个量(中心点坐标x,y,z;回归框大小w,h,l;旋转角度),这里需要指出的是通过点预测是没有预先设置朝向的,因此作者采用分类和回归的混合表达式。
2.3 3D Center-ness Assignment Strategy
在2d目标检测中,通常使用iou阈值或者mask去给每个像素分配label。同时在FCOS中,提出了一个连续的 center-ness label :
\[\text { centerness }^{*}=\sqrt{\frac{\min \left(l^{*}, r^{*}\right)}{\max \left(l^{*}, r^{*}\right)} \times \frac{\min \left(t^{*}, b^{*}\right)}{\max \left(t^{*}, b^{*}\right)}} \]越是靠近object中心的pixel,center-ness越接近于1,所得到的分数也就设置越大
但是三维点云的目标,点都大部分在物体的表面,因此他们的center-ness都比较接近,因此我们前面将F-FPS得出的点进行有监督的训练,目的就是使得进过旋转后的点能够更加接近物体的中心,这样也更好地得出更为准确的label。同时可以让center-ness与表面的点更好地分开。
通过画出物体的六面体,计算上下前后左右表面的距离
\[l_{\mathrm{ctrness}}=\sqrt[3]{\left.\frac{\min (f, b)}{\max (f, b)} \times \frac{\min (l, r)}{\max (l, r)} \times \frac{\min (t, d)}{\max (t, d)}\right)} \]最终的分类标签为$$l_{\mathrm{ctrness}}*l_{\mathrm{mask}}$$
\[l_{\mathrm{mask}}$$是判断candidate point是否在物体内。 ## 3.Loss 全部的损失分为三类,一类是分类损失,一类是回归损失,一类是偏移损失(shifting loss),偏移损失就是将点转换为candidate point的损失。 \]\begin{aligned}
L=& \frac{1}{N_{c}} \sum_{i} L_{c}\left(s_{i}, u_{i}\right)+\lambda_{1} \frac{1}{N_{p}} \sum_{i}\left[u_{i}>0\right] L_{r} \
&+\lambda_{2} \frac{1}{N_{p}^{*}} L_{s}
\end{aligned}
d为预测的值,t为对应的目标的值。
角点损失,corner loss,是预测框八个角点的损失函数:
\[L_{\text {corner}}=\sum_{m=1}^{8}\left\|P_{m}-G_{m}\right\| \]其中\(P_m\)和\(G_m\)为预测和ground-truth中m点的坐标。
4.总结
根据最终的实验结果可以看出,该网络在单阶段网络中是精度最高的,和二阶段网络比,速度是最快的。该方法的创新点也在于,提出了Point-base的单阶段三维目标检测网络。