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

目录

    • 前言
    • 零. 简述
    • 一、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 感知算法感兴趣的可以学习一下😄

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/505681.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

系统慢查询的思考

系统慢查询的思考 在一个系统中发现慢查询的功能或很卡的现象。你是怎么思考的?从哪几个方面去思考?会用什么工具? 一个系统使用了几年后都可能会出现这样的问题。原因可能有以下几点。 数据量的增加。系统中平时的使用中数据量是有一个累…

cdr弧形线条怎么画 cdr弧形线条怎么复制 CoreIDRAW官版 CoreIDRAW2024 平面设计软件

弧形线条可以增加设计的美感和独特性,使其看起来更加优雅和精致,并且弧形线条可以使设计更加流畅,减少直角和生硬的转折,使其看起来更加自然。那在cdr软件中怎么绘制弧形线条呢?下面由我带大家一起来了解cdr弧形线条怎…

c++编程(1)——重载函数、引用

欢迎来到博主的专栏——c编程 博主ID: 代码小豪 文章目录 前言重载函数函数重载的规则函数重载的原理引用引用变量的权限问题 前言 c语言对于编写大型项目有所缺陷,比如最常出现的标识符不能重复的问题(软件的代码量通常是数以万计的&#…

机器语言编写helloworld

kvmtool下载编译 git clone https://github.com/kvmtool/kvmtool.git 下载后进入到目录执行make即可。 补码 计算机怎么表示负数?以四位有符号数为例,使用高位作为符号位,最高位为0表示正数,为1表示负数,其余三位用…

基于SSM远程同步课堂系统

基于SSM远程同步课堂系统的设计与实现 摘要 在这样一个网络数据大爆炸的时代,人们获取知识、获取信息的通道非常的多元化,通过网络来实现数据信息的获取成为了现在非常常见的一种方式,而通过网络进行教学,在网络上进行远程的课堂…

【软考】数据流图的设计原则

目录 1. 数据守恒原则2. 守恒加工原则3. 外部实体与外部实体之间不存在数据流4. 外部实体与外部存储之间不存在数据流5. 数据存储与数据存储之间不存在数据流6. 父图与子图的平衡原则7. 数据流与加工有关,且必须经过加工8.例题8.1 例题1 1. 数据守恒原则 1.输入与输…

嵌入式linux学习之opencv交叉编译

1.下载opencv源码 OpenCV官方源码下载链接为https://opencv.org/releases/,选择3.4.16版本下载。放在ubuntu系统~/opencv文件夹中,解压缩,opencv文件夹中新建build和install文件夹用于存放编译文件和安装文件: 2. 安装编译工具…

ES的RestClient相关操作

ES的RestClient相关操作 Elasticsearch使用Java操作。 本文仅介绍CURD索引库和文档!!! Elasticsearch基础:https://blog.csdn.net/weixin_46533577/article/details/137207222 Elasticsearch Clients官网:https://ww…

MD5 计算 (下一代加密辅助类, Win32, C++)

CCNGHelper.h #pragma once #include <string> #include <tchar.h> #include <windows.h> #include <bcrypt.h>#ifdef _UNICODE using _tstring std::wstring; #else using _tstring std::string; #endif// 下一代加密辅助类 // 客户端: Windows Vi…

Vue2(十二):Vuex环境搭建、Vuex工作原理、Vuex开发者工具、几个配置项、多组件共享数据、Vuex模块化

一、Vuex 1.概念 专门在Vue中实现集中式状态&#xff08;数据&#xff09;管理的一个Vue插件&#xff08;use引入&#xff09;&#xff0c;对vue应用中多个组件的共享状态进行集中式的管理&#xff08;读&#xff0f;写&#xff09;&#xff0c;也是一种组件间通信的方式&…

阿里云优惠券领取方法大公开,省钱不再是难事

阿里云作为国内领先的云计算服务提供商&#xff0c;为广大用户提供了丰富的云产品和解决方案。为了吸引用户上云&#xff0c;阿里云经常推出各种优惠活动&#xff0c;其中最受用户欢迎的就是阿里云优惠券。那么&#xff0c;阿里云优惠券究竟是什么呢&#xff1f;我们又该如何领…

代码随想录第25天|216.组合总和III 17.电话号码的字母组合

216.组合总和III 216. 组合总和 III - 力扣&#xff08;LeetCode&#xff09; 代码随想录 (programmercarl.com) 和组合问题有啥区别&#xff1f;回溯算法如何剪枝&#xff1f;| LeetCode&#xff1a;216.组合总和III_哔哩哔哩_bilibili 找出所有相加之和为 n 的 k 个数的组…

基于自动编码器的预训练模型方法模型预训练方法RetroMAE和RetroMAE-2

文章目录 RetroMAERetroMAE详情编码解码增强解码 RetroMAE-2RetroMAE-2详情编码[CLS]解码OT解码和训练目标向量表征 总结参考资料 RetroMAE RetroMAE 出自论文《RetroMAE: Pre-Training Retrieval-oriented Language Models Via Masked Auto-Encoder》&#xff0c;是一种针对于…

「MySQL」索引事务

&#x1f387;个人主页&#xff1a;Ice_Sugar_7 &#x1f387;所属专栏&#xff1a;数据库 &#x1f387;欢迎点赞收藏加关注哦&#xff01; 索引&事务 &#x1f349;索引&#x1f34c;特点&#x1f34c;通过 SQL 操作索引&#x1f34c;底层数据结构 &#x1f349;事务&…

网络编程的学习1

网络编程 在网络通信协议下&#xff0c;不同计算机上运行的程序&#xff0c;进行数据传输。 三要素 ip&#xff1a;设备在网络中的地址&#xff0c;是唯一的标识。 ipv4:采取32位地址长度&#xff0c;分成4组。 ipv6&#xff1a;采用128位地址长度&#xff0c;分成8组。 …

安卓SharedPreferences使用

目录 一、简介二、使用2.1 getSharedPreferences2.2 增加数据2.3 读取数据2.4 删除数据2.5 修改数据2.6 清除数据2.7 提交数据 一、简介 SharedPreferences是Android平台上一个轻量级的存储类&#xff0c;主要是保存一些常用的配置比如窗口状态&#xff0c;一般在Activity、重…

12.Python文件读写

文件是数据的载体&#xff0c;程序可以从文件中读取数据&#xff0c;也可以将数据写 入文件中&#xff0c;本章重点介绍如何在Python中进行文件读写。 1 打开文件 我们在使用文件之前要先将文件打开&#xff0c;这通过open&#xff08;&#xff09;函数实现。 open&#xff0…

JJJ:linux系统中第一个进程

以linux4.19内核linux系统中第一个进程。 执行shell指令 ps -ef 结果如下&#xff1a; xxxxxx-virtual-machine:~$ ps -ef UID PID PPID C STIME TTY TIME CMD root 1 0 0 20:55 ? 00:00:02 /sbin/init splash root …

【Web应用技术基础】CSS(4)——背景样式

第1题&#xff1a;背景颜色 .html <!DOCTYPE html> <html><head><meta charset"utf-8"><title>Hello World</title><link rel"stylesheet" href"step1/CSS/style.css"> </head><body>&…

词令蚂蚁庄园今日答案正确答案怎么获取查看蚂蚁庄园今天问题的正确答案?

词令蚂蚁庄园今日答案正确答案怎么获取查看蚂蚁庄园今天问题的正确答案&#xff1f; 1、打开「词令」关键词口令直达工具&#xff1b; 2、输入词令关键词直达口令「今日答案999」&#xff1b; 3、搜索直达词令蚂蚁庄园今日问题的正确答案&#xff1b; *注&#xff1a;词令蚂蚁…