3DSSD:基于点云的single-stage物体检测模型 | CVPR2020

2020-12-11 17:11:43 浏览数 (1)

前言

这是一篇来自CVPR2020的研究工作,于2020/4/9日开源,如下图所示,目前被接收的文章有在KITTI上的有四篇,分别是PV-RCNN,SA-SSD,Point-GNN和这一篇文章,应该说pvrcnn在精度上是独树一帜的远高于第二名的,不过这些文章在创新性上也是非常值得研究的

这一篇来自港中文和港科的研究工作,贾佳亚组在3D检测方向有很多值得深入思考和研究的文章,之前的诸如Point-rcnn, FastPoint Rcnn,STD都是这个组的工作,同样厉害的还有MM-LAB,出了PVRCNN ,Part^A等工作。

paper:https://arxiv.org/pdf/2002.10187.pdf code:https://github.com/tomztyang/3DSSD

本文主要内容概括

本文主要从point-based的研究入手,考虑如何解决掉以前的point-based的方法的瓶颈,即时间和内存占有远远大于voxel-based的方法,从而作者设计了新的SA模块和丢弃了FP模块到达时间上可达25FPS,此外本文采用一个anchor freeHead,进一步减少时间和GPU显存,提出了3D center-ness label的表示,进一步提高的精度。可视化效果如下:

摘要

1)目前基于LIDAR点云输入的3D检测深度学习网络主要分voxel-based和point-based两大类,其中voxel-based的方法已经有了一定的发展,但是point-based方法没有得到很好的发展。

1. 基于voxel的方法的发展:CVPR18的voxelnet是voxel-based方法的开山之作,但是当时voxelnet由于3D CNN的使用导致很大的显存占用,18年sensors的ECOND引入了稀疏卷积使得内存占用大大减少,同时该文引入了一个从标注集合sample的数据增广方案,次年的CVPR19的pointpillars则是直接将voxel改进为pillar直接跳过了3D卷积这一步骤,后续的19年ICCV则是将基于voxel的方法的参数优化(由于稀疏卷积的引入,使得更小的voxel可以被使用)以及改进为两阶段的方法fastpointrcnn,其中STD是直接将体素划分改为了球体划分(具有更好的方向性)。同样的19年的NIPS的文章有开始考虑从整个场景中粗略的先注意到大致的object,再对该场景进行划分。该类的方法的核心思想就是把点云的无序性通过体素划分使其规整,但是不可避免的会有信息丢失。

2. 基于Point的方法比较难以解决的是场景点云的无序性问题,19年的CVPR的Point RCNN是一篇完全基于点做的3D目标检测方法,但是该方法采用的anchor设置是对每一个场景点都会认为是,会造成很大的冗余,后续再次基础上延展性不是很大。

3. 当然19年还有很多好的工作,比如CVPRW19中有文章采用RNN attention的方式将大场景的点云裁缝后再送入RNN结构中,还有一些从小处入手的工作,将二维目标检测的IOU Loss引入到三维点云结构中;由于稀疏卷积的引入,将子流型卷积和3D稀疏卷积结构融合设计的3D backbone等等;为了提升效率,将voxel和point方式结合的方法等等

2)本文提出的3D-SSD是一个综合利率和精度的one-stage的目标检测框架。

作者这里提出观点,如果要point-based的方法提高效率,就必须要要改进或者丢掉耗时很久的上采样(PointNet 中的FP模块),因此作者的做法是设计了一种采样策略,通过下采样得到的少数点去预测detections也成为可能。

3)作者为了实现采用point-based的方法,同时又能兼顾精度和效率,设计了candidate generation layer和anchor-freeregression head以及3D center-ness assignment strategy。

4)这是一个 onestage anchor free的目标检测方法,比所有的 voxel-based的但阶段检测方法效果都要好,能达到25FPS。

这里值得一提的是,在3D目标检测中,称第一个anchor-free的文章应该是OHS,也是19年底的一个工作,它采用的方法类似part(作者文章中称为hotspots)去预测detection。

背景及前人研究

文章首先介绍了3D检测的应用,之后是目标的2D方法取得了很大的发展,但是在3D上并不能直接套用2D的检测方法,这是因为点云的稀疏性和无规则性。

1. 为了解决上诉提到的点云的稀疏性和无规则性带来的挑战,一些方法开始采用将点云投影到图像中,这样就能得到密集的表达形式。

  • 这类文章出现在17-18年的工作比较多,包括有CVPR17的[1],采用MV融合的方法;而后在18年的CVPR上将深度学习完全引入点云检测中,开创了voxel-based方法的先河的voxelnet[2],这是一篇非常经典的voxel-based文章,目前已有500的引用,后续的很多工作都在此基础上发展的。
  • 上诉的voxel-based方法尽管很高效,但是在划分体素过程中不可避免的会造成信息的丢失,这一点在MMLAB CVPR2020的文章PVRCNN中采用pointnet的可变感受野来减少信息丢失。

