BEVPoolv2 A Cutting-edge Implementation of BEVDet Toward Deployment 论文学习

Github Repo: https://github.com/HuangJunJie2017/BEVDet/tree/dev2.0
Arxiv Paper: https://arxiv.org/abs/2211.17111

1. 解决了什么问题?

多相机 3D 目标检测是自动驾驶领域的基本任务,受到学术界和工业界的大量关注。Lift-Splat-Shoot view transformation 模块在部署时最大的问题是推理速度慢和显存占用多,虽然之前 MIT 的 BEVFusion,旷视的 BEVDepth 和 BEVStereo 通过 GPU 并行,加速了特征合并的过程,但是真正上车时还是不尽如人意,归根结底是Lift 时需要计算、存储和预处理多个超大的视锥特征,这个大问题之前的实现一直都没有做针对性的优化。为了彻底解决这个问题,在BEVDet dev2.0 中作者搞了个 BEVPoolv2。BEVDet dev2.0 着重于工程部署,很好地平衡了准确率和速度。它继承了 BEVDet 的优势,从工程优化的角度做了改进。

2. 提出了什么方法?

BEVPoolv2 对 BEVDet 的视角变换过程做了工程优化,计算和存储都得到了大幅度的释放。它省略了视锥特征的计算和预处理。对于一张输入为 640 × 1600 640\times 1600 640×1600 的图像,处理速度可以达到 0.82 m s 0.82ms 0.82ms,要比之前最快的实现快了 15.1 15.1 15.1倍。和其它实现相比较,它所需要的缓存也更小,它不再需要存储视锥特征。这使得 BEVDet 在其它平台上部署更加容易。作者在 dev 2.0 分支提供了 TensorRT 的部署。此外,作者也整合了 2022 年提出的一些有效的方法,最终 BEVDet4D-R50-Depth-CBGS 在 nuScenes 验证集上取得了 52.3 52.3 52.3 NDS,PyTorch 的推理速度是 16.4 16.4 16.4 FPS。

2.1 BEVPoolv2

在这里插入图片描述

LSS 的 view transformer 有一个问题就是它必须计算、存储,并要预先处理一个非常庞大的视锥特征,其形状是 ( N , D , H , W , C ) (N,D,H,W,C) (N,D,H,W,C) N , D , H , W , C N,D,H,W,C N,D,H,W,C 分别代表了 views 的个数、深度的类别、特征的高度、宽度和通道数。如上图所示,它使用形状为 ( N , D , H , W ) (N,D,H,W) (N,D,H,W)的深度得分和形状为 ( N , H , W , C ) (N,H,W,C) (N,H,W,C)的特征计算得到视锥特征。然后,根据体素索引来单独预处理该视锥特征,体素索引表示视锥点属于哪一个体素(根据相机的内外参计算得到)。预处理会过滤掉所有体素以外的视锥点,并根据体素索引对视锥点做排序。然后,同一个体素内的视锥点会通过累积求和(cumulative sum)被聚合起来。BEVFusion 里的 BEVPool 没有用 cumulative sum,而用了多线程来加速这项计算。但它仍要计算、存储和预处理视锥特征,仍然消耗计算量和存储资源。使用 VoxelPool 的 BEVDepth 和 BEVStereo 也有这样的问题。当输入分辨率变大时,计算效率会显著地退化,内存消耗变得非常高。比如,对于深度维度是 118 118 118、输入分辨率是 640 × 1760 640\times 1760 640×1760的输入,以前最快的实现的处理速度是 81 81 81 FPS,缓存占用是 2964 2964 2964 MB,无法部署在边缘设备上。

本文提出了 BEVPoolv2 通过工程优化摆脱了这些问题。如下图所示,它的思想很简单。用视锥特征的索引作为视锥特征点影子,和根据相机内外参得到的体素索引一起离线预处理,推理时根据这个视锥特征的索引去获取计算该视锥特征的图像特征和深度得分。这样避免了计算存储和在线预处理视锥特征。这样,我们避免了直接去计算、存储和预处理视锥特征。因此就节约了内存和计算资源,加快了推理速度。体素索引和视锥索引都可以提前计算好,离线地预处理。推理时,它们只是固定的参数而已。
在这里插入图片描述
利用脚本tools/analysis_tools/benchmark_view_transformer.py分析得到的推理速度和显存占用如下图所示。下图给出了 LSS view transformation 不同实现的速度比较,现有最快的实现是旷视的BEVStereo,低分辨率还能勉强能用,高分辨率和 D = 118 D=118 D=118时,推理速度就掉到 100 100 100 FPS以下了。当深度类别设定为 D = 59 D=59 D=59时,当输入分辨率较小( 256 × 704 256\times 704 256×704)时,BEVPoolv2 的推理速度加速到了 4863 4863 4863 FPS,它要比之前最快的实现快了 3.1 3.1 3.1倍。当输入分辨率是 640 × 1760 640\times 1760 640×1760时,速度达到 1509 1509 1509 FPS,它要比之前最快的实现快了 8.2 8.2 8.2倍。BEVPoolv2 使得 view transform 不再是一个计算瓶颈。节省的内存也很可观。

