国内首个BEV感知全栈系列学习教程:课程总结

时间:2024-04-08 12:01:53

目录

    • 前言
    • 零. 简述
    • 一、BEV感知算法介绍
    • 二、BEV感知算法基础模块讲解
    • 三、LiDAR和Camera融合的BEV感知算法
    • 四、基于环视Camera的BEV感知算法
    • 五、BEV感知算法实战
    • 总结

前言

自动驾驶之心推出的《国内首个BVE感知全栈系列学习教程》,链接。记录下个人学习笔记,仅供自己参考

本次课程主要是课程总结,对之前学习的知识的一个复习

课程大纲可以看下面的思维导图

在这里插入图片描述

零. 简述

迟来的课程总结,以为会把剩余的实战课程看完,实际上并没有????

博主学习这门课程主要是对去年 NVIDIA 发布的 LiDAR_AI_Solution 这个 repo 比较感兴趣,而这个 repo 提供了三个模型的 CUDA 加速包括 PointPillar、CenterPoint 以及 BEVFusion,彼时博主对 BEV 算法以及 3D 目标检测任务完全不了解,因此学习了这门课程补充一些关于 BEV 算法以及 3D 检测任务的基础知识。

本次课程总结主要从以下五个方面去回顾下之前学习到的知识:

  • 一、BEV 感知算法介绍
  • 二、BEV 感知算法基础模块讲解
  • 三、LiDAR 和 Camera 融合的 BEV 感知算法
  • 四、基于环视 Camera 的 BEV 感知算法
  • 五、BEV 感知算法实战

一、BEV感知算法介绍

第一章我们主要学习了 BEV 感知算法中的一些概念,通过学习有关的基础概念构建了对于 BEV 感知算法的一个基本流程的认识,除此之外,我们还了解了一些通用数据集,典型的应用等等。

这一章我们的目的是回答出 What、Why and How 三个问题:

  • BEV 感知是什么?
    • BEV(Bird’s-Eye-View) 鸟瞰图也叫俯视图,我们称之为上帝视角
  • 为什么要做 BEV 感知?
    • BEV 感知存在尺度变化小,遮挡小的优点
  • BEV感知怎么做?
    • BEV 感知已有的方案,以 PV-RCNN 为代表的 BEV-LiDAR 纯点云方案,以 BEVFormer 为代表的 BEV-Camera 纯视觉方案,以及以 BEVFusion 为代表的 BEV-Fusion 多模态融合方案

二、BEV感知算法基础模块讲解

第二章我们主要围绕当前 BEV 感知算法当中通用的基础模块进行了学习,对 BEV 感知算法的核心模块视角转换模块进行了详细的学习,包括从 2D 到 3D,从 3D 到 2D 的视角转换。此外除了视角转换模块,Transformer 也是 BEV 感知算法当中不可或缺的一环,我们特别针对 BEV 感知算法场景下的 Transformer 进行了一个学习

这章我们的目的是学习 BEV 感知算法当中的一些基础模块,包括 2D 到 3D 的转换模块,我们以 LSS 和 Pseudo LiDAR 算法为例讲解了如何去做一个 2D 到 3D 的转换,我们主要是通过离散或者连续的深度分布值去找 3D 空间位置上的一个关系。LSS 算法作为 BEV 感知的开山之作非常重要,它提供的 2D 到 3D 转换的思路在后面的很多 BEV 感知算法(例如 BEVFusion)中都有体现

此外我们还学习了从 3D 到 2D 的逆转换过程,包含显性映射方法如 DETR3D、FUTR3D,通过将显性的参考点投影到 2D 空间中做特征采样;还有隐式映射方法如 PETR,通过网络自适应的学习 3D 到 2D 空间的一个对应关系。

最后我们学习了 BEV 感知算法中的 Transformer,它内含 self-attention 自注意力模块,与传统的通道或者空间注意力模块不同,self-attention 是针对序列而言的,是计算输入序列各个位置之间的一种关系。我们围绕视觉领域中 Transformer 的发展历程简单了解了 ViT、Swin Transformer、DETR、DETR3D 等经典算法。

三、LiDAR和Camera融合的BEV感知算法

第三章我们主要介绍了 BEV-Fusion 的方案,学习了典型的框架 BEV-SAN 和 BEVFusion,并对代表性的方案 BEVFusion 进行了实战,对其中重要的代码模块、环境配置方案、训练过程、可视化结果进行了学习

这章我们的目的是学习几种 LiDAR 和 Camera 融合的多模态 BEV 感知算法

在这里插入图片描述

BEV-SAN网络结构图

