点击上方“AI算法修炼营”,选择加星标或“置顶”
标题以下,全是干货
代码地址:https://github.com/tomztyang/3DSSD
cvpr2020的研究工作,于2020/4/9日开源,如下图所示,目前被接收的文章有在KITTI上的有四篇,分别是PV-RCNN,SA-SSD,Point-GNN和这一篇文章,应该说pvrcnn在精度上是独树一帜的远高于第二名的,不过这些文章也是很有创新性的。
这一篇来自港中文和港科,同样是贾佳亚组,他们组在3D检测方向有很多好的工作,之前的诸如point-rcnn,fast point rcnn,STD都是这个组的工作,同样厉害的还有MM-LAB,出了PVRCNN ,Part^A等工作。
目前基于LIDAR点云输入的3D检测深度学习网络主要分voxel-based和point-based两大类,其中voxel-based的方法已经有了一定的发展,但是point-based方法没有得到很好的发展。
(1)基于voxel的方法的发展,CVPR18的voxelnet是voxel-based方法的开山之作, 但是当时voxelnet由于3D CNN的使用导致很大的显存占用,18年sensors的SECOND引入了稀疏卷积使得内存占用大大减少,同时该文引入了一个从标注集合sample的数据增广方案,次年的CVPR19的pointpillars则是直接将voxel改进为pillar直接跳过了3D卷积这一步骤,后续的19年ICCV则是将基于voxel的方法的参数优化(由于稀疏卷积的引入,使得更小的voxel可以被使用)以及改进为两阶段的方法fast pointrcnn,其中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方式结合的方法等等
1、本文提出的3D-SSD是一个综合利率和精度的one-satge的目标检测框架。
作者这里提出观点,如果要point-based的方法提高效率,就必须要要改进或者丢掉耗时很久的上采样,因此作者的做法是设计了一种采样策略,通过下采样得到的少数点去预测detections也成为可能。
2、作者为了实现采用point-based的方法,同时又能兼顾精度和效率,设计了candidate generation layer
和anchor-free regression head
以及3D center-ness assignment strategy
。
3、这是一个 onestage anchor free的目标检测方法,比所有的 voxel-based的但阶段检测方法效果都要好,能达到25FPS。
这里值得一提的是,在3D目标检测中,称第一个anchor-free的文章应该是OHS,也是19年底的一个工作,它采用的方法类似part(作者文章中称为hotspots)去预测detection。
0. 本文主要内容概括
本文主要从point-based的研究入手,考虑如何解决掉以前的point-based的方法的瓶颈,即时间和内存占有远远大于voxel-based的方法,从而作者设计了新的SA模块和丢弃了FP模块到达时间上可达25FPS,此外本文采用一个anchor free Head,进一步减少时间和GPU显存,提出了3D center-ness label的表示,进一步提高了精度。实验可视化效果如下:
文章经典开头,3D检测的应用,之后是目标的2D方法取得了很大的发展,但是在3D上并不能直接套用2D的检测方法,这是因为点云的稀疏性和无规则性。
为了解决上诉提到的点云的稀疏性和无规则性带来的挑战,一些方法开始采用将点云投影到图像中,这样就能得到密集的表达形式。
这类文章出现在17-18年的工作比较多,包括有CVPR17的 [1] ,采用MV融合的方法;
而后在18年的CVPR上将深度学习完全引入点云检测中,开创了voxel-based方法的先河的 voxelnet[2] ,这是一篇非常经典的张,目前已有500的引用,后续的很多工作都在此基础上发展的。
上诉的voxel-based方法尽管很高效,但是在划分体素过程中不可避免的会造成信息的丢失,这一点在MMLAB CVPR2020的文章PVRCNN中采用pointnet的可变感受野来减少信息丢失。
1、上述的方法都是想着怎么把点先规整化,但是point-based方法是直接在每一个点上预测得到对应的Bbox,一般会分为两步,第一步是通过SA模块(出自 pointnet++)和下采样提取context feature,然后是通过FP(也是pointnet++模块)将全局特征上采样传递给那些没被采样到的点,采用反卷积,再然后通过RPN网络得到proposals;第二步是refine,在proposals的基础上优化得到最后的detections
2、本文的突出贡献点
(1)这是一个 One-stage anchor free的方法。
(2)提出了下采样融合策略F-FPS和D-FPS,目的是替换点上述的FP模块,使得计算损耗大大减少。
(3)在KITTI上和NuScence上的实验效果很好
3、大体结构
在SA模块后,作者设计了CG层(candidate generation )提出候选框;在CG层中,作者首先将representative points生成候选点,这个生成过程的监督信息时这个代表点的和该点对应的object的中心坐标值的相对信息;接着作者将这个候选点看做为中心,再从F-FPS和D-FPS的集合点中找到他们的周围点,再采用MLP提取他们的特征。这些特征最终会被送入到一个anchor free head中来预测最后的3D bbos。
以往基于点的检测方法通过SA模块可以得到context features,但是仅仅只有采样的点才会有这些特征,没有被采样的点就没有特征,因此需要FP模块将这些特征传递给没有被采样到的点,作者给出了如下的表格:
(1)这里的SA采用了4层SA layer(标准Pointnet++设计),FP是4层FP layer,同时refine 模块是3层SA layer
(2)这里的FP模块似乎占比并不大,但是如果将FP去掉,肯定是能降低计算损耗的,同时作者为一阶段的方式,后续的优化模块也是不存在的。
因此作者的想法是将FP层丢掉来降低运行时间,首先最容易想到的设计方案是直接采用SA最后剩下的采样点进行预测,但是由于前人的采样是D-FPS,也就是欧式距离的最远点采样,就会使得采样点中很多的背景点,仅仅靠仅存的几个前景采样点预测出结构几乎是做不到的,所以直接丢弃不做任何处理是不可行的。作者在NuScene给出了统计出的对比结果:
从表格中我们可以看出,采用D-FPS的采样方法,如果采样点为512个时,object的内点占比仅仅只有一半了,是很不足够的(比笔者想象的多一些),但是如果选用F-FPS(特征空间采样),那么效果会好一些。
总结一下,FP层如果保留,那么会保留很大的时间消耗,以致于和voxel-based的方法比较起来没有任何优势,如果直接丢弃,会造成很大精度损失。
前人采用的D-FPS算法是在欧式空间中进行的最远点采样,并不会考虑到该点的任何属性特征;作者因此引入了F-FPS,在语义信息的引导下,能够排除大量的背景点信息,保留更多的前景点信息。但如果仅仅只使用FFPS,会保留很多同一个object的点,也会导致精度下降,因此作者同时考虑了欧式和特征空间的采样信息。
因此作者采用上述的综合采样方法。正如上表的采样结构显示得到了一定的效果提升。
作者指出,尽管采样使用FFPS可以提高前景点中的占比,这对reg是很有帮助的,但是背景点过少的时候对cls是不友好的,在后面的消融实验中也可以看出,尽管FFPS能提高REG得分,但是对cls却分数不如DFPS的方法。
为解决这个问题,作者采用融合采样的设计,如果最终采样点个数为 个,那么其中的 个点分别采用的是上述的D-FPS和F-FPS的采样法。
2.2 bbox预测网络
前人的研究工作都是在得到每个点的feature后,接上三层的SA layer,分别用于中心点选择,周围点特征提取以及生成语义信息。
但是本文作者为了进一步降低计算成本,候选中心点的生成是直接在F-FPS采样后进行的,如下图所示,可以看的出来,F-FPS采样的点由于比D-FPS的点更加可能是前景点,所以后选点仅仅只是在F-FPS的点上生成,也就是candidate points;接着作者将这些候选中心点当做CG layer的中心点。(作者在这里挖坑表明不采用object的中心作为CGlayer的中心是考虑了最终的性能,在后续会提及到);同样的下一步则是根据候选中心点领域选择从FFPS和DFPS中采样得到的代表点进行局部特征提取,采用MLP进行特征提取。
从如上的结构图可以看出上面提及到的作者设计的结构:
SA layer
前人的SA layer都是按照pointnet++文章中的那样设计,但是本文的SA正如前面提到的融合的欧式空间和特征空间的采样方法,并且各自采取一半的点,然后多个SA模块组合就可以得到这样的backbone。
这里根据数据集的不同,在backbone的设计层数也是不同的,作者给出了在KITTI和Nuscence上的结构如下,看的出来NuScene场景大好多。
1、CG layer
这一层的目主要是:
(1)得到候选中心点
(2)通过候选中心点整合周围采样点提取语义信息
2、prediction head
如图,回归和分类
Anchor-free Regression Head
前面的overall structure中的第三部分的回归网络结构。作者首先指出假设本文采用anchor-based的方法的话,没增加一个类别,则需要在全场景增加不少的anchor。再考虑到旋转性,就更多了。
插入一点,在3D检测网络中,都是按照预先设置的object级别的大小anchor,在全场景中每隔一段距离就设置一个anchor,同时每个anchor有几个不同的朝向。就是说,每增加一类的物体,计算量就是线性增加的。
考虑到上面的计算量,作者采用的是anchor free的head,回归的也是一样的七个量,这里需要指出的是通过点预测是没有预先设置朝向的,因此作者采用分类和回归的混合表达式。后续讲到
在二维中,label分配的方法有采用IOU阈值,mask这两种方法;FCOS这篇文章将二值的pix label扩展为连续性的label,越是靠近object中心的pix所得到的分数也就设置越大;在3DLIDAR数据上,由于点云数据都在物体的表面,因此他们的center-ness都非常小并且接近的,这会导致从这些点得到好的预测不太可能。这里也就是前面为什么不用原始的采样点作为候选点,也是从FFPS采样后再朝向中心靠近后的点作为候选点,因为靠近中心的候选点可以有更加接近和更加准确的结果,同时根据center-ness label可以轻松和object的表面的点区分开。
作者采用定义center-ness label通过两步:
1、首先确定该点是否在一个object中
2、通过画出object的六面体,然后计算该点到其前后左右上下表面的距离,再通过以下公式得到其对应的center-ness值。
2.3 损失函数
全部损失函数分为分类损失、回归损失和偏移损失(这个是指从采样代表点到候选点得到时的损失函数)
上式的 表示所有候选点的个数, 表示为候选点中前景点的个数。
其中分类损失函数采用的是交叉熵损失函数,其中 分别表示预测得分和center-ness 分数。
回归loss中分为下面几部分:
(1)距离回归,即是中心点坐标的回归 ,采用smooth l1函数
(2)size回归,即是回归bbox的 ,采用smooth L1函数
(3)角度回归,回归偏航角,角度回归也分为两部分,第一部分是cls,第二部分是残差reg,如下:
(4)角点损失,corner loss,即是八个角点的损失函数,如下,其中 分别表示对应的预测的角点坐标shifting loss 偏移损失函数是在CG layer中被监督训练,即是预测候选采样点到object中心点的残差,采用smooth L1损失函数。这里是 表示F-FPS采样到的postive的候选点。
随机采样到16384个点输入
为了防止过拟合,作者采用了四中数据增广,分别是mix-up策略(SECOND的作者提出过这个解决方案),对每一个Bbox,有随机旋转和平移,第三,沿着x轴随机尺度变化。第四,全场景点云沿着z轴随意旋转。
最近 有一篇文章(https://arxiv.org/pdf/2004.01643.pdf) 有研究过数据增广在3D检测中的应用
实验结果
这个数据集是19年CVPR推出的新的自动驾驶数据集,有着更大的场景和更复杂的分类任务,每一帧有超过4w个点,其中有一些关键帧,前人的方法都是将关键帧和随后的0.5s的帧结合以致于超过40w个点来做目标检测(最近有一篇通过点云流的方式做3D目标检测的文章[4],而且已经开源),这对于point-based的方法来说就是灾难。
值得一提的是,19年提出的数据集nuScence目前还有很多值得可做的,之前有一篇采用class balance loss的方法做到了nuscence的榜首,目前也已经开源,不过此时改了名字叫det3D的这样一个架构,该架构也已经集成了很多的sota的方法。
3.3 消融实验
融合采样方法
shifting in CG layer
point-based的方法的时间对比
[1] Multi-view 3d 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 3D Video Object Detection with Graph-based MessagePassing and Spatiotemporal Transformer Attention
目标检测系列秘籍一:模型加速之轻量化网络秘籍二:非极大值抑制及回归损失优化秘籍三:多尺度检测秘籍四:数据增强秘籍五:解决样本不均衡问题秘籍六:Anchor-Free视觉注意力机制系列Non-local模块与Self-attention之间的关系与区别?视觉注意力机制用于分类网络:SENet、CBAM、SKNetNon-local模块与SENet、CBAM的融合:GCNet、DANetNon-local模块如何改进?来看CCNet、ANN
语义分割系列一篇看完就懂的语义分割综述最新实例分割综述:从Mask RCNN 到 BlendMask超强视频语义分割算法!基于语义流快速而准确的场景解析CVPR2020 | HANet:通过高度驱动的注意力网络改善城市场景语义分割
基础积累系列卷积神经网络中的感受野怎么算?
图片中的绝对位置信息,CNN能搞定吗?理解计算机视觉中的损失函数深度学习相关的面试考点总结
自动驾驶学习笔记系列 Apollo Udacity自动驾驶课程笔记——高精度地图、厘米级定位 Apollo Udacity自动驾驶课程笔记——感知、预测 Apollo Udacity自动驾驶课程笔记——规划、控制自动驾驶系统中Lidar和Camera怎么融合?
竞赛与工程项目分享系列如何让笨重的深度学习模型在移动设备上跑起来基于Pytorch的YOLO目标检测项目工程大合集目标检测应用竞赛:铝型材表面瑕疵检测基于Mask R-CNN的道路物体检测与分割
SLAM系列视觉SLAM前端:视觉里程计和回环检测视觉SLAM后端:后端优化和建图模块视觉SLAM中特征点法开源算法:PTAM、ORB-SLAM视觉SLAM中直接法开源算法:LSD-SLAM、DSO视觉SLAM中特征点法和直接法的结合:SVO
2020年最新的iPad Pro上的激光雷达是什么?来聊聊激光SLAM