目前这个推理速度放在所有的 view tranformation 中不是一骑绝尘,也应该是第一梯队了,至少绝对不会是拖后腿那个模块,性能方面就不用多说了,目前应该没有显著优于 Lift-Splat-Shoot 的其他方案……

在这里插入图片描述
下图展示了 LSS view transformation 不同实现所需的内存。当深度类别设定为 D = 59 D=59 D=59时,当输入分辨率为 256 × 704 256\times 704 256×704,BEVPoolv2 所需的内存是之前最快实现所需内存的 5.7 % 5.7\% 5.7%。当输入分辨率为 640 × 1760 640\times 1760 640×1760,BEVPoolv2 所需的内存是之前最快实现所需内存的 2.0 % 2.0\% 2.0%

在这里插入图片描述

2.2 TensorRT

这应该是环视多目感知,少有的支持 TensorRT 部署的 codebase。环视多目 BEV 感知转其他 Backend 最大的麻烦就是视角变幻时实现太复杂,BEVPoolv2 算是比较简单的,利用 TensorRT Plugin 和 Pytorch 共享cuda 实现,转 TensorRT 这个事情就比较简单了。推理速度确实比 Pytorch 后端要快很多。在下表中,作者列出了推理延迟。使用 TensorRT-FP16,在 NVIDIA 3090 显卡上,BEVDet-R50 对于 256 × 704 256\times 704 256×704的输入图像的处理速度可以达到 138.9 138.9 138.9 FPS。
在这里插入图片描述

2.3 Receptive Field

在上一版本的 BEVDet 中,原封不动地继承了 CenterPoint 的感受野。CenterPoint 的感受野以 LiDAR 坐标系的原点为中心点,但评测时是以 IMU (自车)坐标系的原点为感受野的中心。这个 gap 会造成表现变差,于是作者按照 BEVDepth 的设置,将自车坐标系的原点为感受野中心。

2.4 其它改进

BEVDepth

支持了 BEVDepth 的全部改进,包括 LiDAR 的深度监督、深度修正、camera-aware 的深度预测。

Temporal Fusion

引入了 SOLOFusion 的长期融合,改进 BEVDet4D 的时域融合方式。

Stereo Depth Estimation

到目前为止,还没有引入任何关于双目深度预测的技巧,如 BEVStereo、STS、SOLOFusion。作者认为它们为了少量的准确率提升,而推理时间增加了许多,还不如增大图像分辨率和主干网络的大小。

2.5 BEVDet4D-R50-Depth-CBGS

作者构建了BEVDet4D-R50-Depth-CBGS 网络,加入了所有上述的改进。在 NVIDIA 3090 显卡上,PyTorch 实现取得了 52.3 52.3 52.3 NDS,推理速度达到了 16.4 16.4 16.4 FPS。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

React知识点梳理

