算法环境配置6_BEV系列之Fast-Bev

一、前言

paper:https://arxiv.org/pdf/2301.07870.pdf
Code:https://github.com/Sense-GVT/Fast-BEV

近年来,基于纯相机的鸟瞰图(BEV)感知技术已经可以不需要昂贵的激光雷达传感器,使其成为经济自动驾驶的可行解决方案。然而,大多数现有的BEV解决方案要么表现不佳,要么需要大量资源来执行车载推理。本文提出了一种简单而有效的框架,称为Fast-BEV,它能够在车载芯片上实时执行BEV感知。为了达到这个目标,我们首先通过实验发现BEV表示可以在不使用昂贵的视图变换或深度表示的情况下足够强大。我们将M^2BEV 作为Baseline,然后进一步引入
(1)用于图像和BEV空间的强大数据增强策略以避免过度拟合
(2)多帧特征融合机制以利用时间信息
(3)优化的部署友好视图变换以加速推理。
通过大量的实验分析,我们证明了Fast-BEV模型家族在边缘上的精度和效率都很高。 特别地,我们的M1模型(R18@256×704)可以在Tesla T4平台上以50FPS的速度运行,在nuScenes验证集上的NDS为47.0%。我们最大的模型(R101@900x1600)在nuScenes验证集上达到了53.5%的新的NDS状态

Fast-BEV架构概述与性能对比

Fast-BEV架构图

1.baseLine M2BEV

M2BEV是第一个使用统一BEV表示解决多相机多任务感知问题的工作之一。它在车载平台上的应用也更为广泛,因为它没有昂贵的视图变换器或深度表示。正如上图顶部所示,M^2BEV的输入是多相机RGB图像,输出是预测的3D边界框(包括速度)和地图分割结果。
M^2BEV有四个关键模块:
(1)2D图像编码器,从多相机图像中提取图像特征
(2)图像到BEV(2D→3D)视图变换模块,将2D图像特征映射到3D BEV空间
(3)3D BEV编码器,处理3D特征,
(4)任务特定的头部进行感知任务,例如3D检测。

2.Fast-BEV的整体架构

尽管M2BEV可以取得有竞争力的性能,但我们发现它的性能和效率可以进一步提高。正如上图底部所示,我们将三种技术整合到M^2BEV中,从而形成我们更强大,更快的Fast-BEV。

数据增强

我们经验性地观察到,在M2BEV的后期训练时期发生了严重的过拟合问题。这是因为原始M2BEV中没有使用数据增强。受到了BEVDet工作的启发,我们为Fast-BEV在图像空间和BEV空间中均加入了强大的3D增强,如随机翻转,旋转等。

Fast-BEV中使用的数据增强示意图

图像增强

3D 目标检测中的数据增强比 2D 检测更具挑战性,因为 3D 场景中的图像与 3D 相机坐标有直接关系。因此,如果我们在图像上应用数据增强,我们还需要更改相机内参矩阵。对于增强操作,我们基本上遵循常用操作,例如翻转,裁剪和旋转。上图左部展示了一些图像增强的示例。

BEV增强

与图像增强类似,可以在BEV空间上应用类似的操作,如翻转,缩放和旋转。请注意,应在BEV特征图和3D基础真值框上同时应用增强变换,以保持一致性。BEV增强变换可以通过相应地修改相机外参矩阵来控制。上图右部展示了随机旋转增强,这是一种BEV增强。

时间融合

在真实的自动驾驶场景中,输入是时间上连续的,并且在时间上具有巨大的互补信息。例如,当前帧中部分遮挡的行人可能在过去的几帧中完全可见。因此,我们通过引入时间特征融合模块,将M^2BEV从空间域扩展到时空域。具体来说,我们使用当前帧BEV特征和存储的历史帧特征作为输入,以端到端的方式训练Fast-BEV。

受 BEVDet4D 和 BEV- Former 的启发,我们还将历史帧引入当前帧进行时间特征融合。我们在这里使用三个历史关键帧采样当前帧,其中每个关键帧的间隔为0.5秒。我们采用了 BEVDet4D 中的多帧特征对齐方法。如上图所示,在获得四个对齐的BEV特征后,我们直接将它们连接起来并将它们馈送到3D编码器中。在训练阶段,历史帧特征是使用图像编码器在线提取的。在推理阶段,可以将历史帧特征离线保存并直接取出以达到加速效果。
与BEVDet4D和BEVFormer相比,BEVDet4D仅引入了一帧历史帧,我们认为这不足以利用历史信息。通过使用了三帧历史帧,Fast-BEV的性能得到了显著提升。BEVFormer通过使用两帧历史帧略好于BEVDet4D。然而,由于内存问题,在训练阶段,历史特征是没有梯度的,这会导致网络无法进行全面的学习。此外,BEVFormer使用RNN样式连续融合特征,这是一种低效的操作。相比之下,Fast-BEV中的所有帧都以端到端的方式进行训练,对于普通GPU来说更友好。

优化视图变换