2. 上诉的方法都是优先考虑怎么把LiDar数据先规整化,但是point-based方法是直接在每一个点上预测得到对应的Bbox,一般会分为两步,第一步是通过SA模块(出自 pointnet )和下采样提取contextfeature,然后是通过FP(也是pointnet 模块)将全局特征上采样传递给那些没被采样到的点,采用的方式是反卷积,再然后通过RPN网络得到proposals;第二步是refine,在proposals的基础上优化得到最后的detections

3. 本文的突出贡献点

  • 这是一个 One-stage anchor free的方法。
  • 提出了下采样融合策略F-FPS和D-FPS,目的是替换点上述的FP模块,使得计算损耗大大减少。
  • 在KITTI上和NuScence上的实验效果很好

4. 大体结构

在SA模块后,作者设计了CG层(candidate generation )整合局部信息;在CG层中,作者首先将representative points生成候选点,候选点的生成由这个代表点的和该点对应的object的中心坐标值的监督训练;接着作者将这个候选点当做为中心,再从F-FPS和D-FPS的集合点中找到他们的周围点,最后采用MLP提取他们的融合特征。这些特征最终会被送入到一个anchor free head中来预测最后的3D bbox。

网络结构

1. Point-based方法的瓶颈

▲瓶颈1——FP层的丢弃与保留

以往基于点的检测方法通过SA模块可以得到context features,但是仅仅只有采样的点才会有这些特征,没有被采样的点就没有特征,因此需要FP模块将这些特征传递给没有被采样到的点,作者给出了如下的表格:

  • 这里的SA采用了4层SA layer(标准Pointnet 设计),FP是4层FPlayer,同时refine 模块是3层SA layer
  • 这里的FP模块似乎占比并不大,但是如果将FP去掉,肯定是能降低计算损耗的,同时本文的研究为一阶段的方式,后续的优化模块也是不存在的。

因此作者的想法是将FP层丢掉来降低运行时间,首先最容易想到的设计方案是直接采用SA最后剩下的采样点进行预测,但是由于前人的采样是D-FPS,也就是欧式距离的最远点采样,就会使得采样点中很多的背景点,仅仅靠仅存的几个前景采样点预测出结构几乎是做不到的,所以直接丢弃不做任何处理是不可行的。作者在NuScene给出了统计出的对比结果:

从表格中我们可以看出,采用D-FPS的采样方法,如果采样点为512个时,object的内点占比仅仅只有一半了,是很不足够的(比笔者想象的多一些),但是如果选用F-FPS(特征空间采样),那么效果会好一些。

总结一下,FP层如果保留,那么会保留很大的时间消耗,以致于和voxel-based的方法比较起来没有任何优势,如果直接丢弃,会造成很大精度损失。

▲作者的改进——F-FPS

前人采用的D-FPS算法是在欧式空间中进行的最远点采样,并不会考虑到该点的任何属性特征;作者因此引入了F-FPS,在语义信息的引导下,能够排除大量的背景点信息,保留更多的前景点信息。但如果仅仅只使用FFPS,会保留很多同一个object的点,也会导致精度下降,因此作者同时考虑了欧式和特征空间的采样信息。

因此作者采用上述的综合采样方法。正如上表的采样结构显示得到了一定的效果提升。

▲瓶颈2——F-FPS导致分类分数下降

作者指出,尽管采样使用F-FPS可以提高前景点中的占比,这对回归是很有帮助的,但是背景点过少的时候对分类是不友好的,在后面的消融实验中也可以看出,尽管F-FPS能提高回归得分,但是对分类却分数不如D-FPS的方法。为解决这个问题,作者采用混合采样的设计,如果最终采样点个数为个,那么其中的个点分别采用的是上述的D-FPS和F-FPS的采样法。

2. bbox预测网络

▲CGLayer

前人的研究工作都是在得到每个点的feature后,接上三层的SA layer,分别用于中心点选择、周围点特征提取以及生成语义信息。但是本文作者为了进一步降低计算成本,候选中心点的生成是直接在F-FPS采样后进行的,如下图所示,可以看的出来,F-FPS采样的点由于比D-FPS的点更加可能是前景点,所以后选点仅仅只是在F-FPS的点上生成,也就是candidate points;接着作者将这些候选中心点当做CGlayer的中心点。(作者在这里挖坑表明不采用采样点作为CGlayer的中心是考虑了最终的性能,在后续会提及到);同样的下一步则是根据候选中心点领域选择从F-FPS和D-FPS中采样得到的代表点进行局部特征提取,采用MLP进行特征提取。

▲Overall Structure

从如上的结构图可以看出上面提及到的作者设计的结构:

