欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 财经 > 产业 > BEV感知-课程学习详细记录(自动驾驶之心课程)

BEV感知-课程学习详细记录(自动驾驶之心课程)

2025/6/21 13:58:24 来源:https://blog.csdn.net/FRANKBANG/article/details/141394489  浏览:    关键词:BEV感知-课程学习详细记录(自动驾驶之心课程)

0、课程大纲

        本学习笔记是学习BEV感知过程的详细记录,一整套课程,一气呵成,一口气刷完,总体来说收获还是很大。这个笔记主要是自己参考,当然,写的比较详细,大家也可参考,对各位初学者比较友好。        

        如果大家没有课程视频资料,可以找我获取,FrankWang1222,我的w_x_,资料整理不易,请大家珍惜,好好学习,祝大家学业有成。

课程章节目录

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

也可以看下面的思维导图

一、BEV感知算法介绍(第一章)

1、BEV感知算法基本概念

尺度变化小,网络对小目标的表达更好。

2、BEV感知算法数据形式

大力推行感知任务,主要使用图像,很多公司在用

处理图像的方法。

稀疏性,遮挡,或者没有障碍物,都会没有点云

无序性,好理解。

3D点云,包括深度信息,立体表示物体,不是纸片的表示。很立体,很显性的表达。

去发挥不同模态数据的融合,扬长避短。

体素是从场景出发,考虑一定空间内的聚合点。

基于点是从特征出发。考虑关键点。

3、开源数据集介绍

图像数据,这里区分左右视图,主要是给双目模型使用的,如果单目的话,只用左边的就行。

激光点云,

还需要标注和矩阵(坐标变换)。

对数据标注的结果,在training_label里面。

公式讲解:

x为点云坐标,先通过T矩阵,转换到相机坐标系;转换后仍然是三维坐标系。

R为畸变矫正矩阵。主要对图像的成像平面进行校准。

P,相机中的内参矩阵,通过P可以投影到2D空间。

编号,按照场景来标注的。每一行表示一个物体的标注。

数据格式说明:

我采用的例子。

Car 0.00 0 1.85 387.63 181.54 423.81 203.12 1.67 1.87 3.69 -16.53 2.39 58.49 1.57

Pedestrian 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

Car 表示物体类别

0.00 表示数据是否被截断。数据在0-1之间,0表示没有截断,1表示完全,数字越大表示截断的程度越大。这个是个小数的形式,是概率的形式。

这个代表是不是被遮挡。这里是离散值来表示的,如0,1,2,3。0代表完全没有遮挡,1表示部分遮挡,2表示比较严重的遮挡,3表示不清楚物体是啥。这个和上个参数,存在标注人员的主观差异。这也是标注噪声来源之一。

1.85    表示相机的观测角度,是个弧度值?

387.63 181.54 423.81 203.12 这四个值是作为一个整体呈现的。表示一个检测框,前两个值表示框的左上角坐标,后两个值表示右下角坐标。

1.67 1.87 3.69  这三个值也是整体标注,是一个整体,表示标注框的大小,hwl,高度,宽度,长度。毕竟我们做的是3D检测任务。

-16.53 2.39 58.49   xyz,3D框的位置。和上边三个是一个整体,可以完整表示物体。

1.57   这个表示置信度得分。通常测试时候会用到。

KITTI,3D目标检测常用的数据集,单模态和多模态也常用这个数据集。

nusences——在BEV感知中,必用的数据集。

多视角相机数据。kitti没有,是单视角。

转换矩阵,放在标注文件中。

关键帧,是差别比较大的,比较典型的帧。由于nusence采集频率高,连续帧之间差别不是特别大,所以不太利于训练。

nusence只提供了关键帧的数据标注,其他帧的放在sweep中了。

 打开sweeps文件夹,你会发现其结构和samples文件夹是完全一样的。那么samples文件夹和sweeps文件夹有什么区别呢?可以这样理解,samples文件夹中存储的信息是较为关键、重要的,而sweeps文件夹中的信息则相对次要。

V1.0这个文件比较重要,非常重要了,数据格式是josn格式。

第二个,表示转换矩阵。

sample_data包含了其他标出之外的所有数据。

nusence数据集提供的,一个是数据,一个是标注。

评价指标后面会有专题讲解。

4、BEV感知方法分类

pre-BEV,PV-RCNN, SSD?

post-BEV, 

point-pillar,速度很快,是因为他处理的是2D网络。

不仅使用了点特征,还使用了体素特征。

通过稀疏卷积网络,提取体素特征;通过关键点采样,提取点特征。

