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,一经查实,立即删除!

相关文章

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

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

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

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

centos7中MySQL备份还原策略

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

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…

【分布式】1、CAP 理论 | 一致性、可用性、分区容忍性

文章目录 一、CAP 理论1.1 Consistency 一致性1.2 Availbility 可用性1.3 Partition Tolerance 分区容忍性1.4 CAP 应用1.4.1 CP1.4.2 AP 二、CAP 实践2.1 ACID2.2 BASE 一、CAP 理论 是 2002 年证明的定理,原文,内容如下: In a distributed…

喜报|英码科技联合广师大荣获“智芯杯”AI芯片应用创新创业大赛两大奖项

7月15日,由中国仪器仪表学会主办的全国首届“智芯杯”AI芯片应用创新创业大赛总决赛暨颁奖典礼圆满结束,英码科技联合广东技术师范大学设计开发的“AI视觉,让工厂建设更智慧”和“基于AI的智慧校园无感考勤系统”创新项目均荣获三等奖。 ​ 自…

springcloudAlibaba之nacos集群部署和nginx负载均衡

1.环境准备 nacos server安装包:https://github.com/alibaba/nacos nginx安装包:https://nginx.org/en/download.html 2、nacos配置 将下载好的nacos-server的压缩包解压好以后,复制出N份(这里取决于你集群的数量)&…

设计模式之模板方法模式

例子:登陆(普通用户,工作人员) 没有使用设计模式实现用户登陆 package com.tao.YanMoDesignPattern.template.notPattern;/*** Author Mi_Tao* Date 2023/7/22* Description* Version 1.0**/ public class LoginModel {private …

Grafana中table的使用技巧

将多个指标数据显示在同一个Table中,需要用到Transform功能,利用Transform功能可以将数据进行处理只显示想要的数据: