点云transformer算法: FlatFormer 论文阅读笔记

代码:
https://github.com/mit-han-lab/flatformer

论文:
https://arxiv.org/abs/2301.08739

[FlatFormer.pdf]

Flatformer是对点云检测中的 backbone3d 部分的改进工作,主要在探究怎么高效的对点云应用transformer

具体的工作如下:
一个缩写: **PCTs 即point cloud transformers**

首先作者分析了点云transformer速度慢的原因(第三章):

最简单粗暴的是全局PCTs , 即对点云使用transformer的方式就是将每个点作为一个token,然后对一个pcd中所有点做multihead attention

比如一个pcd有10万个点,那就是10万个点做multihead attention计算,会很慢,复杂度为O(N2D),N是点数,D是每个点的特征通道数。作者分析了下,当点数到32k时,在NVIDIA A6000 GPU耗时就达到了1s,可见有多慢:

然后,为了降低耗时,有人提出了局部PCTs, 即对全局一共N个点,每个点都选择它附近的K个点做multihead attention计算,复杂度就变成了O(N
K2*D),N是点数,D是每个点的特征通道数,K是一个点附近点点数。然而,局部PCTs在邻居点准备方面存在显著的开销。由于点云的稀疏性和不规则性,涉及两个主要步骤:

  1. 找到每个点的邻居。
  2. 将数据从N×D格式重构为应用MHSA所需的N×K×D格式。

这些步骤很慢,需要大量时间。例如,在VoTr模型中,为Waymo上的单个场景准备邻居的步骤需要22毫秒(即总运行时间的36%),这已经比整个CenterPoint模型更慢。对于Point Transformer(PT)模型,准备邻居的成本可能占运行时间的高达70%。局部PCTs的单个层中的此开销可能超过CenterPoint模型的总运行时间。

然后又有人提出了窗口PCTs

SST(Swin Transformer in Point Cloud)是一种基于窗口的点云变换器,受到了Swin Transformers在各种视觉识别任务中取得的巨大成功的启发。其中,SST是代表性的工作之一。它首先将点云投影到鸟瞰空间(bird's-eye-view, BEV),然后将BEV空间分割为形状相同且不重叠的窗口,并在每个窗口内应用MHSA(multihead attention)。与Swin Transformer类似,SST使用窗口移动来实现窗口之间的信息交换。

与图像不同,点云在空间中是稀疏且非均匀分布的。因此,每个窗口中的点数不同,并且可以相差两个数量级。由于普通的MHSA核心无法有效支持可变序列长度,SST将大小相似的窗口分批处理,并在每批中将所有窗口填充到批中的最大组大小(即填充到相同的长度)。然后,它单独在每个批次中应用MHSA。在实践中,这种填充引入了Waymo上1.7倍的计算开销。更糟糕的是,将点分配到相等的窗口还引入了显著的延迟开销:在Waymo上,每个场景需要18毫秒,甚至比CenterPoint模型的总运行时间还要慢。综上所述,填充和分区的开销使得SST不太适合硬件。

最后,作者基于上面这些问题,提出了自己模型(第四章): Flatformer

作者的核心工作可以用下面这个图来展现:

FlatFormer的基本构建块是Flattened Window Attention(FWA)。

我们只要看上面这个图的右半部分就行了,左半部分是作者用来做对对比的不好的方案

如图5r所示,FWA采用基于窗口的排序来展平点云,并将其分割为等大小的组,而不是等形状的窗口。这自然解决了组大小不平衡的问题,并避免了填充和分区的开销。

FWA然后在组内应用自注意力来提取局部特征,交替排序轴以聚合来自不同方向的特征,并移动窗口以在组之间交换特征。最后,作者提供了FWA的一个实现,进一步提高了其效率并减少了开销。

相关推荐
迪小莫学AI3 小时前
【力扣每日一题】LeetCode 2412: 完成所有交易的初始最少钱数
算法·leetcode·职场和发展
c++初学者ABC3 小时前
蓝桥杯LQ1044 求完数
c++·算法·lq蓝桥杯
.zhy.3 小时前
《挑战程序设计竞赛2 算法和数据结构》第二章实现
java·数据结构·算法
Catherinemin4 小时前
剑指Offer|LCR 045.找树左下角的值
javascript·算法
_GR4 小时前
2013年蓝桥杯第四届C&C++大学B组真题及代码
c语言·数据结构·c++·算法·蓝桥杯
记得早睡~4 小时前
leetcode28-找出字符串中第一个匹配的下标
数据结构·算法·leetcode
KpLn_HJL4 小时前
leetcode - 802. Find Eventual Safe States
算法·leetcode·职场和发展
get_money_5 小时前
图论汇总1
开发语言·数据结构·算法·图论
半桔5 小时前
二叉树(C语言)
c语言·开发语言·数据结构·算法·链表·github
小林熬夜学编程5 小时前
【Python】第四弹---深入理解Python控制流:从顺序到循环的全面解析
开发语言·前端·python·算法