我们首先学习了 BEV-SAN 多模态融合方案,BEV-SAN 的作者发现不同类的目标在不同高度下性能存在明显差异,那所以他其实考虑的就是充分利用不同目标的高度信息来提升检测性能,缓解将 BEV 直接拍扁引起的对高度维度特征的损失。BEV-SAN 的核心点是 Slice Attention 也就是所谓的切片注意力,BEV-SAN 的作者通过全局和局部两种切片方式来尽可能多的保留 BEV 空间的高度信息,其中局部切片采用了 LiDAR-guided sampling 点云引导采样策略,通过统计不同高度范围内的点云分布来确定局部切片的高度。有了全局和局部特征后通过 SE 和 Transformer 多级特征融合模块对二者进行融合得到最终的 BEV 特征。那这篇文章的局限性主要在于其全局和局部特征构建耗时大不利于落地,其次它对深度分布比较敏感鲁棒性不够。

在这里插入图片描述

BEVFusion网络结构图

之后我们重点学习了一种非常经典的多模态融合感知方案叫 BEVFusion,那 BEVFusion 的作者认为以往的多模态融合方式无论是 Point-level Fusion 还是 Feature level Fusion 都存在着严重的主次依赖关系,那作者是想尽可能的降低这种主次依赖关系对点云和图像分别进行处理在 BEV 空间上去做融合。因此 BEVFusion 的网络结构包含图像支路和点云支路两个部分,输入的多视角图像通过图像编码器得到图像特征,图像特征通过一个 2D 到 3D 的转换模块映射到 BEV 上得到我们所谓的 BEV Camera Feature;输入的点云通过点云特征提取网络得到 3D 点云特征,直接拍扁得到我们所谓的 BEV LiDAR Feature;那有了图像 BEV 特征和点云 BEV 特征之后我们通过一个融合模块得到我们最终的 BEV 特征,其中的融合模块是一个偏向通道层面的注意力机制。

最后我们还有一个 BEVFusion 的实战部分,当然这部分视频博主并没有学习,大家感兴趣的可以看看:BEVFusion 详解视频

四、基于环视Camera的BEV感知算法

第四章是本次课程的重点,我们主要学习了基于环视视觉方案的 BEV 感知算法,纯视觉方案成本非常低,我们学习了七种主流的 BEV 感知方案,包括基本方案和其进阶的版本,比如 BEVFormer 和 BEVFormerv2 还要 BEVDet 和 BEVDet4D 等等,最后我们对其中具有代表性的纯视觉方案 BEVFormer 进行了实战学习,包括 BEVFormer 代码中的一些重要模块,如何去训练 BEVFormer,它的数据处理和训练流程,还要一些可视化结果分析

这章我们的目的是学习环视 Camera 的 BEV 感知算法方案

我们首先对环视 BEV 感知算法进行了一个背景介绍,BEV 环视的优势在于可以将多视角的图像数据统一的融合到 BEV 视角下做一系列的任务,其难点在于如何把环视数据统一的映射到 BEV 空间上面。此外我们还简单了解了接下来会讲解的一些主流的环视 Camera 的 BEV 感知算法,包括 DETR3D、BEVFormer、BEVDet、PETR、BEVDepth、BEVDistill 等等。

在这里插入图片描述

DETR网络结构图

DETR3D 其实是 DETR 在 3D 领域的延伸。我们都知道 BEV 感知算法的核心是视角转换模块,那以往的视角转换方法是从 2D 到 3D 再到 BEV,而 DETR3D 作者不是这么做的,他是从 3D 到 2D,通过 Object Query 生成一系列的 3D 参考点,将 3D 参考点投影到 2D 图像平面上去采样特征,然后将多尺度特征拼接成完整的特征向量去做当前 Object Query 的预测,通过这样一个不断迭代优化的过程后输出最终的检测结果。此外,DETR3D 的损失函数沿用的是 DETR 的二分图匹配损失,每个 GT 只会和一个预测结果对应,不再需要额外的后处理方法。

在这里插入图片描述

BEVFormer网络结构图

BEVFormer 的整体流程是多视角图像通过 Backbone 提取到多视角图像特征,多视角图像特征加上历史 BEV 特征和 BEV Queries 一起输入到一个叫 SpatialTemporal Attention 的结构中得到我们当前的 BEV 空间特征。那其中最重要的是 SpatialTemporal Attention 结构中的 Temporal Self-Attention 时序注意力模块和 Spatial Attention 空间注意力模块,通过时序注意力模块我们可以把历史 BEV 信息融合生成一个具有强烈先验信息的 BEV Query,通过空间注意力模块我们可以提取我们想要空间位置的信息来生成我们最终想要的 current BEV。此外我们还简单介绍了一下 BEVFormerv2,它的主要改进在于引入了一条额外的支路来监督图像网络参数的更新。

在这里插入图片描述

BEVDet网络结构图