融合方面会涉及到多尺度处理,多尺度处理?后续调研学习。

蓝色模块,是我们最关注的,BEV特征。

PV-RCNN,从3D到2D,采用直接压扁的方法。类似投影。

上面的图片是PV-RCNN中的架构图。与下面第一张一样,下面是最终版论文中的图。

2D到3D的转换,是BEV-camera的核心模块,后续也会重点学习。

BEV算法的研究重点在2D到3D特征的转换,不同的BEV方法的主要区别就在特征转换这一块。

多模态方法

讲解的很浅,不深入。

5、BEV感知算法的优劣

看一个框架,先看输入和输出。检测是主要的任务,常见的任务。

BEV下的感知,与传统的感知,核心区别就是BEV视图的生成。

以纯视觉信息

点云没法分辨颜色信息?作者说的。

工业界,对纯视觉非常感兴趣,毕竟,成本低啊。哈哈。

6、BEV感知算法的应用介绍

单模态,相机,主要的任务是2D到3D的转换,视角转换是核心模块,transformer也是BEV中不可或缺的模块。

多模态,主要任务有相机的3D转换,和多模态融合模块的设计。

把流程设计弄清楚。

7、课程框架介绍与配置

纯视觉,以后的重点发展方向

搭建一个BEV感知的训练和测试环境。

附高清图:

8、小节

        第一章我们主要学习了 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感知(2)--转换模块_2d bev-CSDN博客

1、从2D到3D转换模块
(1)第一节前言

        图中是VGG16的网络结构,(2014年的ImageNet亚军结构VGGNet(VisualGeometry Group Network)则将卷积网络进行了改良,探索了网络深度与性能的关系,用更小的卷积核与更深的网络结构,取得了较好的效果,成为卷积结构发展史上较为重要的一个网络。VGGNet网络结构组成如上图所示,一共有6个不同的版本,最常用的是VGG16。从图中可以看出,VGGNet采用了五组卷积与三个全连接层,最后使用Softmax做分类。VGGNet有一个显著的特点:每次经过池化层(maxpool)后特征图的尺寸减小一倍,而通道数则增加一倍(最后一个池化层除外))

(1)、图像用像素表示的时候,从0-255,数值越大表示颜色越深?

(2)、网络不是越深越好,容易有梯度消失。

采样,聚合,一直循环这个思路,这个思路是很好的特征提取的思路,类似CNN中的卷积和池化。

note:不是所有的体素中都有点。

(2)第一节正文

相机的内参矩阵是由相机的硬件决定的,一般我们认为这是常量。

从2D到3D的转换模块,是离不开深度估计的。

LSS,是英伟达,2020发的经典的文章。

BEV的典型算法,BEVdet,caddv?

2D到BEV,是需要媒介的,媒介就是3D,这里要做深度估计的。

具体怎么做的概率分布?

连续的图像。

伪点云,优点,可以用现成的点云框架,直接进行后续任务。缺点,深度估计的不准的话,后续的一系列操作都是错的。

2、从3D到2D转换模块

从2D到3D,离散的点,

对于图像上的一些点,通过离散深度分布和连续深度分布,我们得到深度值,找到其在3D空间中的对应关系。

从3D到2D的基本思路:先构建一个空的BEV的特征图,然后找3D空间中的点,在这个特征图中的位置?   是不是就是逆向思维,我先假设每个BEV空间都会有对应的特征,然后再从2D图像中查询。

DETR3D

理解的不是特别明白,

从3D到2D,先在3D空间中假设点?

由于3D对2D中的点,可以做到 一 一 对应的映射,就是3D空间中的点,投影到2D空间中后,是唯一的。利用这个条件,可以做啥?思路是啥?

由3D初始化的框,预测出其在2D中的参考点,reference point。

{显式mapping中的DETR3D模型,利用环视图像先提取出2D特征,经过变换矩阵连接到3D位置,利用3D object query对2D图像的特征进行查询。}

FUTR3D

从3D空间取一定的空间,然后看投影在BEV空间中后,图像,雷达,等的特征有哪些?这个思路很好啊,不论什么传感器,扫描后的特征,总会在3D空间中有一定的对应关系。

这个方法里面,先有的是3D空间参考点,然后投影到不同的模态上,采样不同的特征,

这种有显性参考点的映射,称作为显性映射。也就是,我们要的就是这个参考点投影后对应的特征,就是这个点相关的特征,其他特征我们不要。

