门户网站建设检察,股票分析网站可以做推广吗,安徽安庆网站建设公司,福州绿光网站建设工作室目录 前言1. BEV感知算法的概念2. BEV感知算法数据形式3. BEV开源数据集介绍3.1 KITTI数据集3.2 nuScenes数据集 4. BEV感知方法分类4.1 纯点云方案4.2 纯视觉方案4.3 多模态方案 5. BEV感知算法的优劣6. BEV感知算法的应用介绍7. 课程框架介绍与配置总结下载链接参考 前言 自动… 目录 前言1. BEV感知算法的概念2. BEV感知算法数据形式3. BEV开源数据集介绍3.1 KITTI数据集3.2 nuScenes数据集 4. BEV感知方法分类4.1 纯点云方案4.2 纯视觉方案4.3 多模态方案 5. BEV感知算法的优劣6. BEV感知算法的应用介绍7. 课程框架介绍与配置总结下载链接参考 前言 自动驾驶之心推出的《国内首个BVE感知全栈系列学习教程》链接。记录下个人学习笔记仅供自己参考 本次课程我们来学习下课程第一章——BEV感知算法介绍一起去了解下 BEV 感知算法的一些基本概念、典型应用 课程大纲可以看下面的思维导图 1. BEV感知算法的概念
在讨论什么是 BEV 感知算法之前呢我们可以对这个词去做一个拆解拆分为三个部分一个是 BEV一个是感知一个是算法 那什么是 BEV 呢
Bird’s-Eye-View鸟瞰图俯视图通俗的讲它是一种从上往下的拍摄视角现在很多表述中习惯把 BEV 称为上帝视角BEV 视角空间优势尺度变化小遮挡小
首先 BEV 视角第一个优势尺度变化小该怎么去理解呢那我们以上图为例它在一个正视图的视角下存在远小近大的特点离相机比较近的目标尺度比较大离相机比较远的目标尺度比较小相反我们在 BEV 空间去看会发现尺度差异变化其实是非常小的那尺度变化小则网络对特征一致的目标表达能力更好所以尺度变化小是 BEV 空间的一个优势
第二个优势就是基于 BEV 感知算法的视角遮挡是比较小的这其实也是一个很直观的理解当前后两辆车同时出现的时候后面的车会很自然的将前面的车遮挡那如果我们在视觉特征丢失的情况下通过前视图的方法是很难把后面的车辆预测到的相反我们在 BEV 视图下可以很清晰的把遮挡的车完整的进行区分这是 BEV 俯视图的第二个优势
那我们在了解了什么是 BEV 之后我们讨论第二个问题什么是感知
通常而言我们说的感知是指从人类的角度来讲是外界事物在人脑中的一个响应举个简单的例子比如告诉你现在我面前有一根香蕉那你在脑海中会构造出一个黄色的然后弯弯的香蕉性质那同样我们说的 BEV 感知是什么呢是客观世界图像去在 BEV 视角下的一个响应比如我们在前视图上有一个车那在对应的 BEV 视图上也应该有一个车的样子那我们刚刚说的这个过程其实就是一个 BEV 感知的过程更加学术的表达是利用感知模型将多传感输入统一到 BEV 表征这里的多传感输入主要包括图像、毫米波雷达、激光雷达等等
我们说完了感知这个问题那我们进入下一个方面什么是算法
那算法通俗意义上来讲是一种数学模型它是试图去帮助计算机理解不同输入从而可以实现不同任务举个简单例子比如你想检测一个 2D 目标那我们会设计 2D 目标检测算法那我们想检测 3D 目标我们就会设计 3D 目标检测算法那同样如果我们想生成 BEV 视角的图像那我们设计的就是 BEV 感知算法
通过对 BEV 感知算法词的拆解我们讲解了 BEV 视角空间是什么什么是感知什么是算法
接下来我们考虑另一个问题我们说的 BEV 和感知哪个更重要呢
那明显是感知更重要BEV 空间是一个已经提出很多年的概念而我们提的 BEV 本身只是一个俯视视角空间的概念通俗的讲它就是一个壳子那我们怎么把不同的输入数据套到这个壳子里面这才是问题的关键那所以说我们现在很多算法的设计是围绕我们所提到的这个感知模块去做的我们如何设计一个比较好的感知模块是 BEV 感知算法的一个核心点。
OK我们在了解了基本概念之后我们再来补充下基本的 BEV 感知算法是利用哪些数据实现了哪些任务后续可以有哪些扩展如下图所示 在上图中我们也做了一些标记和说明首先我们提到的 BEV 感知任务是一个建立在多个子任务基础上的概念这些子任务包括分类、检测、分割、跟踪、预测、控制规划等等是一个比较综合性的概念那我们的课程还是以自动驾驶中非常常见的检测任务去做介绍的那如果后续涉及到一些多任务的框架时我们也会做一个额外的讲解
其次我们所说的 BEV 感知它的输入其实也是比较广泛的包括毫米波雷达、点云数据、相机图像、GPS数据、轨迹等等本次课程中我们还是围绕最常见的输入展开我们主要涉及的是雷达点云、图像数据
那按照不同的输入我们常见的 BEV 感知算法的分类也比较清晰了以相机图像为输入的算法我们称之为 BEV Camera是一种纯视觉的方案那比较具有代表性的像 BEVFormerBEVDet 等等我们后续会详细介绍如果以单点云作为输入的方法我们称之为 BEV LiDAR比如像 PV-RCNNPV-RCNN等等它们一般是将处理后的点云特征映射到 BEV 平面上生成 BEV 特征那还有一种方案是以图像和点云混合输入的方法我们称之为融合感知的方法叫 BEV Fusion那像这类方法同时处理图像和点云特征去生成 BEV 感知的一个多模态融合起来的特征表达最具代表性的就是 BEVFusion后续课程我们也会有相关框架的一个详细讲解
明白了 BEV 感知算法这个基础概念之后那我们自然会想 BEV 感知算法到底是怎做的它是如何处理多种数据的是如何去生成 BEV 表征的它如何去做不同的任务的那这些内容我们会在余下的课程中去做一一的讲解。
2. BEV感知算法数据形式
我们在上面有提到过 BEV 感知算法主要包括两种输入可以分为三种形式
其中的两种输入是指相机图像输入和激光雷达点云输入那三种形式是包括纯图像形式纯点云形式以及图像点云多模态融合的形式无论是哪种形式均是以单独或者融合的图像或者点云作为输入的所以我们在这节内容中会分别介绍在 BEV 感知算法当中对图像和点云处理的方式
我们先来看下什么是图像 图像从原理上来讲是由相机生成的将三维世界中的坐标点单位为米映射到二维图像平面单位像素图像本身是会损失掉三维空间信息的因为我们会将深度维度去进行一个压缩将原本的三维世界坐标投影到二维平面上
那可能你会疑惑图像既然有损失了那为什么我们还要使用图像作为输入数据呢
那这是因为虽然图像在深度维度上是有明显的信息损失的但它也有明显的优势它是一种密集型的表达纹理信息非常丰富比如上图中我们从图像上可以清晰的看到车窗、车轮等等而且现在通用的相机便宜成本低这也就是为什么现在很多自动驾驶公司去大力推行纯视觉感知的原因之一
此外我们基于图像任务的通用基础模型相对而言是比较成熟的2D CV 的发展已经非常之久了它的一些任务比如检测、分割等等性能都已经非常好了所以我们可以有效借鉴 2D 图像算法中的一些基础框架或者基础的特征提取模块去完成我们所谓的 3D 检测任务
那最经典的 3D 检测算法比如像 FCOS3DDETR3D 等等其实都是来源于 2D 算法只不过将其扩展到 3D 领域而已
那对于一张图像而言我们一般用 HxWxC 来表示其中 H 代表图像的高度W 代表图像的宽度C 代表图像的通道维度通常我们处理的是包含 RGB 3 个通道的彩色图像所以一般而言通道数 C 都是 3。图像是由一个个像素组成的对于 RGB 彩色图像而言每一个像素的取值范围是 0~255每个像素位置坐标我们一般会用 (x,y) 表示或者像素平面的 (u,v) 表示与我们后续要讲的点云数据是有本质区别的
OK我们了解了什么是图像数据之后我们自然会想知道通用的 BEV 感知算法中一般会用什么样的网络去处理图像数据呢
我们这里以 BEVFormer 和 BEVFusion 两个经典网络为例来看看他们是怎么处理图像数据的 先看 BEVFormer它是一个典型的 BEV-Camera 的方法也就是我们仅仅依赖于相机图像数据输入的一组图来作为我们网络的输入那多视角图像作为 input 输入之后会通过 Backbone 网络提取得到 Multi-Camera Features 图像特征其中的 Backbone 就是一个典型的图像处理网络利用这个骨干网络提取原始的多视角图像数据的特征后续拿这个特征可以生成 BEV 或者用它来做检测等等都是可以的。 OK我们再来看下另一种方案 BEVFusion它是一种典型的基于融合的方法它依赖于相机图像和点云两个输入图像方面 Multi-view Images 多视角图像作为输入通过 Encoder 生成 Muliti-view Features 多视角图像特征那显然在 BEVFusion 当中图像处理模块叫做 Encoder
无论是 BEVFormer 中的骨干网络还是 BEVFusion 中的图像编码器他们只是图像处理网络模块的不同命名而已使用的网络其实都是比较一致的一般是 2D 图像处理框架中提取图像特征的一些通用网络比如说像 ResNetResNetFPN 等等
所以说对于图像处理模块我们只要明白一点无论是基于相机图像的还是基于多模态融合方法的它们对于图像特征的提取是大同小异的它们都是使用已有的 2D 图像网络去做的
那我们上面说完了图像输入那 BEV 感知算法其实还有一种常见的数据形式那就是点云输入 我们先分析下什么是点云点云这个概念我们一听可能很晦涩通俗的讲点云其实是很多点的一个集合。在上图中的场景中我们发现它不同于我们常见的图像这个场景其实是由一个个点组成的有黄色的、绿色的、粉红色的等等。我们上面所展示的其实就是一个很典型的点云场景那这个点云场景有什么特点呢它与图像有什么区别呢
首先第一点它是一个稀疏性场景稀疏性我们怎么来理解呢从图中我们能看到除了一些颜色鲜明的前景区域外还有一些黑色区域我们需要注意的是黑色区域是没有点云信息的那意味着我们在特征提取的时候黑色区域是没有区域特征的那产生这些黑色区域的原因是什么呢通常的原因还是由于我们采集设备的限制采集点云的时候通常是通过激活雷达传感器去进行采集的激光雷达会发射三条射线如果发射的射线碰到物体它会产生一个反射通过激光雷达采集这个反射信息我们就可以知道哪些地方是有物体的那如果没有反射信息激光雷达就采集不到信息 我们按照这个思路去推导现在如果有一个物体恰好出现在前面物体的正后方也就是后面的物体被前面的挡住了如上图所示那我们可以采集到前面物体的信息而后面物体的信息会由于遮挡导致点云缺失这也是导致稀疏性的一个原因
另外还有一种什么情况呢从上图中我们可以看到点云数据分布呈现出一种明显的远少近多的情况远处相对而言它的点云数据是比较少的而离我们激光雷达近的地方相对而言点云数据是很多的那这又是什么原因呢
我们还是以上面的射线发射图为例这是由于射线的一个发散性导致的远距离采样间隔大相对而言近距离采样间隔是比较小的同样的目标远距离可能会漏采那在近距离可以很好的被捕捉到
OK我们说完了稀疏性那点云还有个什么特点呢还有个无序性的特点
那这个无序性该怎么去理解呢我们之前有说点云其实是很多点的一个集合那假设现在有一个点云集合 {1,2,3,4,5} 包含 5 个元素那我们将集合中的元素顺序交换对集合本身有影响吗比如说 {2,1,4,3,5}那显然是没有影响的这 5 个数还是五个元素所以我们通常讲的点云的无序性它是意味着无论我们点云集合中的点是以何种顺序排列的它并不会对本身点云集合产生一些比较严重的影响
我们说点云它既稀疏又无序那我们为什么还要用它呢这是因为我们的激光点云数据是对 3D 场景一种非常好的表现形式它是包含深度维度这个信息的通过深度这一维度的表达人不会是一个纸片人车也不是纸片车它是一种很立体很显性的表达方式。
图像数据也好点云数据也好它们都是有一些缺点的任何数据其实都不会完美我们需要考虑的是怎样扬长避短去发挥这个不同模态数据的优势。
那我们来简单总结下
什么是点云
点云的基本组成单元是点点组成的集合叫点云
点云有什么特点
稀疏性无序性是一种 3D 表征
那说完了点云是什么它有哪些特点后下面我们来讲解下怎么去表示一个点云数据那我们反复的说点云其实是点的集合那对于一个点的集合我们一般写成 P { P 1 , P 2 , . . . P N } P \{P_1,P_2,...P_N\} P{P1,P2,...PN}这个点云集合里面其实包含了 N 个点那里面每一个点怎么表示呢由于点云是 3D 场景所以说其中的每一个点可以用 3D 坐标进行表示也就是 ( x , y , z ) (x,y,z) (x,y,z)有了这样的表示方法我们就可以把点云场景转换为完整的数学表达从而可以通过我们所说的数学模型那也就是网络去进行后续 3D 点云特征的提取
我们讲过了点云特征是怎么表征后我们来思考下一个问题我们应该怎么提取点云特征呢 那现在通用的 3D 点云特征提取方法是 Point-based 基于点或 Voxel-based 基于体素两种方式通过这两种方式去在一个庞大的点云数据当中提取出 3D 场景的点云表征
那一般而言基于点的方式我们会在庞大的点云数据当中选取一些关键点比如上图中绿色的点 ● 是一个关键点黄色的点 ● 是我们点云场景以绿色关键点为中心提取到的附近或周围的一些特征点这就是基于点方法的特征提取。附近周围怎么界定呢通常 Point-based 方法是以一个球面空间作为界定的以关键点为中心的球体中所包含的所有点我们认为是对关键点起特征加强的一些点它们的特征会全部聚合到我们所选取的关键点上面这种方法我们称之为 Point-based 也就是基于点的方法。
那另一种方法是基于体素或者说网格传统的基于点的方法是从已有点云出发挑选一些关键点而基于体素的方法则是从场景出发将场景划分为多个小块比如上图中的场景被划分成了 5x5 的块蓝色部分是场景中的一些点云数据通过对一定区域内的点云进行一个聚合就会得到提取后的点云特征也就是图中的绿色部分这有点类似于卷积的过程
可以看到无论是基于点的方式也好还是基于体素的方式也好讨论一个独立点是没有意义的我们都需要采用一定的聚合方法这是因为随机采样的一个点很难区分出是属于人还是车还是其他背景物体单独讨论一个点意义不大需要结合其局部的空间信息进行探讨那对于 Point-based 方法而言我们考虑的是关键点和它附近点的一个特征而对于 Voxel-based 方法而言我们聚合的则是一定立体空间范围内的点
那明白了点云特征怎么提取之后我们再来看下点云特征是怎么用在 BEV 感知中的我们以 BEVFusion 的方法为例流程如下图所示 从图中可以看到 LiDAR Stream 中是以点云为输入的通过 3D 骨干网络得到点云特征一般来说我们得到点云特征后是可以直接处理得到 3D 检测结果的那后面的处理我们可以先不关注在之后的课程中我们会详细分析目前我们主要关注常用框架中点云网络是怎么提取点云特征的就行
OK至此我们对 BEV 感知算法中常见的数据形式和数据处理方法做了一个基本讲解那更为详细的框架讲解我们会在后续涉及到相应模块时再做说明
那以上就是这小节的主要内容
那我们说了这么多数据有没有一些实际的数据呢那这就进入到我们下一小节的内容
3. BEV开源数据集介绍
OK我们继续开始 1.3 小节 BEV 开源数据集的部分
通常 3D 数据集为了适配不同的任务它的种类是非常多的那比如一个 3D 检测数据集、3D 分割数据集还有轨迹规划数据集还有一些地图数据等等那我们课程中主要还是围绕自动驾驶中主流的 3D 检测任务给大家介绍两个最常见的数据集一个是 KITTI一个是 nuScenes 以及它们的一些格式怎么用这个数据集
我们首先介绍一下 KITTI 数据集
3.1 KITTI数据集
官网链接https://www.cvlibs.net/datasets/kitti/
KITTI 其实是 3D 目标检测中一个比较基于也是非常常用的一个数据集它是 2012 年发布的主要是针对无人驾驶任务包括 2D 检测、3D 检测、分割、跟踪等等那我们关注接下来几个事情首先第一个数据是怎么采集的呢 上图是 KITTI 数据集采集时所使用的汽车该汽车搭载了许多的传感器来采集信息包括相机、激光雷达、GPS 系统等等。KITTI 数据集针对 3D 检测任务提供了 14999 张图像和其对应的点云数据那其中我们一般会划分出 7481 张作为训练集7518 张作为测试集训练测试差不多都是 7500 张图片左右
那第二个问题KITTI 标注的哪些目标呢
相对而言KITTI 的标注类别是比较少的总共是只有车、行人和骑车的人 3 个目标那总共 80256 个标注对象平均一张图差不多有 5-6 个目标对象相对来说其实目标也不是很多 那接下来我们来看一下一个比较好的 KITTI 数据可视化是什么样的上面是 KITTI 官方的一个 demo 视频从视频中我们也能看到随着车辆的行驶路线中的图像数据上半部分和点云数据下半部分是同时被记录下来那这里还有个比较细节的地方我们能看到两侧是有两条虚线的这个表示什么呢它是表示前方 90° 的一个视角可能由于透视的原因我们这里看起来不太像 90°那这个 90° 视角表示什么呢它其实表示的是车载相机的拍摄范围
那这里其实是体现了点云数据和图像数据的有这么一个区别的如果我们只使用一台相机的话我们叫单视角它是具有视角上的一个限制的比如 KITTI 数据集它是一个单个采集的相机只能提供前视图的图像信息。那相比而言我们的点云有什么优势呢从图中可以看到除了我们正视的前方的视角外我们的点云是提供 360° 采集的我们可以看到不仅仅是车辆行进方向有点云数据包括其侧面那甚至还没有展现出来的后方也是有采集到的点云数据的
那 KITTI 数据集在标注的时候考虑到只有虚线范围内有图像数据所以 KITTI 数据对于目标的标注范围全部是集中在图像能够采集到的范围内也就是图像虚线所标注的部分我们从图中也能看到彩色的框框是数据集是已经标注的部分其余的部分的有点云数据是没有标注的那它这个其实也是一个很有意思的事情我们如果单独利用点云数据的话本身而言也是可以做 3D 检测的不过 KITTI 却只提供这个正面视角的标注是不是想要我们同时利用图像数据和点云数据去进行检测呢那大家也可以发挥脑洞探讨一下
那如果大家想下载这个数据集可以去上面我提供的官网链接里面去下载或者点击 here 下载博主准备好的数据集 我们进入到下一个部分我们进入到官网链接中点击 3D 检测板块当中看到上述界面里面哪些数据是需要下载的呢一个是我们常用的左视图数据我们还能看到下面有一个右视图的数据那这里区分左右视图它主要是为了提供给双目模型使用的如果我们只考虑 3D 目标检测任务的话我们只用下载左视图数据就好
另外我们还需要点云数据数据稍微偏大一些有 29G那你可能会好奇为什么点云数据前面还有一个 Velodyne 前缀呢那这个前缀其实是 KITTI 数据集采用的激光雷达是这个牌子的所以它直接就用品牌的名字取命名了
另外还需要什么呢还需要标注和转换矩阵标注显然是对于一个目标将其标注在 2D 图像或者 3D 点云数据中那转换矩阵又是什么呢我们在考虑转换矩阵之前先考虑下一个转换矩阵实现了什么样的功能下面有一个简单的示意图 那我们之前提到过在 KITTI 数据集中同时涉及了图像数据和点云数据那也就是说同时包含了 2D 和 3D 数据那我们怎么知道 2D 图像中的目标和 3D 点云的目标是一一对应的呢那这就引出了另外一个问题如何对两种不同模态的数据做一一对应关系所以我们这里就涉及到一个 2D 和 3D 平面和空间坐标系转换的问题我们如何把 2D 上的 ( x , y ) (x,y) (x,y) 转换到三维空间 ( x ′ , y ′ , z ′ ) (x,y,z) (x′,y′,z′)KITTI 数据集在做这个坐标转换的时候主要用到了下面这个公式 y P r e c t ( i ) R r e c t ( 0 ) T v e l o c a m x \mathbf{y}\mathbf{P}_{rect}^{(i)}\mathbf{R}_{rect}^{(0)}\mathbf{T}_{velo}^{cam}\mathbf{x} yPrect(i)Rrect(0)Tvelocamx 在上面的公式中 x \mathbf{x} x 表示一个点云坐标点云坐标通过 T \mathbf{T} T 矩阵可以将点云坐标先转换到对应的相机坐标系那为什么要做这个转换呢那我们从上图中可以看到一个点云采集设备和图像采集设备它们俩是分开的因此它们的坐标系在空间位置上是有差距的所以说我们要通过这个点云坐标系到图像坐标系的一个转换把原本在点云坐标系下的点 x \mathbf{x} x 先转换到以相机为原点的世界坐标系下
OK我们思考下一个问题它这个转换是一个三维量到二维量的转换还是一个三维量到三维量的转换呢那我们这里提到的三维量到三维量的意思就是说我们本身一个点云坐标是 ( x , y , z ) (x,y,z) (x,y,z)它是一个三维量那我们通过这个转换之后它是由 ( x , y , z ) (x,y,z) (x,y,z) 到 ( x ′ , y ′ ) (x,y) (x′,y′) 还是到 ( x ′ , y ′ , z ′ ) (x,y,z) (x′,y′,z′) 呢我们思考一下
本质而言它这个转换其实是一个三维量到三维量的转换我们的点云坐标 x \mathbf{x} x 通过 T \mathbf{T} T 矩阵的变换之后还是一个三维向量那只不过它这个三维向量的参考坐标系发生了变化从原本的点云坐标系转换到了图像坐标系那我们说清楚了矩阵 T \mathbf{T} T我们再来看 R \mathbf{R} R 是什么 R \mathbf{R} R 从官方文档中的解释叫畸变校正矩阵它主要是为了对图像的成像平面去进行一个校准通过这个矩阵之后原本的点云坐标 x \mathbf{x} x 就被转换到了已经校准后的相机坐标系下是对原本的相机它的一个坐标去进行一个校正通过 T \mathbf{T} T、 R \mathbf{R} R 之后呢原本的点云坐标会被转换到已经校正好的相机坐标系下那我们如何从这个相机坐标系到 2D 的图像坐标呢
那这其实是我们比较熟悉的领域了通过相机的内参矩阵也就是公式中的 P \mathbf{P} P 矩阵可以得到最终的图像坐标 y \mathbf{y} y 的表示 那这个 y \mathbf{y} y 在图像中可以通过 ( u , v ) (u,v) (u,v) 表示也可以通过 ( x , y ) (x,y) (x,y) 来表示
OK我们总结一下通过上面的公式我们实现了从点云坐标的点 x \mathbf{x} x 转换到 2D 图像中的点 y \mathbf{y} y那反过来我们如果对 y \mathbf{y} y 按照 P \mathbf{P} P、 R \mathbf{R} R、 T \mathbf{T} T 做逆变换的话那我们就可以轻松的将 2D 图像中的点 y \mathbf{y} y 换算到点云坐标系下的点 x \mathbf{x} x所以实现了从 2D 图像到 3D 点云之间的一个双向转换我们可以从点云到图像也可以从图像到点云
上面我们主要给大家讲解了一下在 KITTI 数据集中它对转换矩阵的一个标注下面我们再给大家对 KITTI 数据集中物体标注文件做一个详细说明 首先它的标注是按场景提供的如上图所示每一个文件名对应一个编号的场景比如 000001 这个场景我们可以在图像数据文件和点云数据文件中找到其对应的图像和点云数据它是一个场景编号。另外我们对于每一份标注文件而言比如图中的 000001.txt我们打开后看到它其中是标注了很多数据的每一行表示一个物体的标注信息那具体每一行标注信息代表的含义是什么呢我们拿一个实际场景的标注信息来说明如下图所示 Pedestrain 0.00 0 -0.20 712.40 143.00 810.73 307.92 1.89 0.48 1.20 1.84 1.47 8.41 0.01 我们对上面的标注信息拆开来看
Pedestrain类别标签表示当前标注物体的类别是行人0.00是否被截断指目标并未完全出现在图像中它是一个 [ 0 , 1 ] [0,1] [0,1] 之间的值表示当前我们标注的目标被截断的程度0 表示没有截断数值越高表示截断越严重它是一个小数值表示的是一个比例值0被遮挡程度取值是 0123 一系列的离散值和上面的截断值不同截断是一个连续的小数值而遮挡是一个离散值0 表示当前目标没有遮挡1 表示部分遮挡2 表示严重遮挡3 表示标注人员也不清楚是否遮挡。无论是遮挡值还是截断值它们依赖于标注人员的主观经验那由于标注人员主观差异所引发的标注错误也好或者标注不准确也好是当前 KITTI 数据集标注噪声的来源之一-0.20观测角度它是一个幅度值介于 [ − π , π ] [-\pi,\pi] [−π,π] 之间标注当前标注物体与相机之间呈现的一个夹角通俗的讲就是物体在相机哪个方向712.40 143.00 810.73 307.92物体 2D 检测框的左上角和右下角坐标1.89 0.48 1.20当前目标的 3D 尺寸物体的高度、宽度和长度单位是 m1.84 1.47 8.41物体 3D 框的中心点坐标加上上面的物体长宽高和角度信息这一系列的七维量其实就是我们 3D 检测中通常需要预测的结果0.01置信度得分表示这个目标在这个位置与这个类别存在的概率有多大通常测试时会使用到
我们总结下对于 KITTI 数据集我们讲解了哪些信息我们先介绍了 KITTI 数据集的规模标注类别标注总量然后介绍了如何下载 KITTI 数据集以及对 KITTI 数据集中涉及到的标注规范还有转换矩阵做了一个详细的讲解
那 KITTI 数据集是 3D 目标检测中非常基础也是非常常用的数据集也是基于单点云和多模态融合方法经常评测的数据集之一那接下来我们讲解另外一个在 BEV 感知算法里面非常通用已经几乎是每天工作必做的一个数据集叫做 nuScenes 数据集
3.2 nuScenes数据集
官网链接https://www.nuscenes.org/
那如果大家可以想下载这个数据集可以去上面我提供的官网链接里面去下载或者点击 here 下载博主准备好的数据集
为了突显 nuScenes 数据集和 KITTI 数据集的一个区别我们将两个数据集去进行一个对比如下表所示
KITTInuScense数据怎么采集通过车载相机激光雷达等传感器采集通过车载相机激光雷达等传感器采集数据规模有多大共14999张图像及其对应点云其中7481张作为训练集7518张作为测试集140万个相机图像、39万个激光雷达扫描结果、140万个毫米波雷达扫描结果标注了哪些目标目标类别包括车、行人和骑车的人共计80256个标注对象目标类别包括细分类别多达23类约140万个标注对象
首先从采集方式上看两个数据集都是采用车载模式进行采集的传感器也是包括车载相机还有雷达等等它们有什么区别呢虽然采集设备的种类是一样的但它们型号参数差距其实挺大的nuScenes 的激光雷达采集速率是 20Hz而 KITTI 数据集采集速率只有 2Hz10 倍的差距采集速率上存在明显的差异数据规模上差异也非常明显从相机图像的数量上来看nuScenes 提供了 140 万张相机图像那相比 KITTI 数据集的 15000 张图像差不多有 100 倍的差距
另外在标注种类上nuScenes 提供了细分的类别标注多达 23 类标注那什么叫细分类别标注呢比如说对于车辆这个类别它不仅标注了车辆这个大类还标注了车辆下面该车辆是属于轿车还是卡车还是救护车等等是有非常详细的类别标注的那我们把这个称之为细分的类别标注那从细分的类别标注角度讲nuScenes 提供了 23 类的标注而相比 KITTI 数据集只提供了三类的标注主要标注是车、人和骑车的人所以从类别角度上来看差距也非常大
那从标注对象的数量角度看nuScenes 提供了约 140 万个标注对象而 KITTI 数据集只提供了 8 万多个对象从标注对象数量角度来看也是数十倍的差异通过对比我们能很清晰的看到 nuScenes 的数据规模比 KITTI 数据集要大非常非常多从数据量然后从类别从标注量上差不多都是 10 倍以上的增量 那我们在讲解 KITTI 数据集的时候提到过 KITTI 数据集仅提供正视图的图像数据那也就是说我们只能看到车前面有什么而不能看到车侧面车后面有什么那 nuScenes 数据集总共包含 6 个相机如上图所示前后左右全都是覆盖住的图中绿色的部分就是 nuScenes 的六个相机它包含前面侧面和后面全部都是包含的。此外还包含一个激光雷达是放中间的还有车身的五个毫米波雷达
那所以从采集方式上来看我们能想象到它能提供很多数据首先是因为相机设备的存在而且是多视角相机设备的存在所以 nuScenes 数据集必然会提供一个多视角的图像数据那这与 KITTI 有着明显不同我们讲过很多次像 KITTI 只能提供正视图的数据而不能提供侧面后面的数据
另外它还能提供点云数据通过激光雷达可以采集到与 KITTI 数据集一样的点云数据它们的区别无非是采集的速率不一样另外一点我们在前面 KITTI 也强调过很多次了涉及到多传感器的时候要特别注意不同传感器之间的位置关系需要知道转换矩阵是什么那像这类内容一般就是放在标注文件里面
另外一个我们要知道无论图像上还是点云上需要检测的目标出现在哪里需要对于目标对象级别的一个标注我们需要了解 nuScenes 它对于 3D 标注框是怎么去标注的那我们带着这个初步的思考看下 nuScenes 数据集中包含了哪些内容下载解压后的数据集目录如下图所示 首先一个 nuScenes 数据集下面包含 4 个文件夹第一个是 maps这个数据其实在 3D 检测中应用是比较少的它主要的应用场景是后期决策所以这部分数据我们做了解即可
下一个数据是 samples官网名称是叫 keyframes它是一个关键帧为什么是关键帧呢这是因为 nuScenes 数据集采集量非常大很多连续帧之间的数据差异比较小这种数据差异特别小的源数据是不太适合做模型训练的所以 nuScenes 为我们挑好了它挑选了一些关键帧
那下一个文件夹叫 sweeps官方的描述是说这个文件夹除了关键帧的其他帧全部都给你放 sweeps 里面了那 sample 和 sweeps 两个文件夹还有什么区别呢那图中标注得也很明确了一个是已标注的数据一个是未标注的数据这意味着 samples 里面提供的是标注的图像而 sweeps 里面提供的是未标注的图像所以说 nuScenes 只提供了关键帧的标注那对于其余帧它给你打包放在 sweeps 里面了
那最后一个文件夹是 v1.0-这个文件夹其实是非常重要的它里面包含了非常多的标注数据每一个标注数据以一个 JSON 文件的形式存在那我们在图中可以看到有类别的 JSON 文件 category.json有日志的 JSON 文件 log.json 等等每个 JSON 文件里面包含了一类的数据那这么多类别的数据里面里面这么多 JSON 文件我们应该怎么去理解这些 JSON 文件呢具体各个 JSON 文件的描述可以看下图 那这一部分其实看着是比较复杂的我们从图中简单分析下
attribute.json描述了一个实例的属性calibrated_sensor.json车辆上已经校准的特定传感器激光雷达/雷达/摄像机的标定数据其实就是转换矩阵category.json对象类别的分类ego_pose.json车辆在特定时刻的一个姿态xy 平面的二维量使用较少instance.json一个物体的实例log.json数据提取车辆采集的日志信息map.json用二值分割掩膜所保存的地图数据3D 检测任务使用较少sample.json样例标注哪些帧是关键帧sample_annotation.json关键帧的 3D 标注框sample_data.json所有的传感器数据除关键帧外的所有数据scene.json场景数据sensor.json传感器的种类visibility.json实例的可见性
到此为止我们总结一下对于 nuScenes 数据集而言里面提供了一个是数据一个是标注标注文件如上图所示数据的话按照我们刚才讲的里面包含了一个关键帧的数据和所有的原始数据
通过我们上面的 KITTI 和 nuScenes 数据集的讲解大家应该对我们用到的一个基本的数据类型有了一个初步的了解了因为内容比较多所以评价指标这个模块就不在这里展开了大家可以把数据集这块先消化吸收一下
那对于 KITTI 数据集和 nuScenes 数据集的评价指标我们在后续具体论文中如果涉及到对应的数据集再做一个详细的讲解。
4. BEV感知方法分类
那之前的课程我们对 BEV 感知算法的基本概念、数据形式、数据集去做了一个详细的介绍接下来我们会在这个小节对 BEV 感知算法做一个总述会简单介绍一下不同的 BEV 感知方法区别和联系我们在前面的 BEV 感知算法的基本概念中提到已知的 BEV 感知算法可以按照输入数据的不同被划分为 BEV LiDAR、BEV Camera 还有 BEV Fusion 的方法那 BEV LiDAR 的方法是以点云作为输入的BEV Camera 是以纯视觉的模态作为输入的BEV Fusion 是多模态融合的框架它主要是融合图像模态和点云模态
我们这里会在这小节按照这三种分类方式选择一些比较具有代表性的算法去给大家一一做一个介绍
4.1 纯点云方案
首先是 BEV LiDAR 的方法这种方法的通用模式包括两种类型
Pre-BEV Feature Extraction先提取特征再生成 BEV 表征代表算法如 PV-RCNN 等Post-BEV Feature Extraction先转换到 BEV 视图再提取特征代表算法如 PointPillar 等 上面的框图给大家展示了两种方法的不同流程首先我们还是从输入输出看起对于 BEV LiDAR 这种方法而言输入是纯点云的也就是上图中的 LiDAR Input输出是以检测任务为例后面跟着一个检测头那 Pre-BEV 和 Post-BEV 的一个主要区别在哪呢其实是在中间的主体模块上
对于 Pre-BEV 而言特征提取是在 BEV 之前做的利用提取好的特征拍扁到 BEV 上生成对应的 BEV 特征图接下来可以在这些 BEV 特征图上做一些后续的检测那属于 Pre-BEV 这一类别的一些经典算法有 PV-RCNN、Voxel-RCNN、SA-SSD 等等
对于 Post-BEV 而言特征提取是在 BEV 之后做的从图中的流程也可以看到通过输入的点云数据先进行 BEV 的处理后再进行特征提取特征提取是在 BEV 模块之后做的所以叫做 Post-BEV我们可以利用卷积网络提取已经拍扁的 BEV 图得到最后的 BEV 特征那属于 Post-BEV 这一类别的经典算法有 PointPillar 等等
除了 BEV 位置不同外我们还能看出什么区别呢很明显两个特征提取器有着明显的不同那对于 Pre-BVE 的方法首先要处理的是点云特征所以说它一般都会先进入一个叫 3D 点云处理的网络而对于 Post-BEV 的方法由于它已经转换到了 BEV 视图所以可以通过 2D 网络去进行特征的提取那为什么我们一直说 PointPillar 的速度很快很大一部分原因是它的特征提取网络是处理 2D 任务的那它自然速度上会有成倍的一个优势
那我们这里以 PV-RCNN 的网络为例简单介绍下 Pre-BEV 的特征提取框架是怎么做的那本身 PV-RCNN 网络是属于基础的 3D 检测框架所以教程里面我们只是做一个简单的流程性质的介绍那接下来我们来看一下这个网络其网络结构图如下 看一个网络我们从输入输出看起PV-RCNN 的输入是 Raw Point Cloud 原始点云输出是最终的 3D 检测结果包含检测框和其对应的置信度所以从功能角度概括PV-RCNN 网络是以点云为输入输出 3D 检测结果的
明白了这个功能之后我们再来看下 PV-RCNN 是怎么做的它的流程是什么首先从原始点云出发我们可以从图中看到两个箭头分别指向两个不同的模块那这两个箭头其实表征了 PV-RCNN 的核心内容是 Point 和 Voxel 融合的特征提取网络它意味着 PV-RCNN 不仅使用了点特征还使用了体素特征
OK我们再来复习一下我们在介绍点云特征提取方法的时候讲过一般而言 3D 点云有两种特征提取方式一种是基于点特征的通常提取关键点和其附近点的特征另一种是基于体素或者说网格的通常是对场景进行一个立体性质的划分然后针对网格化的场景去提取特征那这两种方法是各有优劣的那 PV-RCNN 的作者把两种方法都用上于是从原始点云出发我们能看到 PV-RCNN 通过了两种处理通过体素化的点云利用 3D 稀疏卷积网络提取体素特征而另一个支路通过关键点采样提取点的特征随后将体素特征和点特征去就行一个融合得到最终的特征表达
那融合的方面会涉及到一些多尺度处理那它的多尺度其实是在不同的 block 上面做的因为本身 3D 稀疏卷积网络每一个 block 都提供了一些不同分辨率的特征比如上图中的蓝色、绿色、黄色还有橘色是原本体素的一个多尺度特征而灰色特征其实是来自于原始点的是 Keypoints 提供的原始点特征那最后的浅蓝色的是我们本次课程最关心的 BEV 特征当然 PV-RCNN 的 BEV 特征很简单它是将 3D 体素按照高度维度自上而下的拍扁得到 BEV 特征那当然这个拍扁后的特征能不能满足我们后续检测的需要那这就是现在很多 BEV 感知算法中需要讨论的后续问题了那也是我们课程后续章节需要详细讲解的一个地方那这里我们还是以 PV-RCNN 为例去给大家介绍 BEV LiDAR 中最具代表性的一个做法
4.2 纯视觉方案
那接下来我们看一看另外一种基于单模态输出的纯视觉的图像方案它们的通用框架如下
主要包括 2D 特征提取模块、视角转换模块和 3D Decoder 检测模块 和 BEV LiDAR 的算法一样我们在这里先对 BEV Camera 的算法做一个总结性的介绍首先我们还是从输入输出看起对于 BEV Camera 的方法而言输入是相机图像输出还是以检测任务为例连的是一个检测头那网络是怎么运行的呢首先输入是多相机图像通过 2D 特征提取网络然后再通过视角转换模块最后得到的特征进入 3D 检测头
那这里面存在两个细节首先它的特征提取器为什么叫 Shared 2D Feature Extractor我们要怎么理解这个 Shared Feature 呢另外一个是它为什么要做 View Transformation也就是视角转换呢
那我们先从第一个问题看起Shared 表示什么我们得联系输入看输入是多张图像那在特征提取的时候是不是一张图一个网络呢显然不是所以说我们这里的 Shared 它其实就意味着对于不同视角的图像采用的是相同的卷积网络它是一个特征共享的模块
我们再来看第二个问题我们为什么要使用视角转换呢我们聊到视角转换的时候我们得先明白视角转换实现了什么功能那在上面的框图中其实是已经做了标注的视角转换的功能实现的是从 2D 到 3D 或者从 3D 到 2D 的转换那为什么要做这个转换呢还是得联系输入输入其实是一个 2D 的多视角图像包括前视、后视、侧视等等但它这些视角是不包含俯视视角的所以说我们在纯视觉的方案中如果想做 BEV 感知首先我们需要利用这些多视角的 2D 图像先转换到俯视视角上转换的这个过程其实就是视角转换模块去做的一个核心工作
由于 BVE Camera 的方法是我们后续整体课程的一个重点所以我们这里再额外总结一下流程BEV Camera 方法以多视角图像作为输入提取图像特征接着通过特征转换模块得到 BEV 特征再送入检测网络。按照模块划分的话BEV Camera 方法中有 3D 特征提取、多视角转换以及检测三个模块那这三个模块哪个更重要呢其实是这个视角转换模块最重要因为无论是 2D 特征提取模块还是检测模块其实都是基于已有的架构。已有的算法去做的只有视角转换模块才是 BEV 感知算法的核心内容
那我们带着这个理解看下经典的基于 BEV Camera 方法的 BEVFormer 是怎么做的那像 BEVFormer 这个框架其实我们在各种各样的平台都听到过很多次了它是 BEV 感知算法当中比较基础也是比较通用的一个框架我们代入刚才的 BEV Camera 算法检测流程看一看这里的 BEVFormer 是不是符合我们刚才的一个讲解BEVFormer 的网络结构如下图所示 我们看一个网络还是从输入输出看起BEVFormer 的输入是 Multi-view Input输出是一个分割检测头模块BEVFormer 从功能上概括就是以多视角图像为输入输出 3D 检测结果那这个概括非常符合 BEV Camera 方法的一个主体结构那我们再来看看 BEVFormer 符不符合我们刚才说的模块化流程
BEV Camera 算法的主要模块是什么呢2D 特征提取模块视角转换模块和检测头模块我们看看 BEVFormer 算法是怎么做的通过 Multi-view Input 我们可以得到 Multi-Camera Feature通过什么网络呢通过图中的 Backbone 网络那这个 Backbone 网络其实就是一个 2D 特征提取器那检测头就是我们图中的分割检测头那可能会有人说好像没看见有视角转换模块呀那其实只是 BEVFormer 没有点名而已从多相机特征到 BEV 特征就是通过视角转换模块实现的也就是图中灰色区域的部分
那我们再把整体流程看一遍那 BEVFormer 中有没有 2D 网络呢有的就是图中的 Backbone 网络那它有没有视角转换网络呢有的就是图中灰色部分那它有没有检测头呢显然也是有的那这个模块化的流程是不是完美符合我们前面提到的 BVE Camera 的算法整体流程
OK我们再来看我们刚提到的三个模块哪个模块占比最大呢那显然是图中的灰色区域嘛也就是视角转换模块占比最大所以我们刚才也提到三个模块当中视角转换模块是 BEV 感知算法研究的一个重点那不同的 BEV 感知算法往往就是在视角转换上去进行了不同的创新研究那在 BEVFormer 中它引入的空间注意力也好时序注意力也好主要目的其实都是为了去通过视角转换功能实现更好的 BEV 特征从而有利于后续的检测我们这里的 BEVFormer 也只是给大家做一个很通俗的介绍后续课程中会针对 BEVFormer 中各个模块做更详细的讲解
OK我们以 BEVFormer 为例去给大家介绍了 BEV Camera 类别当中一个比较具有代表性的做法那接下来我们再来看看利用多模态融合的方法是怎么做的
4.3 多模态方案
我们前面对 BEV LiDAR 和 BEV Camera 的方法分别做了介绍那 BEV Fusion 顾名思义是对图像和点云的一个融合那既然是融合自然离不开图像处理和点云处理的基本流程所以我们还是把 BEV LiDAR 和 BEV Camera 的流程拿过来看看 BEV Fusion 是怎么做的 那其实我们只要明白了基于单模态图像或者点云的 BEV 感知算法之后去理解 BEV Fusion 的流程会变得非常简单那首先我们看一下融合是什么层面的一般而言融合是特征层面的是在我们得到 3D 特征或者 2D 特征之后对多模态特征的一个融合其实就是 3D 点云特征和 2D 图像特征如果设计合适的模块对这两个层面的特征进行一个融合其实就是 BEV Fusion 方法的主体思路了那所以如何融合特征才是这个问题的关键
接下来我们还是看一个经典案例 BEVFusion它是基于多模态 BEV 感知的一个方法我们代入刚才 BEV Fusion 算法的检测流程来看 BEVFusion 框架是不是符合我们的讲解BEVFusion 网络结构如下图所示 那看 BEVFusion 的框架首先看输入输出是什么输入是一个多视角图像 Multi-view Images 和点云输入 Point Clouds那也就是说 BEVFusion 是同时以图像和点云作为输入的那输出是最终的检测结果 Final Detection Results
那我们再看看流程上符合融合 BEV 感知的定义吗我们刚才归纳的是对 2D 图像特征和 3D 点云特征利用特定的融合模块进行处理可以得到最终的 BEV 特征那我们再回到 BEVFusion 框架其中的 2D 图像特征就是 Image-view Encoder 图像编码器3D 点云特征就是 3D Backbone 骨干网络所以说图中上半部分输出的 2D 图像特征和下半部分输出的 3D 点云特征会进行融合那后续一系列的处理其实只是为了对多模态特征进行融合得到最终的 BEV 特征我们这个流程的详细模块还是在后续课程中去做详细的讲解这里就不展开讲了
OK我们 1.4 小节的 BEV 感知方法的分类就讲到这里了我们总结一下我们主要介绍了三类的 BEV 感知方法那 BEV LiDAR 是以纯点云作为输入的BEV Camera 是以相机图像作为输入BEV Fusion 是以一个多模态融合作为输出的那也分别给大家举了一些比较经典的案例包括 PV-RCNN、BEVFormer、BEVFusion 这些耳熟能详的算法我们这里主要还是帮助大家去构建 BEV 感知算法的一个基本理解有助于我们后续课程的学习
那我们这节内容就到此为止我们接下来给大家分析一下 BEV 感知算法它到底有什么优劣
5. BEV感知算法的优劣
上一节内容我们对 BEV 感知算法进行了一个分类对典型的算法进行了一些概念性的讲解这节内容我们主要分析 BEV 感知算法的一个优劣讨论 BEV 算法优劣之前我们先看下 BEV 视觉和传统的前置相机它到底有什么框架上的区别 图5-1 通用3D检测结构 图5-2 BEV感知算法结构 我们一再强调对入门而言看一个框架先看输入输出那这里图 5-1 是我们常见的 3D 检测结构图 5-2 是基于 BEV 感知算法的一个结构那图 5-1 的输入输出是什么呢输入是图像和点云或者两个的融合输出是一个感知的结果我们再看图 5-2 所讲的 BEV 感知算法的结构应该是什么样的它的输入输出是什么呢那同样输入也是图像或者点云或者两个的融合输出还是一个 BEV 感知的结果我们课程是以检测任务为例的那 3D 场景还有很多任务包括 3D 分割车道线检测等等那这些任务的核心输入模块依旧是图像和点云它只不过会针对这样不同的任务去设计不同的一个感知头去做后续的处理
OK我们回到 3D 检测任务当中我们看一下两种框架的功能是一样的那它们两种方法的主要区别在哪儿呢我们还是从流程上看通用的 3D 检测结构可以以图像为输入以点云为输入或者融合输入以图像为输入通过的是图像特征提取网络以点云为输入通过的是点云提取网络通常点云提取框架一般是以体素的方法提取特征那就是稀疏卷积或者以点特征提取的方式得到一个 3D 特征如果是融合的框架两类特征它都是提取的会得到一个多模态的特征那这些特征要么是单一的可以得到 3D 检测结果从图 5-1 可以看到图像支路是可以单一得到 3D 结果的点云支路也是可以得到 3D 结果的或者说两种方法去做一个融合我们可以得到最终的一个感知结果
从上而下的流程是我们通用 3D 检测结构的一个完整流程图像输入图像特征提取我们可以得到结果也可以将图像特征的结果与点云特征的结果去做一个融合采用一些后处理或者融合的手段得到最终的输出所以我们能看到无论是图像输入还是点云输入通用的 3D 检测结构它都是可以直接得到 3D 检测结果的那另外还有一点就是我们所提到的特征无论是 2D 图像特征还是 3D 点云特征一般是不太会经过一些复杂处理的它是可以用来直接去做 3D 检测任务的那我们接下来再看看 BEV 感知算法是怎么做的
同样它也是一个从上往下的一个结构那对于图像支路而言通过图像特征提取对于点云支路而言通过点云特征提取提取图像特征是通过视角转换模块我们可以将 2D 图像转换到 3D 下与点云去做一个融合那这个融合一般是 BEV Features 级别的一个融合是 BEV 特征的一个融合后续可能会加上一些额外的时间或空间上的处理然后得到最后的一个检测结果
那所以我们能看到的是通用的 3D 检测结构和 BEV 感知算法的结构有着明显的区别是什么呢其实就是这个 BEV 特征的生成部分那这是一系列 BEV 感知算法的核心内容那为什么要做 BEV 视角下的感知呢这就又回到了我们在第 1 小节 BEV 感知算法概念中介绍过的内容我们再复习一遍
我们在讲概念的时候讲过我们在讨论什么是 BEV 感知算法之前是可以对 BEV 这个词做一个拆解的那什么是 BEV 呢那 BEV 空间其实是我们现在想要特别强调的一个空间它翻译过来叫 Bird’s-Eye-View 鸟瞰图那我们再通俗地表达一下其实就是俯视图是一种从上往下的一个拍摄视角很多算法当中会把它称之为上帝视角那上帝能给我们带来什么好处呢那这就是涉及到 BEV 视角空间能有一个什么样的优势了 首先 BEV 视角下尺度差异小以上图为例左边部分是正视图视角右边部分是俯视图视角在正视图视角下我们能发现目标呈现远小近大的特点离相机近的目标大离相机远的目标小。那 BEV 视角物体长宽都差不多所以尺度变化小网络对于特征一致的目标的表达能力是更好的所以 BEV 视角的尺度相对一致是具有明显的一个优势的。那第二点是 BEV 视角有一个比较小的遮挡那其实这是一个很直观的理解两辆车前后出现的时候后面的车会被前面的车挡住所以说这些其实是 BEV 感知算法一些显著的视觉上的优势
那对于自动驾驶而言呢BEV 感知算法有什么意义呢存在哪些不足呢我们先来简单总结下
BEV 感知算法对于学术研究的意义
有利于探讨 2D 到 3D 的转换过程有利于利用视觉图像识别远距离物体或者颜色引导的道路
BEV 感知算法对工业应用的意义
最显著的意义是降低成本。一套 LiDAR 设备的成本往往是视觉设备的 10 倍
性能差异
BEV感知算法在3D检测任务上与现有的点云方案还有一定差距
首先从学术角度来讲我们在讨论 BEV 感知算法流程的时候我们不止一次的提到过 BEV 感知算法的核心是多视角转换模块那也就是说我们如何利用多视角相机输入的 2D 图像生成对应的 BEV 视角结果这个视角转换的过程非常非常重要好的视角转换结果我们直接就可以带来后续检测任务性能上的一个提升那所以说 BEV 感知算法对学术研究比较有意义的是它可以帮助我们理解 2D 外观输入如何到 3D 几何输入这样一个视图转换的过程
目前非常流行的 BEV 感知方案还是以纯视觉为主也就是说我们采用图像输入为主点云为辅这样的方式那图像输入比点云输入的优势在于什么呢显著的优势其实在于它有一个 RGB 的信息有一个色彩的信息比如在做车道线检测的时候有黄色的有白色的那点云是没有办法分辨这些颜色信息的这就是纯视觉感知的一个绝对性的优势
讨论完学术研究的意义之外呢我们还想探讨一下目前的 BEV 感知算法对工业应用的一个意义我们知道在常见的工业化生产环境中成本是第一考量的要素那一套 LiDAR 设备成本是非常非常高的它几乎是一个多视角相机的十倍左右那十倍成本的下降这无疑对工业界诱惑是非常大的
那我们也不能忽略现在 BEV 感知算法会具有一个什么明显的问题那就是性能差距还是比较大的纯视觉的 BEV 感知算法性能是在 60 左右比纯点云的 3D 检测器的性能会低 10 个点那这是以当前的 NuScenes 数据集的结果来看的所以从性能角度来讲 BEV 算法还是有着非常大的一个提升空间也是后续我们无论是学术研究也好还是工业界的应用也好是可以持续挖掘的一个方向
最后我们总结一下我们本节内容主要是从功能对比、流程对比的角度比较 BEV 感知算法和通用的 3D 检测算法的一个区别其次分析 BEV 空间具有显著的一个视觉优势包括尺度变化小遮挡小另外纯视觉设备还具有一个明显的颜色优势和成本的优势无论是从学术研究角度还是工业研究角度来讲BEV 感知算法还是具有比较大的一个吸引力的那尽管说纯视觉方案在性能上与纯点云的方案或者说融合的方案相比还有一定的差距那我们也相信在后续的发展过程中纯视觉的 BEV 感知算法可以越做越好
我们刚刚提到既然工业界对这种成本较低的纯视觉 BEV 感知方案是非常感兴趣的那它们有哪些具体的应用呢那这里就进入到我们下一个小节 BEV 感知算法的应用介绍
6. BEV感知算法的应用介绍
从 1.1 节到 1.5 节我们对 BEV 感知算法的一个基本概念和基本流程做了一个详细解释那在 1.6 节当中主要给大家介绍一下既然 BEV 感知算法这么火那到底是谁在用呢 那 BEV 是我们一直在提的一个概念叫鸟瞰图用于描述我们感知到的现实世界它的一个视角类似于一个上帝视角那 BEV 感知算法是基于我们当前计算机视觉领域内的一种端到端的由神经网络将图像信息从图像空间转换到 BEV 空间的一种技术
BEV 感知算法很主要的一个应用就是像我们现在常见的这种自动驾驶场景我们知道在自动驾驶车上有很多的传感器比如摄像头、毫米波雷达、激光雷达等等在通用的自动驾驶系统里面传统的图像空间感知方法是将汽车上的雷达、摄像头等不同传感器采集来的数据分别进行分析运算然后再把各路分析结果融合到一个统一的空间坐标系用于规划车辆的行驶轨迹
那在这个过程中每个独立传感器收集到的数据和人眼类似受特定视角的一个局限那经过各自的分析运算之后后处理融合阶段会有很多的误差叠加很难精准的拼凑出我们道路的一个实况给车辆决策规划会带来很严重的挑战
那 BEV 感知本身的好处就是它是一个从高处统观全局的上帝视角车辆身上多个传感器采集到的数据会输入到一个统一模型去进行一个完整的推理那这样生成的一个鸟瞰图也称为俯视图可以有效避免误差叠加的问题那 BEV 方案同时还能支持时序融合那也就是我们不仅收集我们当前时刻的数据去分析我们后续的轨迹运行决策我们还支持把过去一个时间片段当中的数据去融合进模型去做一个环境感知方面的建模这样可以让系统感知很稳定很精准让车辆对道路的情况判断得很准确也能让我们自动驾驶变得更安全
那从这个角度上来讲我们的 BEV 感知算法是具有非常大的一个优势的所以目前一些国内企业比如百度、滴滴等等它们都组建了基于 BEV 感知的自动驾驶研发团队那它们的一些资料其实我们是没有办法公开拿过来说的那我们这里以三个我们可以公开获得方案的三家企业看看它们是怎么做 BEV 感知算法的如下图所示 那这三家企业分别是特斯拉、地平线机器人、毫末智行它们也是属于我们当前领域当中一些做得比较好的自动驾驶公司我们说的 BEV 感知技术其实本身而言是特斯拉带火的它作为业内纯视觉感知方案的鼻祖其实很早就开始做 BEV 感知这件事情了那我们先来看看特斯拉是怎么做的
与我们之前讲的通用 BEV 感知算法一个基础的设计流程都是一样的无论是学术网络还是工业模型我们看网络首先还是从输入输出看起首先从输入开始它是一个自下而上的一个结果那这里的输入是原始的图像数据通过一个图像校正模块送入到 2D 图像特征提取网络它的特征提取网络包含两个部分一个是 RegNet一个是 BiFPN。我们通过图像特征提取网络之后呢可以得到图像级别的所对应的 multi-scale 的图像特征
那这里大家可能有个疑问图像特征的提取为什么需要三条并行的结构呢这三条并行的结构有没有什么区别呢那我们知道特斯拉车身上其实有多个摄像头和毫米波雷达它在做感知任务的时候需要把不同传感器的感知数据收集并融合起来才能得到最后的感知结果不过特斯拉车上不同位置的摄像头参数是不一样的相机的内外参数是不同的那包括焦距、视野宽度、感受野等等都是不相同的所以导致同一个物体在不同相机里面是不一样的那所以说我们不能只从单一的相机当中去处理图像数据而需要对不同相机的图像数据进行分开处理那所以我们这里提到的三条并行的图像数据输入其实就是包含了不同位置摄像头拍摄到的不同图像。
那以前特斯拉在没有做 BEV 感知技术之前在每个相机上单独进行感知再将不同相机感知的结果进行融合那这种方式融合在哪做的呢那这种方式其实跳过了中间部分直接通过 2D 图像网络提取的特征得到最后的结果那这种方式的融合其实是非常困难的因为不同的相机感知结果进行融合需要大量的超参写起来非常复杂并且由于深度估计的误差最终的输出结果可能会相互冲突所以导致各特征结果并不好融合。
另外一个就是说图像空间的输出对于后续检测任务来说并不是很友好我们现在只能用到的检测结果而并不能使用我们在检测过程中产生的特征它没有办法去做一系列的比如说定位、轨迹预测等任务。另外还有个问题那就是我们单个相机有时候很难看到一个物体的全貌那比如说有些比较大面积的物体大卡车之类的离我们非常近很难用一个相机很清晰的把这个物体的全貌拍下来所以说我们仅依靠单个相机去做检测是不准确的
为了解决这些问题特斯拉提出的解决方案是添加了中间的模块将我们得到的特征从图像空间映射到 BEV 空间那相对而言它做法其实也是一样把多个视角的图像统一通过一个公共的特征提取器投影到统一的 BEV 空间当中那所以 PV Features ➡ Transformer ➡ BEV Features 这个模块其实就是我们之前提到过很多次View Transformation 的视角转换模块那有了 BEV 特征之后我们可以引入时序信息引入空间信息等等来增强 BEV 特征然后再得到输出结果这样的输出结果其实是基于 BEV 感知下的输出结果所以自然而然地也就避免了我们上面提到的融合困难、超参较多产生误检、容易被遮挡、无法看到物体全貌等等一系列问题。
接着我们从地平线和毫末的角度来看下它们是怎么做 BEV 感知的我们看到特斯拉的方案是纯视觉方案它的输入只有图像输入而地平线和毫末属于是融合类方案同时采用图像和点云作为输入那融合方案我们之前也提到过同样也是利用特征转换的方式可以将 3D 特征和 2D 特征统一映射到一个场景中像地平线和毫末的方案也是如此。
那大家可能会说在地平线的方案中似乎没有看到 BEV 视角转换它其实表达的比较隐晦那我们可以看到图像输出之后得到图像特征点云输出之后得到点云特征它在 Cross Stream Alignment ➡ Cross Modality Alignment 用一个箭头表示从图像特征到点云特征的转换过程也就是说从 2D 到 3D 的一个转换过程那这个其实也就是我们提到的一个视角转换的过程通过一个视角转换我们把 2D 场景下的一些特征转换到 3D 场景下再拍扁到 BEV 上就是我们的 BEV 感知结果了那它只不过没有明确的写出来我们可以合理的推测出来
最后毫末的方案也是将输入的 3D 点云通过一个主干网络得到 BEV 特征图像 1 和图像 2 分别通过图像 2D 网络得到 Multi-scale Features 多视角图像特征然后通过 Transformer 统一映射到 BEV 场景下得到 BEV 特征我们将点云的 BEV 特征和图像的 BEV 特征统一映射到 Tensor Space 空间中就得到了点云和图像融合的方式它这种思路是不是跟我们之前讲的 BEVFusion 的思路是类似的呢我们提过 BEVFusion 是怎么做的呢有一条支路提供点云特征一条支路提供图像特征通过一个额外的融合模块将点云特征和图像特征融合在一起那毫末也是这样做的
我们总结一下特斯拉也好地平线也好毫末也好无论是哪家企业的自动驾驶方案其实都跳脱不出 BEV 感知算法的一个基本流程那比如特斯拉是一个纯视觉方案那纯视觉方案当中比较重要的模块是什么呢视角转换模块怎么把不同视角下的相机图像统一映射到 BEV 空间当中是我们需要研究的一个问题。那对于地平线和毫末这种采用多模态输入的方案而言它们其实比较重要的也是视角转换但它们除了视角转换之外还需要设计额外的融合模块去融合点云特征和图像特征它们的这个思路其实可以归纳到我们的 BEVFusion 的思路当中
所以说我们提到过无论是哪家企业的自动驾驶方案都跳不出 BEV 感知的一个基本流程只要我们把基本思路理解清楚那各种工业方案其实也就是迎刃而解了。而这也是该课程开设的一个初衷我们想对常见的基本感知算法它的一个基本模块基本方案基本思路进行一个讲解来帮助大家能够构建一个完整的 BEV 感知算法的一个逻辑体系
那课程结束之后我们希望大家可以无论是学术的方案也好还是工业的方案也好我们看一下基本流程就可以自动的把它归纳到某一种 BEV 感知框架当中
OK我们这个章节就以比较主流的自动驾驶方案以它们的案例为主来给大家介绍一下 BEV 感知算法在工业应用中是怎么做的它的流程设计是什么样的以什么输入以什么输出
那我们下一节就主要给大家讲一些课程的一个框架配置和一些内容安排
7. 课程框架介绍与配置
进入我们第一章的最后一节内容前面的小节主要是给大家构建了 BEV 感知算法的基本概念和主流框架那大家也看到 BEV 感知算法是当前众多自动驾驶公司的研究热门所以我们开设了这门课程我们主要从 BEV 感知的基本模块基本算法实战应用等方面为大家系统的讲解 BEV 感知算法的基本架构希望帮助大家可以尽快入门也能尽早上手
那本次课程的整体框架如下图所示 本次课程是划分为五个章节的主要包括
第一章 BEV感知算法介绍 主要是基础概念、基础流程等 第二章 BEV感知算法基础模块讲解 主要是视角转换、Transformer等基础模块 第三章 LiDAR和Camera融合的BEV感知算法 主要算法和其实战应用 第四章 基于环视Camera的BEV感知算法 主要算法和其实战应用 第五章 BEV感知算法实战介绍 自己动手搭建一个感知网络
第一章是 BEV 感知算法的概念介绍是我们目前所讲的从 1.1 到 1.7 小节的内容那我们主要介绍了有关的基础概念来构建大家对于 BEV 感知算法它的一个基本流程的认识除此之外我们还介绍了一些通用数据集典型的应用等等
第二章我们主要是围绕当前 BEV 感知算法当中通用的基础模块去进行一个讲解我们在前几节中一再强调 BEV 感知算法的核心是视角转换模块因此我们这里对 基本的视角转换方法做了详细的说明和讲解包括从 2D 到 3D从 3D 到 2D 的视角转换我们均做了详细的讲解。除了视角转换模块Transformer 也是 BEV 感知算法当中不可或缺的一环因此课程也单独对 Transformer 进行一个分析并且特别针对 BEV 感知算法场景下的 Transformer 进行一个讲解那也就是说我们在 BEV 感知算法当中 Transformer 一般是怎么做的
那对基本流程、基本概念和基本模块有了了解之后我们可以进一步深入学习完整的 BEV 感知框架是怎么做的我们在第一章 1.4 小节 BEV 感知算法分类当中也提到当前的 BEV 感知算法可以划分为 BEV-LiDAR 纯点云方案BEV-Camera 纯视觉方案以及 BEV-Fusion 多模态融合方案那其中纯点云方案与通用的 3D 架构没有什么太大的区别所以我们仅在第一章选取了非常具有代表性的 PV-RCNN 去进行了一个讲解
本次课程还是主要围绕 BEV-Camera 和 BEV-Fusion 的方案展开去给大家详细介绍一下后面这两种方法是怎么做的也就是纯视觉方案和多模态融合的方案是怎么做的
那所以第三章我们主要介绍 BEV-Fusion 的方案选取了典型的框架 BEV-SAN 和 BEVFusion分别利用两个小节对这两个方法做详细的分析此外还有针对实验设置中的一些问题数据集的评价指标也将做进一步的解释说明。那在第三章的最后我们对代表性的方案 BEVFusion 去做一个实战的讲解我们对其中重要的代码模块、环境配置方案、训练过程、可视化结果去进行讲解
第四章是我们课程的一个重点我们主要讲解基于环视视觉方案的 BEV 感知算法纯视觉方案成本非常低它受到非常多的自动驾驶公司的青睐我们认为这也是今后自动驾驶发展的一个很重要的方向所以我们这里将视觉方案做一个重点我们会讲解 7 种主流的 BEV 感知方案包括基础方案和其进阶的版本比如 BEVFormer 和 BEVFormerv2还有 BEVDet 和 BEVDet4D 等等同样在最后我们对其中非常具有代表性的纯视觉方案 BEVFormer 有一个实战的介绍包括 BEVFormer 代码中的一些重要模块如何训练 BEVFormer它的数据处理流程是怎么样的它的训练过程又是怎么样的还有一些可视化结果去进行分析讲解
那经过前四章的学习我们认为大家已经对 BEV 感知算法中涉及到的基本流程有了一个清楚的认知所以我们在第五章设计了一个独立的大作业模块去让大家自己学着去设计一套完整的 BEV 感知算法方案来处理后续的 3D 检测任务
本次课程还是围绕 BEV 感知算法展开的内容非常丰富包括算法讲解、实战应用等等也欢迎大家可以一起来学习讨论
总结 那第一章的内容学习完之后我们能回答出三个问题就行What、Why and How 1. BEV感知是什么 BEV全称 Bird’s-Eye-View 鸟瞰图也叫俯视图我们称之为上帝视角 2. 为什么要做BEV感知 即 BEV 感知的优势尺度变化小遮挡小 3. BEV感知怎么做 即 BEV 感知的方案以 PV-RCNN 为代表的 BEV-LiDAR 纯点云方案以 BEVFormer 为代表的 BEV-Camera 纯视觉方案以及以 BEVFusion 为代表的 BEV-Fusion 多模态融合方案 我们在第一章的课程中一再强调 BEV 感知中的核心模块是视角转换模块因此下一章节我们会讲解 BEV 感知中的一些基础模块并着重讲解其中的视角转换模块敬请期待 下载链接
论文下载链接【提取码6463】数据集下载链接【提取码data】
参考
[1] Li et al., Delving into the Devils of Bird’s-eye-view Perception: A Review, Evaluation and Recipe.[2] Shi et al., PV-RCNN: Point-Voxel Feature Set Abstraction for 3D Object Detection[3] Li et al., BEVFormer: Learning Bird’s-Eye-View Representation from Multi -Camera Images via Spatiotemporal Transformers[4] Liang et al. Bevfusion: A simple and robust lidar-camera fusion framework