BEVDet 作者本身其实并没有提出任何创新的模块而是更关注于 BEV 去做 3D 目标检测的可行性。它的完整流程也非常简单,多视角输入图像经过 Image-view Encoder 提取图像特征,图像特征经过 View Transformer 视角转换转换到 BEV 空间得到 BEV 表征,接着通过 BEV Encoder 进一步编码 BEV 特征,最后送入检测头得到检测结果。那在训练过程中 BEVDet 的作者发现 BEV Encoder 存在严重的过拟合问题,这是由于图像层面的增广并没有提升 BEV Encoder 的表征能力,无论原始图像怎么变 BEV 空间的表征是不变的,此外图像 Encoder 的输入是 6 个相机而 BEV Encoder 的输入只有一个,训练数据的不足也进一步导致了 BEV Encoder 的过拟合问题,因此 BEVDet 作者将两个 Encoder 编码器的数据增广分开来做了,保证 BEV Encoder 也能得到充分训练。另外 BEVDet 作者还提出了 Scale-NMS,由于 BEV 空间中有些目标占比很小导致冗余的框与 GT 之间并无交集,在进行 NMS 时无法充分过滤掉这些冗余的框,于是 BEVDet 的作者提出了 Scale-NMS 先将每个对象类别先进行一定大小的缩放再进行 NMS 之后 rescaling 回来。

在这里插入图片描述

BEVDet4D网络结构图

BEVDet4D 是 BEVDet 的延续,其中的 4D 表示除空间中的三维外它还增加了时序维度,BEVdet4D 本身的网络结构其实并没有发生变化,还是分成了图像编码器、视角转换模块、BEV 编码器和检测头这几个部分,那不同的是 BEVDet4D 作者考虑了利用不同时序的 BEV 特征为后续检测提供更加强烈的先验信息。那不同时序的 BEV 特征直接相加会导致空间位置的偏差,BEVDet4D 的作者考虑的是先对齐然后再级联相加,通过引入自车运动的转换矩阵来抵消静止车辆相对于自车而言的位置偏差,由此完成对两个时刻的特征图进行对齐。

在这里插入图片描述

PETR网络结构图

PETR 的作者认为像 DETR3D 这种通过参考点来采样图像特征更新 Query 的方式可能会导致采样的特征不是特别准确,存在一定的偏差,此外参考点比较 Local 对于全局特征的学习不够充分,而且采样过程比较复杂难落地。所以 PETR 的作者考虑的是引入 3D 位置编码将多视角的 2D 图像特征转换为 3D 位置感知特征,其中的 3D 信息通过 3D 坐标器生成,具体是将相机视锥空间离散成网格,通过相机内外参将网格中的每个点转换到 3D 世界坐标下,融合了位置信息的 3D 感知特征会和 Object Query 一起送入到 Decoder 来生成 3D 目标检测结果,这就是 PETR 完整的流程。此外,我们还简单介绍了一下 PETRv2,它与 PTER 的主要区别在于时序建模和多任务学习,引入时序信息可以生成更好的特征,不过需要保证不同帧的对齐,多任务意味着不仅仅有检测任务还包含分割、车道线等等。

在这里插入图片描述

BEVDepth网络结构图

BEVDepth 的作者围绕 Depth 深度估计展开,他认为现有的方法由于缺乏明确的深度监督很难做出准确的深度感知结果,此外深度估计子网络不能充分利用相机的内外参数导致无法有效推断像素深度,基于此 BEVDepth 作者提出了一个深度预测模块,与之前的深度分布估计方法不同的是 BEVDepth 引入的是有监督信息的深度估计,这些监督信息来自于点云的投影,这就是 BEVDepth 的核心内容了,通过点云投影到图像这个深度监督信息的引入让深度估计得更准。

在这里插入图片描述

BEVDistill网络结构图

BEVDistill 有 LiDAR 和 Camera 两条支路,分别得到 BEV Feature 和预测结果,然后再利用特征损失和实例损失去引导图像支路像点云支路去学习,考虑到点云模态和图像模态之间的差异性,我们在计算损失的时候是不能直接做差的,需要分别乘上相应的权重。本身 BEVDistill 中的各个模块是可以替换的,它提供的是一种核心的思路,是对特征层面和预测结果层面的对齐。

最后我们还有一个 BEVFormer 的实战部分,当然这部分视频博主并没有学习,大家感兴趣的可以看看:https://github.com/fundamentalvision/BEVFormer

五、BEV感知算法实战

第五章设计了一个独立的大作业模块学习自己设计一套完整的 BEV 感知方案,来处理后续的 3D 检测任务

最后的大作业模块博主也没有学习,这部分是以 BEVerse 为例去讲解的,大家感兴趣的可以看看:https://github.com/zhangyp15/BEVerse

总结

整个系列课程学习下来更偏向于理论,对博主而言柒柒老师的讲解非常 nice,通俗易懂,从一开始对 BEV 感知算法完全不懂,到现在慢慢的了解其中的一些基本概念,并对许多的 BEV 感知算法有个基本的了解,大家对 BEV 感知算法感兴趣的可以学习一下????

一路走来收获颇丰,感谢柒柒老师????