【 显式mapping中的FUTR3D模型,提出模态不可知的特征采样器(MAFS),可以从不同传感器(激光雷达、雷达、摄像机)中采样并通过不同的主干网络提取多模态特征,根据查询点聚合特征,为自动驾驶提供更高的数据灵活性。】

PETR3D

在DETR3D中如果参考点就不对的话,那么投影后的点也不对。

DETR3D是局部特征,可能对全局特征的学习不够充分。

PETR3D,考虑,能不能摆脱参考点的限制,以及有没有全局表达的方法?

PETR3D中,没有显式的参考点来提供初始的位置。这种方法称为隐式的方法。

PETR3D是DETR的改进版?在没有增加数据量的情况下,效果比DETR更好。

学习2D图像特征和3D空间特征之间的一种隐式对应关系,如下图。

transformer基础得扎实,不然这里学起来会吃力。

【隐式mapping和显式mapping的区别:

(1) 隐式mapping:隐式mapping是通过学习从3D空间到2D图像的映射函数来实现的。它不需要显式地定义或计算3D和2D之间的映射关系,而是通过神经网络等模型自动学习这种映射关系。隐式mapping的优点是可以适应不同的数据分布和复杂的映射关系,但缺点是可能需要更多的训练数据和计算资源。

(2)显式mapping:显式mapping是通过定义和计算3D和2D之间的映射关系来实现的。它通常基于几何或物理原理,例如相机投影模型,将3D点映射到2D图像上的像素位置。显式mapping的优点是可以精确地控制映射过程,但缺点是可能需要手动定义和计算复杂的映射关系,并且对于不同的数据分布和映射关系可能不够灵活。】

后面会详细讲解。

3、BEV感知中的transformer

空间变换神经网络。

空间注意力是从空间层面来讲的。

空间,平面,3D视场内的空间。

通道注意力是非常重要的,后面会有很多用的地方。

H*W*C,对于图像输入来说,长宽和通道数。RGBD。

比较重要的特征通道被加强了,不太重要的特征通道被削弱了,就是分配了不同的权重。

挑出一些比较强的通道特征去做重点关注。

H*W*C,空间注意力是从H*W维度来做的,通道注意力是从C的角度来做的,那么,他们可以联合吗?做串行的结构?答案是可以的。有人做了。

先通道注意力机制,再空间注意力机制,或者先空间,再通道,或者空间和通道并行进行。

这三种方式都可以,文中也给出了对比,差别不大。

自己可以尝试做一遍实验,进行消融实验。

接下来是本节的正题:

        好好理解课程中的这句话:transformer就是一个特征提取模块,通过transformer特征提取后,有些特征被加强了,有些特征被削弱了。

        qkv,q是查询向量,用于查询和其他向量之间的相似关系。查询特征q用于计算和其他特征之间的关系。以a1的q与a2的k进行计算,查询a1和a2的相似度。

计算出相似度权重后(权重表示不同特征之间的相似度),再和V进行相乘。

VIT中主要做的工作时把图像序列化,使用了patch以及位置编码的方法。

Swin Transformer就是VIT的改进版。

ViT对自动驾驶和安防来说,不是特别好用?因为目标物往往没有那么大。是不是对小目标检测很好用?估计行,哈哈。

反而,swin transformer,划分为不同的窗格,更有利于后续的任务。这个网络的核心在于如何建立Window、先建立Window然后再进行self-attention。

下面是transformer在2D领域的开山之作,DETR。

在目标检测里面讨论transformer,都离不开这篇工作。这是Facebook在2020提出来的。

ViT,仅仅实现目标分类的功能,而DETR,实现目标检测的功能。

相比于VIT,SwinTransformer采用了分层的transformer结构,对于输入图像分解为若干小块,然后对每个小块应用transformer模块,这种分层一方面使得SwinTransformer更好的处理高分辨率的大尺寸图像,另一方面对于目标检测,图像分割中,大部分图像需要检测的物体不会占据图像较大空间,而对于较远距离的行人检测就十分困难,使用Swintransformer对于较小物体的观测会处理的更加细致。

        SwinTransformer,在每一个windows中处理自注意力机制,另外允许跨窗口的不同分辨率的输出进行交互,达到更好的融合效果

transformer encoder 可以作为 2D backbone存在的。

经过这个encoder之后,可以得到序列特征,这是一个有着特征之间关系的序列特征。有着自注意力关系的一个序列特征。

self-attention,有利于提取图片中,不同位置,不同物体之间的一个关系(物体与物体之间的关系,物体与背景之间的关系)。这是transformer中包含self-attention可以做到的,但是resnet等其他网络做不到,其他2D的backbone做不到的。以后使用backbone,优先考虑transformer?!

transformer encoder可以很好的对这些关系进行建模,比如,水里面的鱼,池塘边的鸟。

这个是3D检测中常用的。

4、本章小结

        第二章我们主要围绕当前 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感知算法

3.1、融合背景介绍

相机的缺点,容易遮挡

激光的缺点,容易受雨雪雾,恶劣天气的影响,

多模态融合,使得自动驾驶的感知更加的安全。

3.2、融合思路介绍

决策级融合,NMS,方法。

3.3、融合性能优劣

榜单中的指标

感觉这一节没啥东西啊。(PPT中还分了三节)

3.4、BEV-SAN 融合算法

切片注意力机制。

别的论文中的思路,提出的方法,是怎么的不合理,以及有哪些改进的地方,然后,提出我们的方法。

不同物体在不同高度下的检测结果是不一样的。

融合全局和局部高度特征。

以前的方法,忽略高度信息,会降低检测的性能。

transformer是度量特征与特征之间相似度关系的方法。

点云数据的引入,是作为切分参考的。

3.5、BEV-fusion 融合算法

(a)(b)两种方案,都会有主次依赖关系的,都不太行。

(c)  BEV空间融合,两种模态之间没有主次依赖关系,哪个好我用哪个。并且,在最终融合之前也分别接了检测头,单独模态检测,融合后还做检测。

ADP,解决多尺度特征融合的问题,不同的特征通过ADP模块后,变得大小一样,可以进行级联或者相加等其他融合操作。要不然特征大小不一样,没法进行直接相加。

通过FPN做多尺度融合,不论是2D和3D,套路基本是一样。

拍扁的方式对于点云来说更加容易。

卷积,池化,都可以进行拍扁。

这里主要讲解点云特征是如何提取的,讲解3Dbackbone。

骨干网络,有,基于点的方式,基于体素的方式,可以回顾前边讲的。

BEVfusion文章中,作者也给出了好几种。比如:pointpillar,centerpoint,transfusion。

这里主要讲pointpillar,每个柱子里面的点,就是柱子的特征。

D*P*N解释

D,每个点的特征维度为D维,这是一个9维量,包括XYZ,XcYcZc,XpYpR,其中,XYZ表示点的坐标,XcYcZc表示点所在pillar的坐标,XpYp表示点离柱子中心的坐标,R表示反射量。

P,表示为3D场景中柱子的数量,一般为12000个柱子。

N,表示为柱子内点的个数,一般为100个。

第一步压缩后为P*C,这可以表示一个3D场景。

P,表示场景中的柱子的数量。

C,表示每个柱子的维度,即每个柱子为C维向量。

第二步变换后,H*W*C,类似图像的伪图,然后就可以使用图像的backbone,比如CNN。

自适应特征选择模块,使用基于通道注意力的方法,看哪个通道的特征更重要,是图像的,还是点云的特征更重要。

这篇文章的作者认为,其实,点云和图像是没有主次之分的,有的场景中图像更加重要,有的场景中点云更加重要。上面的特征选择是自适应的。

MIT的BEVfusion工作,更偏向工程一些,文章中有更多的讨论~

这是非常值得大家学习的一个范例,不论是图像和点云的特征提取,图像和点云的BEV视角的形成,还是他们之间的融合,文章中都有涉及。

3.6、BEVfusion实战

注意:

(1)在安装之前先检查本地环境,目前都有哪些环境或者库之类的,他们的版本是啥,需要更新升级吗;

(2)需要安装哪些包,先弄清他们的版本之间的关系,版本确定好后,再进行安装,否则可能不兼容。

1、环境配置/环境检查

电脑配置,1张3090。环境很重要,先检查一下环境。

以下是在VSCode中操作的,如果没安装VSCode的话,先安装VSCode。

cuda版本 12.2

【奇怪,为啥和我上边检查的cuda版本不一样啊。12.2还是11.5?

明白了,12.2是cuda驱动的版本,11.5是cuda toolkit的版本。

PS:cuda有两个意思,一个是运行时cuda(cuda toolkit),一个是驱动器cuda(cuda driver)。通常我们的服务器上已经安装过了cuda driver,一般不需要再重新安装,所以本文所安装的cuda指的是安装运行时cuda,即cuda toolkit。】

清晰了。

工作站上只有两个版本。

安装pytorch的时候,要把自己的cuda版本和pytorch版本相对应,不然会产生冲突。

下一步使用github的话,还得用梯子,使用外网。暂时先没用,直接导入已经下载的程序包。