React是一个用于构建用户界面的JavaScript库。它采用组件化的开发模式,将用户界面拆分为独立的、可重用的组件,通过组件的组合和交互来构建复杂的用户界面。 下面是React的一些核心概念和知识点的梳理,并附带详细示例: 组件(Comp…

MFC第十九天 记事本项目功能完善和开发、CTabCtrl类与分页模式开发

文章目录 记事本项目功能完善和开发查找界面的记忆功能 、使用F3快捷键自动向下查找功能 的开发单次替换的算法研究 CFileDialog 构造函数详解 应用另存为时选择编码 (三种方案)vista 样式文件对话框 bVistaStyle 为TRUE时 1pch.hCApp NotePad.cpp 对编码…

视频对比工具(基于python+ffmpeg+airtest实现视频抽帧比较工具)

VideoDiff:基于ffmpeg,实现视频抽帧比较工具 使用场景:在视频渲染模块发生迭代,快速回归测试其产出的视频是否存在问题,从而节省人工回归成本 源码地址:https://github.com/jiangliuer32/VideoDiff 原理图…

软件架构演进过程与微服务设计中的领域驱动设计(DDD)

软件架构的演进是一个不断改进和解决问题的过程。从传统架构到面向服务架构(SOA),再到微服务架构,每个阶段都带来了新的技术和解决方案。而在微服务架构中,领域驱动设计(DDD)起着至关重要的作用,它能够提高系统的可扩展性、可维护…

快速响应和恢复:使用自动化测试进行系统性能测试

快速响应和恢复:使用自动化测试进行系统性能测试 在当今数字化时代,用户对于应用程序性能的期望越来越高。快速响应和恢复是确保用户满意度和业务成功的关键因素之一。为了保证应用程序在不同负载和条件下的可靠性和稳定性,进行系统性能测试…

centos7中MySQL备份还原策略

目录 一、直接拷贝数据库文件 1.1在shangke主机上停止服务并且打包压缩数据库文件 1.2 在shangke主机上把数据库文件传输到localhost主机上(ip为192.168.33.157) 1.3在localhost主机上停止服务,解压数据库文件 1.4 在localhost主机上开启服务 1.5 测试 二、m…

在vue项目中使用postcss-px2rem插件把px转变为rem,并配合给html根元素设置fontsize,来实现页面的自适应效果

在vue项目中使用postcss-px2rem插件把px转变为rem,并配合给html根元素设置fontsize,来实现页面的自适应效果 安装postcss-px2rem插件,目的:把px转变为remvue.config.js中配置remUnit通过js改变html的fontsize值postcss-px2rem插件…

JVM-Java虚拟机

JVM——Java虚拟机,是Java实现平台无关性的基石。 基本概念:JVM 是可运行 Java 代码的假想计算机 ,包括一套字节码指令集、一组寄存器、一个栈、 一个垃圾回收,堆 和 一个存储方法域。JVM 是运行在操作系统之上的,它与…

【Docker】基本概念和底层技术

Docker 1 什么是 Docker Docker 是一种容器技术。只要开发者将其应用和依赖包进行打包,放入到一个轻量级的、可移植的容器中,就能发布到任何流行的 linux 机器上。 Docker 的要素: image 镜像:静态的container 容器&#xff1a…

android studio 新建项目没有R文件

android studio 新建项目没有R文件,处理步骤 1,找一个能打开的项目替换根目录下的settings.gradle 2,改app 目录下的build.gradle文件 3,改gradle版本 4,改AndroidManifest.xml 5,改theme 改为,ok.

【Python】数据分析+数据挖掘——变量列的相关操作

前言 在Python和Pandas中,变量列操作指的是对DataFrame中的列进行操作,包括但不限于选择列、重命名列、添加新列、删除列、修改列数据等操作。这些操作可以帮助我们处理数据、分析数据和进行特征工程等。 变量列的相关操作 概述 下面将会列出一些基本…

Jmeter-使用http proxy代理录制脚本

Jmeter-使用http proxy代理录制脚本 第1步:打卡jmeter工具新增1个线程组 第2步:给线程组添加1个HTTP请求默认值 第3步:设置下HTTP请求默认值第4步:在工作台中新增1个----HTTP代理服务器 第5步:设置HTTP代理服务器…

2023华为OD统一考试(B卷)题库清单(持续收录中)以及考点说明

目录 专栏导读2023 B卷 “新加题”(100分值)2023Q2 100分2023Q2 200分2023Q1 100分2023Q1 200分2022Q4 100分2022Q4 200分牛客练习题 专栏导读 本专栏收录于《华为OD机试(JAVA)真题(A卷B卷)》。 刷的越多&…

卷积神经网络识别人脸项目—使用百度飞桨ai计算

卷积神经网络识别人脸项目的详细过程 整个项目需要的准备文件: 下载链接: 链接:https://pan.baidu.com/s/1WEndfi14EhVh-8Vvt62I_w 提取码:7777 链接:https://pan.baidu.com/s/10weqx3r_zbS5gNEq-xGrzg 提取码&#x…

pnpm 与monorepo架构

软链接与硬链接 创建方式: mklink (windows) 软链接 : a、b指向同一个文件 b相当于一个快捷方式 硬链接: a、b指向同一个内存地址 某一文件修改,其他文件跟这变化 上图所示:安装某依赖&…

分布式光伏电站监控及集中运维管理-安科瑞黄安南

前言:今年以来,在政策利好推动下光伏、风力发电、电化学储能及抽水蓄能等新能源行业发展迅速,装机容量均大幅度增长,新能源发电已经成为新型电力系统重要的组成部分,同时这也导致新型电力系统比传统的电力系统更为复杂…

【C++】多态(举例+详解,超级详细)

本篇文章会对C中的多态进行详解。希望本篇文章会对你有所帮助。 文章目录 一、多态的定义及实现 1、1 多态的概念 1、2 多态的构成条件 1、2、1 虚函数 1、2、2 虚函数的重写 1、2、3 析构函数构成重写特例原因 1、3 多态的实例练习 1、3、1 例1 1、3、2 例2 1、3、3 例3 1、4…

linux安装conda

linux安装conda 卸载conda 在主目录下,使用普通权限安装: ./Anaconda3-2023.03-1-Linux-x86_64.shanaconda的目录是ENTER

python_day13

reduceByKey算子,聚合 列表中存放二元元组,元组中第一个为key,此算子按key聚合,传入计算逻辑 from pyspark import SparkConf, SparkContext import osos.environ["PYSPARK_PYTHON"] "D:/dev/python/python3.10…

Golua——github.com/yuin/gopher-lua

目录 go调用lua安装使用注册表调用栈Data modelGo中调用lua APILua调用go打开Lua内置模块的子集使用Go创建模块示例1(官方)示例2 关闭一个运行的lua虚拟机虚拟机之间共享lua字节码 go-lua调优预编译虚拟机实例池模块调用 go调用lua 这里比较下两个比较有…