论文标题:Embracing Single Stride 3D Object Detector with Sparse Transformer
源码地址:https://github.com/TuSimple/SST
CVPR2022
文章写得很好!
文章从2d 3d目标检测目标的尺寸的不同入手,在2d目标检测中确实由于图像近大远小的尺寸关系 存在着图像中物体尺寸长尾的问题:
如coco数据集中,大小目标往往是呈现long-tail的分布,于是很多研究者才考虑从不同scale的feature map来进行不同大小的object的预测,而对于3d目标检测来说 物体的尺寸基本是一致的,没有受到近大远小的投影关系的影响。远处的物体仅仅只是点云更加稀疏而已。作者便引出自己的思考:下采样在3d目标检测中是否是必要的呢?
因此 作者便考虑一个没有下采样的检测器,然而设计这个检测器存在着以下的一些问题:
首先设计一个在原尺寸的feature map进行操作的detector是计算量巨大的,其次原尺寸的feature map对于卷积来说往往意味着更小的感受野。
如作者首先在pointpillar上进行了一系列的实验:
对于pointpillar 作者对于backbone的stride进行改进,原来的版本记做D3,依次放大缩小stride 如 从D3到D0的backbone上四层的stride分别是:
因为每一个module都会最终上采样至原来的resolution,所以上述的操作只是对于中间层的feature map的size进行了改进。
我们可以看到 通过缩小stride D3到D1 ap明显得到了提升。这说明小的stride是有助于3d目标检测的。而作者对于D0 ap的下降 作者认为是过小的stride限制了感受野的大小,导致每个feature点检测到很小的一部分场景 而这部分场景是不足以检测到物体全貌的。
所以作者在这个基础上有对于D0的卷积核进行了改进:采用空洞卷积和大尺寸(55)卷积核来进行实验 发现ap也得到了提升
这说明了一个问题:在考虑参数量和计算时间的情况下,足够的感受野大小对于目标检测来说是十分必要的!
于是 作者便在pointpillar的基础上设计了一个single stide的网络
网络具体架构如上图所示,很简单的网络
首先类似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:
还有一个问题,由于点云的稀疏性 我们不能保证每个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是一模一样的,大家可以参考一位大佬写的博文 我也没有看这篇 best paper 的原文
这里shift的大小是group长宽的一半。
网络后面还有一个dense map的补全 这个操作也很好理解:点云往往是在物体表面的 物体中心往往为空 这对于检测头来说是不友好的 所以作者采用了两个33的卷积核来进行空洞的补全。最后的检测头直接采用了SSD。
loss如下:
当然 这个网络还可以扩展至二阶段 只要在后面加一个lidar RCNN即可 作者这么做是方便后面与其他方法的对比。
实验做的也很详细:
waymo上的检测效果如上图所示
叠加三帧的数据 作者发现该方法对于dense feature是很友好的。
对于single stride 的检测器 还有一个疑问 :感受野对于大物体是否足够呢?答案是 transformer可以解决你的顾虑!
文章通过调整更高的iou阈值发现 该方法还能实现更加精准的box预测。
用trans与其他采用卷积的single stride的方法进行比较
ablation做了group size voxel number的对比
SRA(网络深度)
看下来除了对于内存要求比较高(相比于pointpillar) 其他的都很优越!
文章来源:https://www.toymoban.com/news/detail-413986.html
我的思考:
文章做得很棒!通过transformer 成功实现了感受野的扩大 而这个感受野并非是传统卷积的粗暴的将一个立方体内的voxel进行linear操作 而是计算每个voxel相对于你query点的权重 如上图所示 确实能实现对于当前物体的准确识别 而不受到背景点 其他instance的影响!
文章对于小目标的检测效果很好 这是有没有进行下采样实现的结果!
与同为CVPR的voxel transformer 相比这篇文章实际上是在pillar层面进行的操作 这样的好处是可以直接运用2d目标检测的成果——swin—transformer。与它不同的地方是使用了单步距的操作。
文章启发了我们对于网络结构的思考——对于3d目标检测来说 下采样是否是有必要的!文章来源地址https://www.toymoban.com/news/detail-413986.html
到了这里,关于【论文阅读】【3d目标检测】Embracing Single Stride 3D Object Detector with Sparse Transformer的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!