GitHub - ADLab-AutoDrive/BEVFusion: Offical PyTorch implementation of "BEVFusion: A Simple and Robust LiDAR-Camera Fusion Framework"

他这里导入的时候,还需要密码?。

我应该懂了,他这里是用本地电脑,用vscode远程使用的服务器。通过SSH使用的服务器。

我们实验室的工作站没用ssh,暂时先todesk远程使用。

ssh使用/配置的教程,

VS Code 远程连接 SSH 服务器_vs code ssh-CSDN博客

基于 Ubuntu22.04 安装 SSH 服务_ubuntu ssh-CSDN博客

环境配置在文件的doc里面,官方提供的环境配置版本比较偏老。

先配环境,使用annaconda,环境配好之后,需要把环境激活。

用conda配置环境,先创建后激活。

使用conda创建于激活环境。

推荐按照给定的版本号去配置。不同版本号之间有对应关系,否则不兼容。

课程里面用的cuda版本为11.1,torch版本为1.8.0,应该用比这个高一些的,最起码不低于这个。

使用torch1.9的话,与后面的mmdetection不太匹配。所以,还是按照课程中的来配。

GCC版本,不低于5

=====================================================

我的:cuda11.5/11.3,配的torch版本是,应该需要1.11.0,我就装1.11.0了。cuda11.5在官网没找到支持的torch,只有11.3支持的torch,且torch的版本从1.8.1到1.21.1之间都可以。最后选择1.11.0安装吧。

作者:cuda11.1,torch为1.8.0

我刚才输错了,python后面没加等号=。一定要仔细啊。

更新了很多。

cuda, pytorch, python的版本。

参考:Python与PyTorch的版本对应_pytorch对应的python版本-CSDN博客

我的conda版本

工作站上有cudnn,cudnn的版本。

查看安装的cudnn版本。8.33.4版本号。

cuda与cudnn版本一一对应,

CUDA和cuDNN各版本下载及版本对应关系_cuda与cudnn版本对应-CSDN博客

【        CUDA和cnDNN是支持NVIDIA支持GPU的两个库,分别用于高性能计算和深度神经网络计算的支持。

        CUDA(Compute Unified Device Architecture),是NVIDIA支持GPU的通用并行计算架构,该架构使GPU能够解决复杂的计算问题。可以看作使能GPU的驱动程序或算法SDK。

        cuDNN是基于CUDA的深度学习GPU加速库,有了它可以在GPU上完成高效的深度学习计算。】

(1)安装pytorch

        首先确定cuda版本,CUDA有两种API,运行时API和驱动API,即所谓的Runtime API与Driver API

        nvidia-smi的结果是CUDA Driver API的型号,而nvcc -V得结果对应CUDA Runtime API,安装pytorch时要依据nvcc -V的版本。安装pytorch时torch,torchvision,torchaudio的版本都是对应的。

去pytorch官网找,然后复制命令在终端运行。注意是linux下,不是win下的。

Previous PyTorch Versions | PyTorch

conda install pytorch==1.11.0 torchvision==0.12.0 torchaudio==0.11.0 cudatoolkit=11.3 -c pytorch

安装完成,进行验证是否安装成功?

这说明安装成功了,得在python环境下进行。这里的python是3.9.7版本。

这难住我了啊

咋整呢?参考

一文讲清楚CUDA、CUDA toolkit、CUDNN、NVCC关系-CSDN博客

【GPT给的,还可以。

`nvcc -V` 和 `cudatoolkit` 版本之间的区别在于它们代表不同的内容和作用:

1. **`nvcc -V`**:
   - `nvcc` 是 NVIDIA CUDA 编译器驱动程序的命令行工具。
   - 当你在终端中运行 `nvcc -V` 时,它会返回 CUDA 编译器的版本信息,包括编译器的版本号和所支持的 CUDA 版本。这通常用于查看你正在使用的 CUDA 编译器的版本,以确保它与你的项目或应用程序的要求相符。

2. **`cudatoolkit`**:
   - `cudatoolkit` 是整个 CUDA 软件开发工具包的一个组成部分,除了编译器外,还包括 GPU 计算库、开发工具和文档等。
   - `cudatoolkit` 的版本指的是整个工具包的版本,通常会在安装 CUDA 时一起安装。这个版本号可能与 `nvcc` 版本号相同,也可能不同,因为在某些情况下,编译器和工具包的版本可能会更新不同步。

总结来说,`nvcc -V` 提供的是 CUDA 编译器的具体版本,而 `cudatoolkit` 版本则代表整个 CUDA 开发环境的版本。

