论文标题:An End-to-End Transformer Model for 3D Object Detection
facebook ai iccv2021 源码地址:https://facebookresearch.github.io/3detr DETR同组出品,其实结构也很2d版本的基本一样,作者实验做的挺详尽的,不过还有一些地方我没看明白,记下来和大家交流一下: 作者发现transformer2d的目标检测上有了良好的效果 那么对于3d目标检测呢 是否可以用同样的方法进行目标检测呢?也就是首先利用3d的backbone进行点云的特征提取 同时对于点云进行下采样 得到的结合了local feature的特征点 然后利用transformer进行encode和decode decode采用的query就类似2d detr中的方法进行制定数目的初始化矩阵。 最后对于得到的结果输入到detector head里面 对于得到的我们制定数目的proposals进行set to set的loss计算 最后输出我们的结果。 这是2d detr的思路 那么3d是怎么做的呢 我们发现 他在这篇文章里做的东西几乎一模一样! 老规矩 上图!  可以看到作者在这篇文章里做的东西和DETR中几乎是一模一样的 唯一的区别在于作者对于query的定义没有像2d图像目标检测中这么随意了。 首先对于下采样 作者采用多个SA层来进行下采样 将下采样的点输入到encoder中 这里作者说进行的操作是对于采样点进行多个mlp处理 得到256维的输出 将这些输出输入到transformer中计算这些点的self attention 自注意力机制中 我们不对这些点进行位置编码 因为我们认为输入的这些点是含有XYZ信息的。  这里的encode在原文中叠加了3层,由于下采样到了2048个点 所以encoder层产生了2048*2048大小的自注意力矩阵。 作者还提出一种DETR-m 为了验证模型的灵活性。主要是在encoder层中引入了inductive bias,让点不再关注全局特征 而是它临近点的特征 主要是就是在每一层的encode中对于自注意力矩阵 乘以一个同样大小的mask。mask是一个二值的mask,只有当前点的临近点所在的位置矩阵上才是1,其他的皆为0.这是一个类似于pointnet++的操作。作者还对于3层的encode给出了不同的半径取值。
对于文章的decode,作者搭建起一个set prediction的问题。主要是通过decoder预测出一个proposal的集合 这是通过transformer实现的,对于前面encoder输出的point features,这里我们在N个点中FPS采样出B个query点,对于采样出来的B个点 我们把它们丢进傅里叶位置编码和mlp进行编码和特征维度的调整,随后对他们进行一个自注意力机制,再进行与前面采样feature的cross attention计算,最后紧跟一个mlp层调整特征维度。这样的模块我们称为一个decoder层。输出为B*256维度的box feature。  最后我们利用mlp作为detector head。预测center location、angle分类及residual、box size、class。 对于得到的B个box 我们与有限的GT进行set predictin 主要是首先进行一一的匹配,再进行各个loss的分部计算 这个过程和DETR一模一样 我就不赘述了。 文章没有给出傅里叶位置编码的具体计算方式 我看了原文 主要是为了消除神经网络拟合函数对于高频率函数的拟合效果差的情况 这里还需要抠代码才能进行更加深入地了解。
这篇文章的实验做的很详细,是可以借鉴学习的。  对于encoder :  对于decoder  对于loss计算 这里主要是set prediction和选择正负样本的方式进行训练的两者的差异  ablation实验做了位置编码的类型:  nms的必要性   encode decode层数的影响  最后通过对于不同层中间输出与特地从头训练该层的输出 两者ap的比较进行实验 得到上面的结果。
我的思考
这篇文章和同年的 group-free方法很像,那篇文章我也写了一篇博客 感兴趣的朋友可以先看看。 他们两个的整体架构都是很相似的。 都是选取k个点作为query点,把他们作为box feature输出proposals。不同的是本文是选取的fps点输出proposals 而group free选取的是前景点。显然它的方法输出的proposals质量要更高。其次 本文的下采样后的点进行了一个自注意力机制模块 扩大了感受野 其次group free的方法是stage by stage地对于前景点 在输出的proposal中进行位置编码。而本文则是对于选出的点进行傅里叶编码 我感觉这两种位置编码是可以相结合的。 最后二者的loss 设计不一样 group free是依照votenet的loss设计 分阶段计算loss 最后总和 而本文则是set prediciton及 set 匹配的形式来进行loss计算。group free的作者在实验中做了与DETR的对比 认为造成apgap的原因很有可能是gt 与 set的匹配对于网络来说是很难学习的。 总之 本文的效果是没有group free好的。
|