1.SA layer

  • 前人的SA layer都是按照pointnet 文章中的那样设计,但是本文的SA正如前面提到的融合的欧式空间和特征空间的采样方法,并且各自采取一半的点,然后多个SA模块组合就可以得到这样的backbone。
  • 这里根据数据集的不同,在backbone的设计层数也是不同的,作者给出了在KITTI和Nuscence上的结构如下,看的出来NuScene场景更复杂。

2.CG layer

这一层的目主要是:

  • 得到候选中心点
  • 通过候选中心点整合周围采样点提取语义信息

3.Prediction Head

如上图,回归和分类

▲Anchor-free Regression Head

前面的overall structure中的第三部分的回归网络结构。作者首先指出假设本文采用anchor-based的方法的话,每增加一个类别,则需要在全场景增加不少的anchor。再考虑到方向旋转性,就更多了。

插入一点,在3D检测网络中,都是按照预先设置的object级别的大小anchor,在全场景中每隔一段距离就设置一个anchor,同时每个anchor有几个不同的朝向。就是说,每增加一类的物体,计算量就是线性增加的。

考虑到上面的计算量,作者采用的是anchor free的head,回归的也是一样的七个量,这里需要指出的是通过点预测是没有预先设置朝向的,因此作者采用分类和回归的混合表达式。

4.3DCenter-ness Assignment Strategy

在二维中,label分配的方法有采用IOU阈值,mask这两种方法;FCOS这篇文章将二值的pix label扩展为连续性的label,越是靠近object中心的pix所得到的分数也就设置越大;在3DLidar数据上,由于点云数据都在物体的表面,因此他们的center-ness都非常小并且接近的,这会导致从这些点不太可能得到好的预测结果。这里也就是前面为什么不用原始的采样点作为候选点当做CG layer层输入的中心,而是从F-FPS采样后再朝向object中心靠近后的点作为候选点,因为靠近中心的候选点可以有更加接近和更加准确的结果,同时根据center-ness label可以轻松和object的表面的点区分开。

作者采用定义center-ness label通过两步:

  • 首先确定该点是否在一个object中
  • 通过画出object的六面体,然后计算该点到其前后左右上下表面的距离,再通过以下公式得到其对应的center-ness值。

3.损失函数

全部损失函数分为分类损失、回归损失和偏移损失(这个是指从采样代表点到候选点得到时的损失函数)

上式的表示所有候选点的个数,表示为候选点中前景点的个数。

1.其中分类损失函数采用的是交叉熵损失函数,其中分别表示预测得分和center-ness 分数。2.回归loss中分为下面几部分:

  • 距离回归,即是中心点坐标的回归,采用smooth l1函数
  • size回归,即是回归bbox的l,w,h,采用smooth L1函数
  • 角度回归,回归偏航角yaw,角度回归也分为两部分,第一部分是分类,第二部分是残差回归,如下:
  • 角点损失,corner loss,即是八个角点的损失函数,如下,其中 分别表示对应的预测的角点坐标

3.shifting loss 偏移损失函数是在CG layer中被监督训练,即预测候选采样点到object中心点的残差,采用smooth L1损失函数。这里是 表示F-FPS采样到的postive的候选点的个数。

实验

1.KITTI

一些实现细节:

  • 随机采样到16384个点输入
  • 为了防止过拟合,作者采用了四中数据增广,分别是mix-up策略(SECOND的作者提出过这个解决方案),对每一个标注框有随机旋转和平移,第三,沿着x轴随机尺度变化。第四,全场景点云沿着z轴随意旋转。
  • 最近有一篇文章有研究过数据增广在3D检测中的应用

实验结果:

2.nuScenes

这个数据集是19年CVPR推出的新的自动驾驶数据集,有着更大的场景和更复杂的分类任务,每一帧有超过4w个点,其中有一些关键帧,前人的方法都是将关键帧和随后的0.5s的帧结合以致于超过40w个点来做目标检测(最近有一篇通过点云流的方式做3D目标检测的文章[4],而且已经开源),这对于point-based的方法来说就是灾难。

值得一提的是,19年提出的数据集nuScence目前还有很多值得可做的,之前有一篇采用class balance loss的方法做到了nuscence的榜首,目前也已经开源,不过此时改了名字叫det3D的这样一个架构,该架构也已经集成了很多的sota的方法。

3.消融实验

  • 融合采样方法
  • shifting in CG layer
  • point-based的方法的时间对比

推荐阅读文献

[1]Multi-view3d object detection network for autonomous driving. [2]Voxelnet:End-to-end learning for point cloud based 3d object detection [3]Fcos:Fully convolutional one-stage object detection [4]LiDAR-based Online 3DVideo Object Detection with Graph-based MessagePassing and SpatiotemporalTransformer Attention

上述内容,如有侵犯版权,请联系作者,会自行删文。

0 人点赞