VScode中使用conda建立的虚拟环境下的情况。

参考链接:手把手教你在linux上安装pytorch与cuda_linux系统下安装pytorch和cuda-CSDN博客

在PyTorch中使用CUDA, pytorch与cuda不同版本对应安装指南,查看CUDA版本,安装对应版本pytorch_pytorch cuda-CSDN博客

Ubuntu20.04安装pytorch1.10,cuda11.3,cudnn_pytorch 1.10.0 python 3.8(ubuntu20.04) cuda 11.3-CSDN博客

【Linux】Ubuntu20.04版本配置pytorch环境2023.09.05【教程】_ubuntu20.04安装pytorch-CSDN博客

https://download.pytorch.org/whl/torch_stable.html?login=from_csdn

在vscode终端环境下配置pytorch,MMcv,MMdetection,MMdetection3D

这把我难住了啊???

自己瞎选了一个报错后,出现了一堆可以选择的。我最终选择了bevfusion下的python环境。

我安装的。

课程中安装的:

(2)安装MMcv

本节参考链接:

Ubuntu18.04.1系统安装mmdetection(含torch、torchvision、mmcv-full)_cuda和torch与mmcv和mmcv-full安装-CSDN博客

Ubuntu20.04LTS 安装 mmdetection 全记录

课程中说,mmcv会安装1.4.0.  看看我后面会安装啥版本?得和pytorch对应上。

我这个环境下的pytorch安装的是1.11.0,不是1.8.0 。

安装完mmcv之后,需要装mmdetection相关的两个包。

看来,mmcv-full是得安装了

我安装的mmcv2.2.0.最后还是卸载了,装的mmcv-full。

半个多小时才装完。

卸载太快了,几秒完事。

https://download.openmmlab.com/mmcv/dist/cu113/torch1.11/index.html

我靠,把我给整懵了,这个mmcv-full这么多版本,装哪个?

mmcv-full 无痛安装方法-腾讯云开发者社区-腾讯云

很快就装完了,十来秒,正常吗?

(3)MMdetection(2D和3D)

安装mmdetection需要安装很多额外的东西。

因为mmdetection是基于pytorch的,所以安装需要依靠相关环境,这里建议使用anaconda创建一个新环境,便于环境管理,不会和其他环境起冲突和防止库版本不兼容等问题。

我去,这个自动安装的是3.3.0版本、不行吧?// 我又安装了一个2.27.0版本,压缩包安装的,快很多,并且自动的把原来的版本覆盖了。

conda list下查看的。

接下来安装mmdetection3D

课程中讲的需要编译,是啥意思,?编译的命令

这个安装方法咋回事?

mmdetection3d系列--(1)安装步骤(无坑版)_mmdetection3d安装-CSDN博客

上边这个博主装的版本和我的差不太多。

我也把这个open3D安装在一起了。

很慢,并且报错了,先放这里了。

openMMLab的mmcv和mmdet、mmdet3d、mmseg版本对应关系_mmdet3d read the docs-CSDN博客

版本对应的帖子,还不错。

这下子可装了不少

mmcv的版本也降低了,pip list的结果。

以上mmcv,mmdet2D和3D都装完后,需要对构建的这个bevfusion完整的路径进行编译。

(4)编译及报错解决

命令:"python setup.py develop"

课程中

报错了,图像包版本太高

我不知道自己的会报啥错。

降低版本sci-kit image版本。然后重新编译。

降低pandas版本,重新编译。

看我的是不是和上边编译的效果一样?

编译过程中的报错。  (这个错误是通过重新安装pytorch来解决的。)

cc1plus: warning: command line option ‘-Wstrict-prototypes’ is valid for C/ObjC but not for C++
mmdet3d/ops/ball_query/src/ball_query.cpp:4:10: fatal error: THC/THC.h: 没有那个文件或目录4 | #include <THC/THC.h>|          ^~~~~~~~~~~
compilation terminated.
error: command '/usr/bin/gcc' failed with exit code 1

查了好几个帖子,基本都在说是pytorch版本的问题,所以,还是重新安装一下pytorch。

(1)重装pytorch

卸载pytorch

现有

安装新的会自动卸载老的,不用单独卸载原来的版本。

重新安装后,再进行编译

卡住了。然后报错了。

我去,醉了,实在是整不动了,查不到方案了,啊啊。

https://github.com/open-mmlab/mmdetection/issues/9580

=================解决方案===============

降低nuscenes-devkit的版本。

解决过程中的参考链接

[Debug] Pytorch 版本问题 THC/THC.h: No such file or directory_dht.h: no such file or directory-CSDN博客

