自动驾驶之心推出的《国内首个BVE感知全栈系列学习教程》,链接。记录下个人学习笔记,仅供自己参考
本次课程我们来学习下课程第四章——基于环视Camera的BEV感知算法,先来了解下环视的背景
课程大纲可以看下面的思维导图
从我们第四章开始我们会对环视 BEV 感知算法去进行详细的讲解,那环视背景我们主要分为三个模块,4.1 到 4.3 节是主要针对背景介绍,第一个是环视背景,我们为什么要做环视,环视有什么优势;另外一个是对环视思路的一个讲解;另外第三个是我们本次课程当中涉及到的一些环视 Camera 算法的讲解
OK,我们先看一下环视是什么,我们说的 BEV 环视,环视是什么,那我们在讨论环视之前,先来了解一下为什么需要摄像头?
与其他传感器相比,相机具有最密集的信息,所以说信息非常密集非常丰富那从中提取到信息也是非常具有挑战性的一件事情,但同时它的信息也是非常有用的,那所以我们要用环视的相机的设置来去做我们自动驾驶任务。另外一个是成本的考虑,与其他的利用激光雷达的传感器相比,相机也是很便宜的,而且相机在探测长距离物体方面它的性能往往表现是比较好的,那提取完环视信息之后可以做一些视觉的任务,比如像道路探索,比如像交通灯的状态,行车标志等等,像这些东西是需要视觉去感知的,像普通的激光雷达是很难做到这些事情的
那我们知道我们说的环视是一种环绕摄像头的设置,那摄像头的数量可能会因为不同的自动驾驶公司产生一点点的区别,通常情况下来讲每辆车一般是 6-12 个摄像头,可能需要这些多个相机覆盖车辆周围的 3D 场景,那如果只有单一相机会出现什么问题呢,比如我们可能只有前视角的图像,那前视角的数据是一个比较局限的数据,如果利用单一视角的数据去做后续的一系列的感知任务的话,那对我们的安全性是具有严重的挑战的
那另外一个我们再看一个事情,我们说的环视传感器是我们相机的本身硬件带来的优势,那环视为什么要做 BEV 呢?那俯视空间跟环视传感器是什么关系呢?鸟瞰图其实是非常适合环视的一种特征表达方式,我们在鸟瞰图中使用 3D,为什么呢,因为它与 360° 的传感器融合会很自然
我们举个简单例子,比如像 LiDAR,比如像 Radar,我们在多视角场景下怎么样把这个多视角的数据统一到一个特征空间上面去做融合判断呢,哪个空间很适合做这个事情呢,俯视空间很适合做这个事情,BEV 当中操作可以很好的模拟动态场景的时间一致性,与普通的透视视图相比,透视视图就是所谓的相机视角,BEV 中的运动补偿就是平移,还有旋转的建模,是要简单很多的。
那比如在 BEV 视图当中车辆自身的这个姿态变化取决于运动,那我们如果在透视视图当中,普通的相机视角下如果车辆自身发生变化的话,它的姿态变化取决于什么呢,取决于深度和运动,所以说在 BEV 空间当中考虑车辆的姿态变化是一个相对简单的事情。另外一个在 BEV 视图当中我们也讲过目标是具有尺度一致性的,而透视图不是比如前视图物体离我们前视图越近,它看起来越大,离我们相机视角越远看起来越小,那所以透视图具有尺度变化差异,同一个物体可能产生特征上的差异性,那这就给我们后续的检测会带来一些困难
然而 BEV 视图不是,BEV 视图下同类目标尺度差异我们可以认为近似没有,小轿车应该都差不多大,它的差异也只是微小差异,所以我们说 BEV 视图学习特征尺度一致性会变得更加容易
那如果构造出一个比较好的 BEV 空间的话对后续的下游任务也是更好的,后续下游任务有哪些呢,比如说像运动预测,运动规划,那在 BEV 视图下有一个通用坐标系去处理这个事情,那所以我们说环视的优势就在于它可以利用 360° 的相机数据来看我们的 3D 场景,那 BEV 环视的优势呢,是将多视角数据可以统一的融合到 BEV 视角下去做后续一系列的处理任务,那它难点在哪呢,难点就是我们怎么把环视数据统一的都能映射到 BEV 空间上面,那这是任务的难点。
那前面我们学习了一个简单介绍,我们再来看一下环视思路是什么,那大家现在都是怎么做环视的呢
博主这里以 2023/12/10 当天的 nuScenes 榜单为例,模态选的是 Camera 是相机模态,也就是纯相机方案,排名是按照 mAP 指标排名的,那 mAP 应该是越高越好的一个指标。我们从这些排名靠前的算法名称来看,因为名称是能体现算法的主体思路的,入眼的第一个词是什么,是 BEV,那 BEV 也是我们课程的核心内容;第二个词是什么呢,是 Former,Former 是什么,那我们比较直观的理解就是 Transformer,属于什么呢,属于技术方法
所以环视算法就目前来看使用特征空间最好的是什么呢,是 BEV 空间,通用的技术模块是什么呢,是 Transformer,那我们榜单上面的做法大家都是这么做的。OK,我们就这里简单看一下
下面我们结合课程当中的主要方法对各种环视算法进行一个简单介绍,给大家介绍一下我们课程涉及到的一些方法它们的思路是什么,是涉及哪个方面的,那我们按照大纲的顺序一个一个看,那详细的算法是怎么实现的呢,后续在详细的章节中我们再展开
我们说 BEV 感知算法的核心是什么,是 BEV 特征空间的构建,我们怎么把环视图像输入转换到 BEV 上是我们算法的核心内容,我们这里要说的第一个算法叫 DETR3D,它的框图如下所示:
DETR3D 从名字上看很明显是 DETR 从 2D 到 3D 领域的延伸,那 DETR3D 怎么构建 BEV 特征的呢,它如何去生成我们要的 BEV 表征呢,其实 DETR3D 特征构建围绕的是 Query 展开,通过 Object Query 找到对应的 3D Reference Points 去利用 Reference Points 到 2D 图像上采特征,通过 3D 到 2D 这样取特征的方式得到目标的 BEV 表征,后续我们会对这个表征不断地迭代不断地优化,然后输出最终的检测结果,那我们刚刚说的流程其实就是我们在第二章中提到的从 3D 到 2D 的流程,是 DETR3D 中做的
我们再说第二个 BEVFormer,它的框图如下所示:
BEVFormer 输入的同样是多视角图像,输出的是分割和检测的结果,BEVFormer 想建立的 BEV 表征中依赖什么呢,我们看到上图中有两个模块,一个模块是 Temporal Self-Attention 时序注意力,一个模块是 Spatial Cross-Attention 空间注意力。这意味着 BEVFormer 它在构建 BEV 空间的时候它需要既关注当前时刻的 BEV 特征也要关注到我们历史 BEV 特征,那所以它这里历史 BEV 是作为时序信息引入到当前 BEV 表征生成当中的。那空间注意力什么意思呢,空间注意力融合的是跨视角的信息,不同视角其实对应的 3D 空间不同位置的表征嘛,图 (b) 中蓝色和绿色其实对应的是多视角的特征,那这样跨视角的融合我们叫空间融合
那所以 BEVFormer 它关注的并不是我们怎么拿特征,而是关注的是我们怎么样利用时序信息利用空间信息让我们的 BEV 生成得更好,有了更好的 BEV之后呢,我们是不是就可以得到更准确的检测结果了,那这就是 BEVFormer 的主要思路
我们再看第三个内容 BEVDet,它的框图如下所示:
BEVDet 它还有一个后续的延伸框架叫 BEVDet4D,那两个工作其实是一脉相承的,4D 其实是比普通的 BEVDet 这个框架多了一维信息,这个信息是什么呢,我们通常说 3D 空间是三维维度,4D 是啥意思,那就是额外添加了一维嘛,添加了时序维度,也就是说除了我们通用的空间维度之外呢,BEVDet4D 引入了时序维度所以叫 4D
那 BEVDet 它的一个整体流程其实非常简单,它对于输入的多视角图像先提取图像特征,然后将图像特征转换到 BEV 空间,再通过一个 BEV 编码然后输出后续的检测结果,所以 BEVDet 这个工作其实更偏向一个偏工程性的一个工作,那也就是说本身这个工作没有特别有创新的地方,那本身是没有设计出任何新的模型的,而是更关注于我们基于 BEV 去做 3D 检测的可行性,能不能使用 BEV 去做,是不是很实用,它关注的是工程性质上的一些应用,是通过一些成熟的框架来构建这个完整的 BEVDet 的一个模块
所以也给了我们一个启发,我们不一定要有非常好的 idea 才能发文章,往往业界更关注的是工程能力,实际的性能,那 BEVDet 也开源了一个 tensorRT 的版本,性能也非常强劲,也是比较推荐学习的,大家感兴趣的可以看看:https://github.com/LCH1238/bevdet-tensorrt-cpp
我们课程第四块内容是围绕 PETR 展开的,它的框图如下所示:
PETR 看名字我们可以知道它是 DETR 的延伸,我们知道 DETR 是 2D 目标检测,所以在位置编码的时候引入的是 2D 位置编码,输出的特征我们通常认为已经隐式的感知到了 2D 位置关系。那 PETR 做什么事情,我们需要处理的任务是 3D 检测任务,那所以我们如果仅仅使用 2D 位置编码肯定是不够的,所以 PETR 引入了 3D 位置编码,将 3D 坐标编码进多视角图像当中,我们从图中可以看到它有一个 3D 坐标生成器,通过 Encoder 网络将 3D 坐标编码到 2D 特征当中。我们认为这种隐式的对应关系可以让 2D 特征能够很好的感知到 3D 空间位置关系,也就是说输出的特征对 3D 空间位置是比较敏感的,我们位置一旦发生了变化,所对应的输出特征也会发生变化
所以隐式是什么意思,我们为什么一直强调隐式和显式,隐式的意思是说我们没有一个明确的监督信息,没有一个明确的提示,它对深度是一种隐式的学习,我们也不知道网络怎么做的,反正学得挺好,我们没有给明确的提示,但网络就是能学出来,所以我们一般把这种行为叫隐式
另外第五部分我们围绕 BEVDepth 展开,它的框图如下所示:
我们课程规划还是希望尽可能地覆盖全面,BEVDepth 从名称上看是给我们提供了一种不一样的 BEV 视角,它更关注什么呢,深度信息,那深度已经是我们强调的非常重要的概念了,在 2D 到 3D 的特征重构当中不可或缺,我们也讲过以往的深度怎么做,2D 到 3D 离散深度分布,2D 到 3D 还有连续的深度预测
那 BEVDepth 其实是属于离散的一个范畴,离散深度分布估计的范畴,但是它的不同点在于为了深度分布提供了显式的监督信息,那这个监督来源在哪呢,它这个监督是官方提供的标注嘛,其实不是,深度监督信息来源于对应的 3D 点云的投影,我们知道 3D 点云其实是包含了深度信息的,那这个深度信息其实是可以作为我们 2D 深度估计网络的监督使用的,用于辅助深度预测网络的训练,利用 3D 点云提供的深度信息作为监督帮助深度信息网咯学习得更好
所以总的来说,BEVDepth 这篇文章还是围绕一个如何预测更准确的深度展开
那我们最后一块叫 BEVDistill,它的框图如下所示:
BEVDistill 这个工作其实是给大家提供了一个完全不一样的看问题的视角,我们说现在的 LiDAR-based 的方法比 Camera-based 的方法性能要更好,那这个更好的信息来源是什么呢,那信息来源其实是因为本身 LiDAR 它的 3D 位置空间信息更好,那所以它塑造一个更好的 BEV 特征,那我们能不能将这个更好的 BEV 特征迁移到图像 BEV 上呢,图像 BEV 能不能从点云 BEV 上学习到这种更好的特征表达呢,那这就是 BEVDistill 考虑的核心内容
所以说 BEVDistill 通过这样的一个 Teacher 和 Student 学习蒸馏的模式,我们促使图像 BEV Featute 向点云 BEV Feature 学习到更好的特征表示。所以从另外的角度它也告诉我们一个道理,除了网络最终的相互竞争以外,我们还可以对中间特征还有中间预测集合去进行约束,利用特征我们可以使得图像特征向点云特征学习,通过预测集合的约束我们可以知道图像预测结果可以点云的预测结果学习,那如果学的好这个损失就小,学得差这个损失就偏大。通过这样的方式促使我们环视算法尽可能的在特征提取上在性能上可以逼近 BEV-LiDAR 的方法
以上是我们第四章涉及到算法的基本介绍,那我们最后一节会挑选 BEVFormer 作为实例代码来给大家讲解
在这节课程我们主要对环视 BEV 感知算法进行了一个背景介绍,BEV 环视的优势在于可以将多视角的图像数据统一的融合到 BEV 视角下做一系列的任务,其难点在于如何把环视数据统一的映射到 BEV 空间上面。此外我们还简单介绍了课程接下来会讲解的一些主流的环视 Camera 的 BEV 感知算法,包括 DETR3D、BEVFormer、BEVDet、PETR、BEVDepth、BEVDistill 等等。
下一节我们会讲解具体的环视 BEV 感知算法 DETR3D,敬请期待
[1] Singh et al. Surround-view vision-based 3d detection for autonomous driving: A survey
[2] Wang et al. Detr3d: 3d object detection from multi-view images via 3d-to-2d queries
[3] Li et al. Bevformer: Learning bird’s-eye-view representation from multi-camera images via spatiotemporal transformers
[4] Huang et al. Bevdet: High-performance multi-camera 3d object detection in bird-eye-view
[5] Huang et al. Bevdet4d: Exploit temporal cues in multi-camera 3d object detection
[5] Liu et al. Petr: Position embedding transformation for multi-view 3d object detection
[6] Li et al. Bevdepth: Acquisition of reliable depth for multi-view 3d object detection
[7] Chen et al. Bevdistill: Cross-modal bev distillation for multi-view 3d object detection