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

news2024/11/24 19:12:42

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.coloradmin.cn/o/782942.html

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

相关文章

Linux基础IO(一)

Linux基础IO 文章目录 Linux基础IOC语言中的文件操作c语言文件打开方式C语言文件操作函数 系统文件操作stdin/stdout/stderropeanclosewriteread 文件描述符重定向什么是重定向dup2 C语言中的文件操作 我们通过两个代码复习一下C语言中的文件操作: int main() {FI…

uniapp-开发APP使用自定义插件

uniapp-开发APP使用自定义插件 需求背景: 项目组开发了一个APP需要使用到打印机的功能、所以需要通过打印机厂商提供的jdk包结合自己的业务融合到uniapp 中。 首先你需要一个懂开发android开发的同事、让他帮忙配合写一些调用方法(调用打印机提供的一些…

态势标绘专题介绍

介绍 这个专栏是专门针对基于Cesium来实现态势标绘的专题专栏,专栏主要实现了30余种态势几何形状的标绘和编辑、文本的标绘和编辑、图片的标绘和编辑以及简单模型的标绘,同时支持标绘结果的导出以及导入。包括最终编写成的一个完整的Vue3.2+TS+Cesium1.107.2的标绘组件。专栏…

【STL】list用法试做_底层实现

目录 一,list 使用 1. list 文档介绍 2. 常见接口 1. list中的sort 2. list sort 与 vector sort效率对比 3. 关于迭代器失效 4. clear 二,list 实现 1.框架搭建 2. 迭代器类——核心框架 3. operator-> 实现 4. const——迭代…

c++11 标准模板(STL)(std::basic_filebuf)(二)

定义于头文件 <fstream> template< class CharT, class Traits std::char_traits<CharT> > class basic_filebuf : public std::basic_streambuf<CharT, Traits> std::basic_filebuf 是关联字符序列为文件的 std::basic_streambuf 。输入序…

基于AOP实现登录日志和操作日志(新手入门版)

基于AOP实现登录日志和操作日志 目录结构代码PostMan测试代码控制台查看输出解析成JSON如果你觉得对你有帮助的话&#xff0c;请点赞收藏 目录结构 代码 package com.demo.mymaintest.constants;import java.lang.annotation.Documented; import java.lang.annotation.ElementT…

在Debian 12 上安装 PHP 5.6, 7.4

环境&#xff1a;Debian 12 Debian 12 默认的PHP版本为 8.2 如果直接安装php7.4就出现下面的报错&#xff1a; sudo apt-get install libapache2-mod-php7.4 php7.4 php7.4-gd php7.4-opcache php7.4-mbstring php7.4-xml php7.4-json php7.4-zip php7.4-curl php7.4-imap p…

【人工智能】神经网络、前向传播、反向传播、梯度下降、局部最小值、多层前馈网络、缓解过拟合的策略

神经网络、前向传播、反向传播 文章目录 神经网络、前向传播、反向传播前向传播反向传播梯度下降局部最小值多层前馈网络表示能力多层前馈网络局限缓解过拟合的策略前向传播是指将输入数据从输入层开始经过一系列的权重矩阵和激活函数的计算后,最终得到输出结果的过程。在前向…

HarmonyOS/OpenHarmony应用开发-Stage模型UIAbility组件使用(六)

UIAbility组件间交互&#xff08;设备内&#xff09; UIAbility是系统调度的最小单元。在设备内的功能模块之间跳转时&#xff0c;会涉及到启动特定的UIAbility&#xff0c;该UIAbility可以是应用内的其他UIAbility&#xff0c;也可以是其他应用的UIAbility&#xff08;例如启…

unity 调用C++追踪物体后的位姿通过 dll,左右手坐标转化2

外参矩阵转四元数,左右手坐标系转化1_天人合一peng的博客-CSDN博客 在之前1的基础上更新 通过定位已经求得了物体的4*4的位姿矩阵&#xff0c;将其变化为四元数并从opengl的右手坐标转化为unity的左手坐标系。 body2world_pose().matrix()为计算得到的4*4的位姿矩阵 例 body…

Go语言之结构体

在实际开发中&#xff0c;我们可以将一组类型不同的、但是用来描述同一件事物的变量放到结构体中。例如&#xff0c;在校学生有姓名、年龄、身高、成绩等属性&#xff0c;学了结构体后&#xff0c;我们就不需要再定义多个变量了&#xff0c;将它们都放到结构体中即可。 在Go语言…

基于linux下的高并发服务器开发(第三章)- 3.7 线程属性

int pthread_attr_init(pthread_attr_t *attr);- 初始化线程属性变量int pthread_attr_destroy(pthread_attr_t *attr);- 释放线程属性的资源int pthread_attr_getdetachstate(const pthread_attr_t *attr, int *detachstate);- 获取线程分离的状态属性int pthread_attr_setdet…

【Redis】所以延迟双删有啥用

文章目录 1、何为延时双删2、常用缓存策略2.1、介绍2.2、先删缓存后更库2.3、先更库后删缓存2.4、使用场景 3、延时双删实现4、为什么要使用延时双删5、方案选择6、延时双删真的完美吗7、如何确定延时的时间 1、何为延时双删 延迟双删&#xff08;Delay Double Delete&#xf…

Jupyter 安装、简单操作及工作路径更换

一、Jupyter下载安装 pip install jupyterAnaconda是Python另一个非常流行的发行版&#xff0c;它之后有着自己的叫做“conda”的安装工具。用户可以使用它来安装很多第三方包。然而&#xff0c;Anaconda会预装很多包&#xff0c;包括了Jupyter Notebook,所以若已经安装了Anac…

VUE3 语法教程

vue3 起步 刚开始学习 Vue&#xff0c;我们不推荐使用 vue-cli 命令行工具来创建项目&#xff0c;更简单的方式是直接在页面引入 vue.global.js 文件来测试学习。 Vue3 中的应用是通过使用 createApp 函数来创建的&#xff0c;语法格式如下&#xff1a; const app Vue.crea…

cmder 使用简介

文章目录 1. cmder 简介2. 下载地址3. 安装4. 配置环境变量5. 添加 cmder 到右键菜单6. 解决中文乱码问题 1. cmder 简介 cmder 是一个增强型命令行工具&#xff0c;不仅可以使用 windows 下的所有命令&#xff0c;更爽的是可以使用 linux的命令, shell 命令。 2. 下载地址 …

机器学习深度学习——预备知识(下)

机器学习&&深度学习——预备知识&#xff08;下&#xff09; 4 微积分4.1 导数和微分4.2 偏导数4.3 梯度4.4 链式法则 5 自动微分5.1 简单例子5.2 非标量变量的反向传播5.3 分离计算5.4 Python控制流的梯度计算 6 概率6.1 基本概率论6.1.1 概率论公理 6.2 处理多个随机…

5.1 Bootstrap 插件概览

文章目录 Bootstrap 插件概览data 属性编程方式的 API避免命名空间冲突事件 Bootstrap 插件概览 在前面 布局组件 章节中所讨论到的组件仅仅是个开始。Bootstrap 自带 12 种 jQuery 插件&#xff0c;扩展了功能&#xff0c;可以给站点添加更多的互动。即使您不是一名高级的 Jav…

超参数优化 - 贝叶斯优化的实现

目录 1. 基于Bayes_opt实现GP优化 1.1 定义目标函数 1.2 定义参数空间 1.3 定义优化目标函数的具体流程 4. 定义验证函数&#xff08;非必须&#xff09; 5. 执行实际优化流程 2. 基于HyperOpt实现TPE优化 2.1 定义目标函数 2.2 定义参数空间 2.3 定义优化目标函数的…

Asp.Net WebForm ViewState

ViewState用于保存服务器控件(runat"server")状态便于在触发回调后&#xff08;PostBack&#xff09;恢复页面。 页面拖入一个Form id"form1" runat"server",里面添加一个<asp:Button id"Button1" Text"删除" OnClick&q…