https://github.com/open-mmlab/mmdetection3d/issues/1332

Question about THC\THC.h - #4 by ZHM - PyTorch Forums

环境编译好之后,可以进行下一步了。

(5)GCC安装...

【TOC

一、gcc 和 g++介绍

GCC(GNU Compiler Collection)是由GNU项目开发的一套广泛使用的开源编译器集合。它支持多种编程语言,包括C、C++、Objective-C、Fortran、Ada和其他语言。GCC是一个强大而灵活的编译器,被广泛用于开发各种应用程序、库和操作系统。

G++是GCC编译器中用于编译C++程序的前端工具。它支持C++11、C++14、C...

】所以,我这里只安装GCC,不用安装G++?。

虽然他们用的事TensorFlow,但是也有参考意义。

注意:安装的gcc版本不能过高。教程中提示的是5+

我的安装7版本吗?就装7.3.1了。

这个不行啊?

哎,这不有吗,瞎折腾了半天,哈哈。

所以,在安装之前,先检查是否有这个环境,除非确定没有,比如新机器啥的。

如何在 Ubuntu 20.04 上安装 GCC(build-essential)_20.04 build-essential离线包-CSDN博客

================================================================

(6)数据准备

环境配好以后,接下来是数据准备。

从官网下载,然后放到bevfusion环境文件夹下,解压,转换成bevfusion需要的格式,以便于bevfusion可以处理。,

按照以上的文件结构,配置好,然后用给的代码转换数据格式。

转换代码。

pkl文件格式和json文件格式。

讲解完数据以后,开始训练。

课程中讲的说这个模型训练比较复杂,是分开模块训练的。

camera stream这一块,backbone不用单独训练,github上有作者训练好的权重,可以直接下载下来用。

所以,课程中也在讲,图像流这一块是怎么处理的。

2、环境配置

3、环境配置

遗留问题:

1、Ubuntu下翻墙问题

2、VSCode的SSH远程问题

3、VSCode常用插件配置

4、MMDetection3D 使用,详细学习?

5、隐私屏幕问题?没找到咋解决。

6

我们工作站的环境配置记录

1、安装了搜狗输入法,但是感觉还有点问题,没那么好用?如何切换拼音,英文模式,快捷键?

2、安装了pytorch,原来竟然没有啊。

3、

4

5

6

3.7、本章小结

        第三章我们主要介绍了 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感知算法

4.1-4.3 、环视BEV感知算法介绍

在鸟瞰图中使用3D,BEV中的运动补偿,相比透视图要容易得多。

学习特征尺度一致性,会好很多。

难点:如何把环视的转到BEV。

former中关注的不是怎么拿特征,而是关注的如何利用时序信息,空间信息。

这个没有太多的创新,更多关注的是工程的应用效果。

所以,有时候,发文章,不一定是有很好,很新颖的想法,如果能有很好的效果,那也可以。

没有太多的明确的提示,但是确实可以学出来,这是隐式映射,类似于非监督学习?

2D到3D的获取方法:离散深度分布,连续深度预测

围绕如何预测更准确的深度展开的。

点云拥有天然的3D信息优势,点云BEV比图像BEV要好的多,那么,图像BEV,能不能从点云BEV学习出更好的BEV表达呢?图像的预测结果向点云预测结果学习。

4.4、算法讲解DETR3D

从2D到3D出发。以前的两个方案。

但是,DETR不是,这个是在3D空间进行查询,用query。

FPN主要是处理多尺度特征。

纯视觉框架。VIT, swintransformer,resnet,vgg16,FPN,

图像处理网络,都是通用的网络,没啥新的东西。

Object Query 是预先设定,DETR3D中,用的有300/600/900个。一般是256维度的embedding的向量。

如何理解这个query呢,query提供了一种找目标的方式,

query是随机初始化的一系列查询向量,没有先验信息。

query通过transformer预测,生成一系列的reference points(参考点,3D参考点,这些点其实是3Dbox中心点的坐标),DETR3D中,以3Dbox中的参考点,投影到2D图像中,采样2D图像。然后,得到采样的特征,再拿着这个采样的特征和输入的object query相加,再拿相加的结果去2D图像中查询,依次迭代。query是多次更新,多次预测的,我大概理解了。

整个网络包括两个模块,一个是encoder,一个是解码模块,基于query的box预测。

900个预测结果,如何与GT做损失函数的预算呢,DETR2D  和 3D都是用的二分读匹配损失,不过是由二维扩展到三维。

