MIT-BEVFusion系列八--onnx导出1 综述及相机网络导出

本文介绍了bevfusion项目中相机部分的onnx导出过程,包括选择Resnet50作为骨干网络、网络拆分策略以及使用pytorch原生伪量化导出camera.backbone.onnx和camera.vtransform.onnx,便于后续推理部署。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

该系列文章与qwe一同创作,喜欢的话不妨点个赞。

综述

bevfusion的各个部分的实现有着鲜明的特点,并且相互独立,特别是考虑到后续部署的需要,这里将整个网络,分成多个部分,分别导出onnx,方便后续部署。

在这里插入图片描述

export-camera.py

相机部分导出思路如下:
1)骨干网络的选择
  对于骨干网络来说,选择了Resnet50作为骨干网络。精度会掉一点,但是收益非常大,益于部署。

2)网络拆分
  bev_pool有着高性能计算的需求,是使用cuda核函数实现的。

  bev_pool的输入,依赖于bev_pool之前的网络的输出,bev_pool的输出,需要有个池化,使得360360大小的bev池化成180180。

  所以bev_pool把整个网络,从中间分隔。

目前思路如下

  1. bev_pool前的网络,导出onnx,最终用TRT推理。
  2. bev_pool部分使用cuda核函数实现。
  3. bev_pool后的网络,导出onnx,最终用TRT推理。

在这里插入图片描述

加载模型

在这里插入图片描述

这里选择经过 ptq 量化后的 bevfusion 模型。

  • Args

Namespace(ckpt='qat/ckpt/bevfusion_ptq.pth', fp16=False)

加载数据

在这里插入图片描述

  • Data数据中有什么
    在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

加载后续生成计算图时需要的数据。其实就是提供了一个全是0的样本数据。

生成需要导出成 onnx 的模块

Backbone 模块

CUDA-BEVFusion选择使用子类化的方式,从model也就是整个模型中,摘出自己想要的相机部分,构建成camera_model
在这里插入图片描述

下图是具体子类化实现方式,子类化要对mit-bevfusion的代码、网络十分熟悉,有着充分的理解。
在这里插入图片描述

下图是mit-bevfusion的代码,会发现二者很像。子类化要忠实于原本的python算法,在这个基础上进行修改,实现自己想要的功能。
在这里插入图片描述

下方也是原mit-bevfusion的代码,可以看到原本的输出只有1个,而SubclassCameraModule里的get_cam_feats有两个输出。这个
在这里插入图片描述

这里创建了一个SubclassCameraModule类,用于在 BEVFusion 模型中提取部分模型用于导出 onnx。

  • init 函数就是通常的初始化函数。

  • forward 函数是基于 bevfusion 中的 extract_camera_features 函数的修改,对self.encoders["camera"][vtransforms]进行了较多修改。

    • 取消了 get_geometrybev_pool 的计算,并且省去了深度和图像特征的外积操作。之后生成的计算图包含了 Resnet50、GeneralizedLSSFPN、dtransform、depthnet 和两个切片操作。

    • 输出从原本的一个输出,

    • Resnet50
      在这里插入图片描述

      在这里插入图片描述

      在这里插入图片描述

      在这里插入图片描述

    • GeneralizedLSSFPN(Neck)、dtransform、depthnet
      在这里插入图片描述

    • 切片
      在这里插入图片描述

  • 从onnx中可以明显的看出,SubclassCameraModule类的输出修改为两个。

    • 取消外积,这样输入bev_pool的数据规模大大减少。从161183288*80拆成了两个如图形状的数据。
VTransform 模块

在这里插入图片描述

BaseDepthTransform 中的下采样操作,将 bev pool 的输出作为输入,这里仅导出 downsampling 的计算图。

生成 onnx

使用 pytorch 原生的伪量化计算方法

在这里插入图片描述

导出 camera.backbone.onnx

在这里插入图片描述

根据 SubclassCameraModule.forward 中的流程生成计算图,再经过简化(126行)生成最终的 camera.backbone.onnx

导出 camera.vtransform.onnx

在这里插入图片描述

根据 DepthLSSTransform.downsample 模块生成计算图,保存为 camera.vtransform.onnx

### 实现 MIT BEVFusion 项目代码复现教程 #### 准备工作 为了顺利进行BEVFusion项目的代码复现,确保安装了必要的依赖库和工具。这些准备步骤包括但不限于Python版本的选择、虚拟环境的创建以及特定软件包的安装。 #### 安装依赖项 按照官方文档说明来设置开发环境是非常重要的。通常情况下,建议使用`conda`管理环境以简化依赖关系处理过程[^2]: ```bash conda create -n bev_env python=3.8 conda activate bev_env pip install -r requirements.txt ``` #### 数据集获取与预处理 获得适当的数据集对于训练模型至关重要。根据BEVFusion的要求下载所需数据集,并遵循其指定的方式完成数据预处理操作。这可能涉及到将原始传感器读数化为适合输入给定网络架构的形式,比如通过VoxelNet处理激光雷达点云数据[^1]。 #### 模型构建 理解并实现多模态融合的核心在于掌握不同传感模式间信息交互机制的设计原理。具体来说,在本案例中是指如何有效地将在BEV视角下的图像特征同LiDAR特征相结合。此部分涉及到了解两个主要流程——即从摄像头视频帧提取语义丰富的视觉描述子及其向BEV坐标的映射方法;还有就是怎样利用全卷积神经网络(FCN)达成异构源间的无缝衔接[^3]。 #### 训练与评估 一旦完成了上述准备工作,则可以着手于实际的实验环节。调整超参数直至找到最优组合,并定期保存检查点以便后续分析性能表现。此外,还需定义合理的评价指标体系用于衡量最终成果的好坏程度。 #### 调试优化 面对可能出现的各种问题时,耐心细致地排查错误根源所在显得尤为关键。无论是硬件资源不足还是算法逻辑缺陷都可能是造成进度受阻的原因之一。针对这些问题采取有效的解决措施能够显著提升工作效率。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值