相机的3D目标检测算法_相机的3D目标检测算法


如coco数据集中,大小目标往往是呈现long-tail的分布,于是很多研究者才考虑从不同scale的feature map来进行不同大小的object的预测,而对于3d目标检测来说 物体的尺寸基本是一致的,没有受到近大远小的投影关系的影响。远处的物体仅仅只是点云更加稀疏而已。作者便引出自己的思考:下采样在3d目标检测中是否是必要的呢?

因此 作者便考虑一个没有下采样的检测器,然而设计这个检测器存在着以下的一些问题:

首先设计一个在原尺寸的feature map进行操作的detector是计算量巨大的,其次原尺寸的feature map对于卷积来说往往意味着更小的感受野。

如作者首先在pointpillar上进行了一系列的实验:

对于pointpillar 作者对于backbone的stride进行改进,原来的版本记做D3,依次放大缩小stride 如 从D3到D0的backbone上四层的stride分别是:

相机的3D目标检测算法_相机的3D目标检测算法_02

因为每一个module都会最终上采样至原来的resolution,所以上述的操作只是对于中间层的feature map的size进行了改进。

相机的3D目标检测算法_神经网络_03

相机的3D目标检测算法_深度学习_04


我们可以看到 通过缩小stride D3到D1 ap明显得到了提升。这说明小的stride是有助于3d目标检测的。而作者对于D0 ap的下降 作者认为是过小的stride限制了感受野的大小,导致每个feature点检测到很小的一部分场景 而这部分场景是不足以检测到物体全貌的。

所以作者在这个基础上有对于D0的卷积核进行了改进:采用空洞卷积和大尺寸(55)卷积核来进行实验 发现ap也得到了提升

相机的3D目标检测算法_深度学习_05


这说明了一个问题:在考虑参数量和计算时间的情况下,足够的感受野大小对于目标检测来说是十分必要的!
于是 作者便在pointpillar的基础上设计了一个single stide的网络

相机的3D目标检测算法_自动驾驶_06


网络具体架构如上图所示,很简单的网络
首先类似pointpillar 对于点云进行体素化(实际上是pillar化),把每一个voxel作者认为是一个token。将它们输入到backbone中。与pointpillar不同 作者没有对这些编码后的voxel进行下采样 而是将它们输入到一个SST(Single-stride Sparse Transformer)的模块进行feature提取。
还是前面的问题:怎么在小stride的情况下扩大每一个voxel的感受野呢?
答案是:transformer!
transformer对于提取全局feature有着无可比拟的特性!然而 计算整个场景的transformer 显然是不现实的!
于是 作者首先对于得到的voxel图 对于voxel们进行group操作 :将voxel划分成若干个部分,随后对于每个group中的非空体素 计算他们之间的self attention:

相机的3D目标检测算法_自动驾驶_07


还有一个问题,由于点云的稀疏性 我们不能保证每个group中非空voxel的数目保持一致 那么我们要怎样才能保证对于每一个group进行并行运算呢?
作者采用了补全的操作,补全的voxel是一个mask后的voxel 对于其他voxel没有影响。
行 那我们计算完每一个group的attention 有没有一种可能 就是我们划分的group正好有一个物体在两个group里面呢?
答案是肯定的,而且如果我们单单是group内的self attention 那么就算堆叠再多的SST也不能让这个物体的每个voxel权重得到共享 这些跨group的物体 检测效果就会很差很差
这个问题 在2d目标检测领域得到了解决:swin transformer 具体的细节是采用一个shif window 来进行不同group之间的信息交互 那么 堆叠多个SST后 跨group的voxe 便能够得到权值共享了。这里不再赘述了,感觉做的方法基本和2d是一模一样的, 

相机的3D目标检测算法_计算机视觉_08


网络后面还有一个dense map的补全 这个操作也很好理解:点云往往是在物体表面的 物体中心往往为空 这对于检测头来说是不友好的 所以作者采用了两个33的卷积核来进行空洞的补全。最后的检测头直接采用了SSD。

loss如下:

相机的3D目标检测算法_深度学习_09


当然 这个网络还可以扩展至二阶段 只要在后面加一个lidar RCNN即可 作者这么做是方便后面与其他方法的对比。

实验做的也很详细:

相机的3D目标检测算法_相机的3D目标检测算法_10


相机的3D目标检测算法_深度学习_11


waymo上的检测效果如上图所示

相机的3D目标检测算法_深度学习_12


叠加三帧的数据 作者发现该方法对于dense feature是很友好的。

对于single stride 的检测器 还有一个疑问 :感受野对于大物体是否足够呢?答案是 transformer可以解决你的顾虑!

相机的3D目标检测算法_自动驾驶_13


相机的3D目标检测算法_计算机视觉_14


文章通过调整更高的iou阈值发现 该方法还能实现更加精准的box预测。

相机的3D目标检测算法_自动驾驶_15


用trans与其他采用卷积的single stride的方法进行比较

ablation做了group size voxel number的对比

相机的3D目标检测算法_相机的3D目标检测算法_16


SRA(网络深度)

相机的3D目标检测算法_相机的3D目标检测算法_17


看下来除了对于内存要求比较高(相比于pointpillar) 其他的都很优越!

相机的3D目标检测算法_深度学习_18