我们发现从图像空间到体素空间的投影占用了大量的时间。我们从两个角度对投影进行优化:
(1)我们预先计算固定的投影索引并将其存储为静态查找表,这在推理期间非常高效。
(2)我们让所有相机投影到相同的体素上以避免昂贵的体素聚合。我们的方案与基于Lift-Splat-Shoot的改进视图变换方案不同,它不需要开发繁琐困难的DSP/GPU并行计算,它足够快仅使用CPU计算,非常适合部署。

M2BEV和Fast-BEV的体素聚合性能对比
视图变换是将2D图像空间的特征转换为3D BEV空间的关键组件,在整个pipeline中通常会花费大量时间。Lift-Splat-Shoot 是视图变换的经典方法。尽管目前已经有高级GPU设备(例如NVIDIA Tesla A100,V100)为其提出了一些加速技术,但这种优化并不能轻易地转移到其他设备,如边缘芯片。另一类视图变换是M^2BEV,其假设深度分布沿着射线均匀。该变换的优点是,一旦我们获得了相机的内外参数,就可以轻松地知道2D到3D投影。此外,由于这里没有使用可学习参数,我们可以轻松地计算2D特征图和BEV特征图之间点的相应矩阵。因此,我们遵循M2BEV的投影方法,并进一步从两个角度加速它:预先计算投影索引和密集体素特征生成。
投影索引是从2D图像空间到3D体素空间的映射索引。因为我们的方法不依赖于数据相关的深度预测或变换器,所以投影索引对于每个输入都是相同的。因此,我们可以预先计算固定的投影索引并存储它。在推理阶段,我们可以通过查询查询表获得投影索引,这在边缘设备上是非常“便宜”的操作。此外,如果我们从单帧扩展到多帧,我们也可以轻松预先计算内在和外在参数并将其预先对齐到当前帧。
我们发现,M^2BEV会为每个相机视图存储一个体素特征,然后将它们聚合起来生成最终的体素特征(可参考上图)。由于每个相机只有有限的视角,所以每个体素特征非常稀疏,例如,只有约17%的位置是非零的。我们发现这些体素特征的聚合非常昂贵,因为它们的大小非常大。我们提出生成一个密集的体素特征来避免昂贵的体素聚合。具体来说,我们让所有相机视图的图像特征投影到同一个体素特征上,最终得到一个密集的体素。

3.总结

本文提出了一种更强大,更快的全卷积BEV感知框架Fast-BEV,该框架能轻松部署在车载系统。与M^2BEV基线相比,Fast-BEV引入了强大的3D增强和时间特征信息,极大地提升了模型性能。 此外,我们还优化了视图转换,使其更适合部署。具体地,我们建议预先计算投影索引,并让所有相机投影到相同密度的体素。最后,我们希望Fast-BEV能够照亮车载BEV感知系统在工业界落地的前程。

二、环境搭建

构建python环境 python用3.8以上,3.7版本后续mmcv相关安装出了问题。大家不知道某个库的具体版本,就直接抄作业,跟我一致就行,后面就不再强调

1.创建conda环境

conda create -n fastbev python=3.8  #创建虚拟环境
conda activatconda activate fastbev              #激活虚拟环境

2.torch安装

cuda与torch版本查询 这里使用的torch-1.10.0
pip install torch==1.10.0+cu113 torchvision==0.11.0+cu113 torchaudio==0.10.0 -f https://download.pytorch.org/whl/torch_stable.html

3.安装相关库

由于fastbev出来很久了,而mmcv-full已经更新到2.x.x版本,改名为mvcc, fastbev还是用的 mmcv-full

#安装mmcv-full安装时终端会卡住,不是卡住,是下载时间比较长,耐心等待
pip install mmcv-full==1.4.0
# 安装mmdet
pip install mmdet==2.14.0
# 安装mmdet
pip install mmsegmentation==0.14.1

pip install -r requirement.txt

4.安装fastbev相关依赖

#下载fastbev工程
git clone https://github.com/Sense-GVT/Fast-BEV.git
#激活虚拟环境
conda activate fastbev
#进入Fast-BEV
cd Fast-BEV
# 配置所需依赖包
pip install -v -e .   或者 python setup.py develop

5.查看mmopenlab相关包版本号

python -c '
import mmcv;
import mmdet;
import mmdet3d;
import mmseg;
print(mmcv.__version__);
print(mmdet.__version__);
print(mmdet3d.__version__);
print(mmseg.__version__)'

显示版本号如下:依次为mmcv,mmdet,mmdet3d,mmseg对应的版本号

自此基本环境已经装好。

三、数据准备

1.下载数据集

这里只介绍nuscenes数据集,nuscenes下载地址
由于nuscenes数据太大,这里只测试nuscense提供mini版本, 下载map跟mini,如下图点击红色框中US就可下载

下载后得到2个压缩的文件

解压到当前目录 解压得到nuScenes-map-expansion-v1.3与v1.0-mini两个目录, 把nuScenes-map-expansion-v1.3中的三个文件复制到v1.0-mini/map目录下。最终得到新v1.0-mini目录,就得到训练所需的数据集。

2.数据集格式转换

进入Fast-BEV工程目标, 创建data目录,然后将上面的v1.0-mini文件夹复制到./Fast-BEV/data下, 并将v1.0-mini重命名为nuscenes, 目录结构如下图所示:
数据目录结构

