文章目录
开场白
- 先说为什么会看到这篇文章,很简单之前搞bev目标检测,(当然现在搞分割大模型)。现在搞目标检测已经很卷了,想要涨点的话越来越难,那这篇做检测的文章能够中ICCV说明肯定还是有点东西的。
但是学术界和工业界追求的东西还是不一样的,学术界还是看指标的你要效果够好或者idea够新有创新点才行,但工业界其实并不要求那么准,但一定要快,而且最好部署友好。你这个算法部署到产品上总不能我还给你附加一张A100或者4090吧。那我们就来看看这篇文章怎么样。
效果
老样子,先看效果,来show一下!
单从指标上来看似乎不错,性能够好,速度也快,怪不得能中。但很可惜在产品上用起来还是稍微有点难了,一看配置熟悉的配方熟悉的味道A100上跑tensorrt(打扰了)
意图
UniTR是一个统一的多模态变压器骨干,用于户外3D感知(a unified multi-modal transformer backbone for outdoor 3D perception.)。与以前的特定于模态的编码器不同,UniTR 与模态共享的转换器编码器并行处理来自多传感器的数据,并在没有额外的融合步骤的情况下自动集成它们。为了实现这些目标,我们设计了在 DSVT [60] 上扩展的两个主要transformer blocks。一种是模态内block(intra-modal block),便于并行计算来自每个传感器的数据的模态表示学习,另一种是通过考虑 2D 视角和 3D 几何邻域关系来执行跨模态特征交互的模态间块(inter-modal block)。
重点
重点是什么?重点肯定是先看图。
这个图,第一眼看过去有点复杂,如果看过之前的另一篇博客再看这篇的话就会感觉很熟悉了。
从这个流程图来看输入是camera和lidar的token,然后在intra-modal block里面各自做self-attention,做完之后在inter-modal block(2D)里面把3Dlidar投影到2D(这一步用的内外参),做自注意力操作,然后在inter-modal block(3D)里面把2d 图像投影到3d(这一步在最开始的图上看到了有无lss就合理了,应该有类似操作)再做注意力操作。
因为transformer的输入和输出是一样的,所以输入是两个输出也是两个,但看流程似乎只使用来lidar token这一支,然后经过bev pooling后面接两个头来一些感知任务(可以是3d目标检测任务也可以是bev 分割任务)。
大体上的流程就是这样了。其实也就是对DSVT: Dynamic Sparse Voxel Transformer with Rotated Sets的拓展应用,个人感觉。
Methodology
Single-Modal Representation Learning
在自动驾驶场景中感知 3D 场景需要多种模式的可靠表示,例如多视图图像和稀疏点云。由于其不一致的表示,以前的方法通过通常按顺序处理的独立编码器对每个模态的特征进行编码,减慢推理速度并限制它们的实际应用。为了解决这些问题,作者建议并行处理每个传感器的模态内表示学习,并具有统一的架构,其参数为所有模态共享。方法首先使用特定于模态的标记器将不同的模态输入转换为标记序列,然后是几个模态共享的 DSVT 块,以实现并行模态特征编码。
Tokenization
先说这部分是怎么做的吧,图像用的vit,雷达的话他说用的End-to-End Multi-View Fusion for 3D Object Detection in LiDAR Point Clouds这篇文章使用dynamic voxelization,感兴趣也可以看一下吧。
Ok,反正就体素化完了,这部分我不是很关心,大家感兴趣的深入研究一下,都很简单的做法。
Modality-specific set attention.
这一部分就是【CVPR 2023】DSVT: Dynamic Sparse Voxel Transformer with Rotated Sets这篇文章说过的,大家可以细读,没什么好说的。
Cross-Modal Representation Learning
重点来了,这部分是在DSVT: Dynamic Sparse Voxel Transformer with Rotated Sets没有,也是如何在两个模态之间做交互的关键,
大家先看前面一篇博客再看这一篇最好这样。
大家还记得在最开始的流程图里面,有一个所谓的Modality-AgnosticPartition (2D)(就是从3D到2D投影)和Modality-AgnosticPartition (3D)(就是类似于lss)
Image perspective space
首先利用相机的内部和外部参数将所有激光雷达token转换为图像平面。
这里的 DSP(·input, ·window size, ·token number of each set) 是 DSVT中引入的标准动态集分区策略。也没什么好再说的。
3D geometric space
2D到3D是怎么做的?具体来说,我们首先对一组伪 3D 网格点进行采样,VP ∈ LS ×W S ×HS×3,其中 LS 、WS 、HS 是 3D 空间的空间形状除以预定义的网格大小。然后我们将所有伪激光雷达点VP投影到其对应的虚拟图像坐标中(记为VI = {vk|(xk, yk);bk;dk)}ν k=0),其中bk和dk为视图ID和相关的深度。值得注意的是,只考虑落在视图图像中的投影点,因此有效图像点的数量ν≤|VP | × B。
使用这些伪图像点VI,我们从其最近的图像虚拟邻居中检索每个图像token的深度估计,
其中,Nearest(·virtual points,·image tokens)为最近邻函数,di表示第i个图像token的计算深度,与最近邻相同。然后我们将图像标记t1解投影回3D空间,并根据它们的2D距离生成偏移特征。
通过这种方式,我们通过预先计算的视图投影将图像和激光雷达标记统一在3D空间中,该投影可以在推理期间被完全缓存起来。
最后,利用动态集划分模块生成三维跨模态局部集
然后由DSVT块以统一的方式对其进行处理,用于3D激光雷达空间中的跨模态交互。
指标展示
最后吹水也没什么可说的必要了。
但是我还有有一些问题的,关于这些block块之间是如何处理的,输入输出具体是怎么连接的?这些可能需要看一下代码才会更清楚些。