一 核心思路
本篇通过观察point-based目标检测方法中,在PointNet++的上采样层(FP层)和refinement Module上面耗费了大量时间,因此作者借此提出了one-stage的3D目标检测网络结构。创新点是提出了F-FPS的采样算法、Candidate Generation Layer、anchor-free regression head以及3D center-ness assignment strategy。F-FPS算法主要是为了增加采样的质量,采样出更多前景点;Candiate Generation Layer的目的是为之后的prediction layer提供更好的候选点(因为没有anchor机制,所以必须要某种方法进行精度的提高。)
具体算法见下图:
二 核心步骤
2.1 Backbone
上图为本节中的框架,首先非常重要的就是F-FPS和Fusion Sampling。
2.1.1 Feature-FPS
作者提出,目前三维目标检测方法主要有point-based的框架和voxel-based的框架两种。与voxel-based的方法相比,point-based的方法虽然准确,但更耗时。我们观察到,目前所有的基于point-based的方法都由两个stage组成,分别是proposal generation stage和prediction refinement stage。Stage-1下采样点采用SA层,提高效率,扩大接受域;下采样过程中,采用FP层上采样点的特征,恢复所有点。在stage-2,通过RPN生成的proposal来进行更精细化的预测,以获得更准确的预测。SA层是提取点特征所必需的,但FP层和细化模块确实限制了point-based的方法的效率,因此作者决定形成一个one stage的网络框架。
作者最初的想法是删除FP层,确实直接删除能够增强效率,但是没有FP层,预测的准确率会下降0.2个点左右,太不划算。作者于是猜想用另一种方法代替。
至此,作者提出F-FPS采样点算法。之前PointNet系列中的采样点算法为D-FPS,也就是只考虑到点的距离,没有考虑到点之间的特征距离。通过在最远点采样时考虑特征距离这一变量,我们可以很好的移除大量的无用的背景信息。但是只考虑点之间的特征距离作为FPS的标准,自然而然会丧失背景点的数量,导致在最终的分类预测时,模型无法正确的预测出前景与背景,因此需要在点与点之间的距离以及点与点之间的特征距离中取一个中值。具体的F-FPS公式如下所示:
其中和分别表示L2 XYZ distance和L2 feature distance(这两个从论文的理解中都是L2 distance,如果代码中发现有出入会进行改动。);λ表示超参,也就是上面提到的,要对这两个距离运算进行很好的平衡。为此作者给出下表,通过对比最佳。
这个里面的百分比表示存活的实例(也就是在该物体中存在被采样的点)和实例总数之间的商。上面的4096、1024、512表示采样点的数量,本文中也就是representative points。
2.1.2 Fusion Sampling
具体做法见上图所示,红框框起来的表示一次SA操作,然后蓝色框框起来的表示一次Fusion Sampling操作。
Fusion Sampling操作,也就是对于这一个SA层,用D-FPS(也就是之前用的公式)和F-FPS分别采样个点。之所以这么做,是因为只用F-FPS的话,背景点采样的数量太少了,对之后的前景点与背景点的预测非常不利,所以使用D-FPS多采样一点背景点(感觉这里对性能并没有多大的提升,只是可能采用该方法能够采样更多的前景点。)。之后将这两个采样点算法采样出的点混合起来,一起输入到之后的MLP、BN、MaxPool层,最终分别得到D-FPS和F-FPS的采样点输出特征(也就是上图绿框框起来的部分,上部分表示D-FPS采样点的特征,下部分为F-FPS采样点的特征。)。
对于不同的数据集,作者采用不同层的Backbone网络,具体见下图:
2.2 Box Prediction Network
上图为该步骤的具体实施方案。由于作者采用anchor free的策略,所以对于精度一定会有损失,为了弥补这种损失,作者首先只对F-FPS采样出的点以及其输出的特征进行生成candidate points,接着作者将这些candidate points当作CG layer的中心点(作者在这里挖坑表明不采用object的中心作为CG layer的中心是为了考虑最终性能。)。这个图解见下图所示:
之后利用上述得到的candidate points进行group、MLP、MaxPool操作,得到这些candidate points点的特征。将candidate points的坐标以及特征作为输入,输入到最终的prediction head层。
2.3 Loss Function
2.3.1 Anchor-free Regression Head
这里是作者提出关于本文是否需要使用anchor的一个讨论,其中作者表示,如果使用anchor的话,那么每增加一个类别就要增加很多anchor。所以作者在本文中采用anchor free的架构,依然是回归7个参数(x,y,z,l,h,w,θ),不过本文采用Frustum pointnets的方法,对θ进行预测(也就是将2π分为12个部分,预测θ属于那个部分的label和residue。)。
2.3.2 3D Center-ness assignment Strategy
在二维中,label分配的方法有采用IOU阈值,mask这两种方法;FCOS这篇文章将二值的pix label扩展为连续性的label,越是靠近object中心的pixel所得到的分数也就设置越大;在3DLidar数据上,由于点云数据都在物体的表面,因此他们的center-ness都非常小并且接近的,这会导致从这些点得到好的预测不太可能。这里也就是前面为什么不用原始的采样点作为候选点,也是从F-FPS采样后再朝向中心靠近后的点作为候选点,因为靠近中心的候选点可以有更加接近和更加准确的结果,同时根据center-ness label可以轻松和object的表面的点区分开。
关于center-ness label,作者将其作为预测的label的ground truth,具体算法为下面两步:
1、首先确定一个来表示该点(candidate point)是否在object中(这是一个binary value。)。
2、通过画出object的六面体,然后计算该点到其前后左右上下表面的距离,再通过以下公式得到其对应的center-ness值:
其中(f,b,l,r,t,d)表示该点到这个六面体的前后左右上下的相应距离。(这个方法之前我也有想过,但是会造成只能保证体积非常相似,而不能保证l,h,w回归的准确性。)
2.3.3 Total Loss function
总的损失函数为:
其中表示candidate points点的数量;表示candidate points中前景点的数量;Np*表示在最后一次F-FPS采样出的点(representative points)中正样本的数量。
1、分类损失
首先是,表示分类损失,采用cross entropy loss,与分别表示预测的label score以及center-ness label(也是score的一种,这边是作者提出来的。)。
2、回归损失
中包含多个损失:
(1)距离回归,即中心点坐标的回归x,y,z,采用Smooth L1损失。
(2)Size回归,即回归bbox的l,w,h,采用Smooth L1损失.
(3)航向角回归,这边借鉴了Furtum Pointnets的航向角回归方法,将2π分为12个部分,预测θ属于那个部分的label和residue。下面的公式表示航向角的回归函数,第一部分为cls,第二部分为reg:
(4)corner loss,也就是八个角点的损失函数,下面的公式表示为corner loss,其中和分别表示对应的预测的角点坐标:
3、shifting loss
偏移损失函数是在CG layer中被监督训练,即是预测候选采样点(就是最后一次F-FPS采样出的点)到相应的object中心点的残差,采用smooth L1损失函数。表示在最后一次F-FPS采样出的点(representative points)中正样本的数量。
三 总结
这篇文章主要的创新点之前也有过介绍,为了能够实现真正的one stage框架,本文还是做了很多创新。后续是否会考虑改一改center-ness label?
参考文献:
[1] Yang Z , Sun Y , Liu S , et al. 3DSSD: Point-based 3D Single Stage Object Detector[J]. 2020 IEEE/CVF Conference on Computer Vision and Pattern Recognition (CVPR), 2020.