因为使用的mini数据集, 转换时候加上参数–version 该数据末提供v1.0-test文件
如果使用全部的nuscenes数据可以不跟–version

1. 运行create_data.py

方式一

python tools/create_data.py nuscenes --root-path ./data/nuscenes --out-dir ./data/nuscenes --extra-tag nuscenes --workers 10 --version v1.0-mini

方式二
把众多参数配置到create_data.py文件里
然后执行python tools/create_data.py nuscenes
注意:配置完后必须执行python tools/create_data.py nuscenes,不能执行python tools/create_data.py,否则出现import error,因为这个dataset参数没有默认值,原来文件写的是
metavar=‘nuscenes’

方式三
需要修改dataset 参数为如下图常用的方式,
在这里插入图片描述

再执行

python tools/create_data.py

执行后,产生下面的文件目录如下
在这里插入图片描述

数据转换过程中打印的nuscenes 相关信息
在这里插入图片描述

2.运行nuscenes_seq_converter.py

由于使用的mini数据集无test文件,需要修改nuscenes_seq_converter.py文件,找到代码15行和20行,修改如下:
在这里插入图片描述

修改后,运行

python tools/data_converter/nuscenes_seq_converter.py

生成如下两个文件如图:
nuscenes_infos_train_4d_interval3_max60.pkl
nuscenes_infos_val_4d_interval3_max60.pkl

三、训练

1.下载预训练模型

需要翻墙上网 总体提供了r18,r34,r50三种残差网络模型。这里下载cascade_mask_rcnn_r18_fpn_coco-mstrain_3x_20e_nuim_bbox_mAP_0.5110_segm_mAP_0.4070.pth作为示例
下载后,新建一个pretrained_models目录放入其中。如下图所示
在这里插入图片描述

2.修改配置文件

不修改配置文件可能出现3.2节的报错问题, 修改后,可直接跳过3.2小节
configs/fastbev/exp/paper/fastbev_m0_r18_s256x704_v200x200x4_c192_d2_f4.py文件为例:(因为我们下载的预训练模型是r18)
在这里插入图片描述

• 将该配置文件中的将SyncBN改成BN,将AdamW2换成Adam;
• 该配置文件中146行代码去掉注释; 147-150代码加上注释, 如下所示
• 预训练模型地址修改

代码313行,load_from参数指向第1步下载的预训练模型地址,如果不知道相对路径,可以直接给绝对路径,我这里是相对路径

load_from = 'pretrained_models/cascade_mask_rcnn_r18_fpn_coco-mstrain_3x_20e_nuim_bbox_mAP_0.5110_segm_mAP_0.4070.pth'
#如果不用预训练模型训练改参数修改为
load_from = None

• 安装setuptools-58.0.4版本

pip install setuptools==58.0.4

3.训练

python tools/train.py  --work-dir work_dir --gpu-ids 0

注意:如果要把–gpu-ids配置到train.py中,需携程列表形式,因为代码中有关于该参数长度的检查

训练报错
AssertionError: Database version not found: ./data/nuscenes/v1.0-trainval

解决方式

在源码中mmdet3d/datasets/nuscenes_monocular_dataset_map_2.py 文件中的v1.0-trainval改为v1.0-mini

五、预测

1. 测试推理

(1)使用公开的预训练模型推理

python tools/test.py configs/fastbev/exp/paper/fastbev_m0_r18_s256x704_v200x200x4_c192_d2_f4.py pretrained_models/epoch_20.pth --out output/result.pkl

(2)使用自己训练得到的模型推理

python tools/test.py --config configs/fastbev/exp/paper/fastbev_m0_r18_s256x704_v200x200x4_c192_d2_f4.py 
--checkpoint work-dir/epoch_20.pth --out output/result.pkl
注意
--out 必须跟.pkl后缀。用来保存检测结果
--show 不要加,加上会报错,可能原作者未优化好

2.可视化

由于测试运行代码时,加入–show会报错,可以tools/misc/visualize_results.py把上一步的result.pkl生成视频流展示。

python tools/misc/visualize_results.py configs/fastbev/exp/paper/fastbev_m0_r18_s256x704_v200x200x4_c192_d2_f4.py --result output/result.pkl --show-dir show_dir

报错一:assert len(_list) == len(sort)

• 解决办法
Fast -BEV/mmdet3d/datasets/nuscenes monocular_dataset.py, 找到192行修改成193行样子:

报错二:write() got an unexpected keyword argument ‘fps’

• 解决办法:安装对应的包

pip install imageio[ffmpeg] pip install imageio[pyav]

报错三

• 解决办法:同报错二的解决办法
最后运行visualize_results.py ,生成video_pred.mp4与video_gt.mp4两个视频:
video_pred.mp4
video_gt.mp4

3.总结

总体来看使用nuscenes-mini数据集(4G)训练20epoch,推理出的效果不是很好,如果要提升效果可以借助以下几步:
• 使用nuscenes完整数据集(400G)
• 加大训练epoch=500
• 使用开源的预训练模恢复训练

  • 1
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

德卡先生的信箱

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值