GT的集合的量,远远小于预测量的集合。那么,怎么办呢,把原有的GT集合补齐,补到和预测的数量一样,用空集进行补,相当于补充背景。

然后用匈牙利算法,对两个集合一 一进行对应的匹配,,,使得匹配的损失最小。

通用的detector结果,保证一个GT只对应一个结果。采用NMS,非极大抑制算法,抑制不是极大值的框,只保留一个极大值。保留置信度最高的框。

二分度匹配的好处,两个集合元素中的一 一对应关系。用了二分度匹配,就不存在一个GT与多个预测对应的关系。一个GT只和一个预测对应,所以,不需要额外的预处理方法使一个GT处理多个预测。(一 一对应,一个GT只能唯一对应一个预测结果。这样做的好处? 

DETR3D,12个eopch,8*3090,bacth=1,

一个验证集,一个测试集,作为纯视觉任务来说,DETR3D还是可以的。

DETR3D,是多视角融合特征进行预测,比单视角要好得多。

table6,我们看到,query数量600-1500数量基本上一样,最终的结果,不仅仅是和query有关,而且和decoder,特征提取的如何,检测头咋样,损失函数咋样,优化设计怎么样,都有关系。

table7,可以多试试不同的主干网络。

table5,随着迭代次数的增加,重复框和误检数量在减少。

主讲人说,DETR3D,对于尺寸的建模不是特别好,

仅仅依靠一小部分区域,很难预测一个比较大的物体。

4.5、BEVFormer 算法讲解

transformer可以理解为类似卷积这样的一个模块。

这个注意力是放在了通道上,不同通道拥有不同权重的注意力。

将输入的图像变成特征,就是backbone网络在做的事情。

考虑不同帧中,车的偏移量不一样,所以,不能给一个固定的量,或者差别,作为上一时刻与这一时刻之间的差别。

可形变注意力网络,利用可偏移的量,对X这个位置做更好的预测。

哪个点的特征,对当前点的特征,是有增益的。利用预测的点,对当前的点做加权。这样应该是一个逻辑更自洽的特征提取。

损失函数是和后面的任务相关的。

比如,3D检测任务,那就是边界框分类和回归的任务。

根据任务,推测,作者可能会做哪些实验?

实验:

1、backbone网络,不同的骨干网络对整个模型的影响~

2、temporal self attention,可以去掉这个模块,看前后区别。

3、不论是时间注意力模块,还是空间注意力模块,都离不开一个叫可形变注意力的模块。那么,这个deformerbale attention是不是对整个网络很重要呢?

实验1

实验2

local的方式,就是文章中所提到的,deformerable的方式。point是固定方式点的,但是local不是,是经过网络预测出来的点。

如果把这个支路去掉,那么图像网络backbone中的精度来自于predicttion,就是在最后输出,通过损失函数,慢慢进行回传梯度,然后更新backbone的参数。

把远端的监督变成近端的监督,把原来这种很不明显,不直接的监督方式,变成明显,直接的监督方式。

多视角图形成以后,直接生成预测结果,这样可以更好的更新backbone的参数。下图蓝色框中,预测的结果不会作为最终的结果,只会作为最后网络更新的参考。

这个也属于两阶段检测器,后续有需要的话,仔细学。

4.6、BEVDet算法讲解

多尺度特征融合,降低图像大小,增加通道数量。

backbone,我们这里用的resnet,swintransformer,

多尺度特征网络,用的FPN 

这里的backbone和多尺度特征网络,都可以很容易得换成其他网络。

通过尺度缩放,会增加后处理模块的性能。

4.7、BEVDet4D 算法讲解

空间位置的对齐,时间上对齐。

时序信息对3D检测非常重要,时序是非常有用的东西。

bevformer引入了历史bev。

bevdet4D引入了时序信息

本文的主要内容在对其部分,其他部分没有新东西。

训练环境,8张3090.batch是8,总的batch为64.

轻量化版本的模型,比较能打。

文章对于工程化锻炼比较好?可以训练一下?消融实验做的挺多。

4.8、BEVPETR 算法讲解

核心在位置编码的设计上。

4.9、BEVDepth 算法讲解

旷视研究院的工作。

4.10、BEVDistill 算法讲解

常规模块的组合,都可以换的,看哪个模块在哪个数据集上效果好。

本文主要提供的是一种思路,feature层面的对齐,和目标层面的对齐。

4.11、BEVFormer 算法实战

4.12、本章小结


        第四章是本次课程的重点,我们主要学习了基于环视视觉方案的 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 感知算法感兴趣的可以学习一下😄

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

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词