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

目录

  • 综述
    • export-camera.py
      • 加载模型
      • 加载数据
      • [生成需要导出成 onnx 的模块](#生成需要导出成 onnx 的模块)
        • [Backbone 模块](#Backbone 模块)
        • [VTransform 模块](#VTransform 模块)
      • [生成 onnx](#生成 onnx)
        • [使用 pytorch 原生的伪量化计算方法](#使用 pytorch 原生的伪量化计算方法)
        • [导出 camera.backbone.onnx](#导出 camera.backbone.onnx)
        • [导出 camera.vtransform.onnx](#导出 camera.vtransform.onnx)

综述

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
json 复制代码
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的数据规模大大减少。从16 1183288*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

相关推荐
Ezekiel Mok6 小时前
基于路径长度的样条插补算法(自动驾驶和路径跟踪控制适用)
算法·matlab·自动驾驶·路径跟踪·插补
奔袭的算法工程师8 小时前
毫米波雷达深度学习技术-1.7训练一个神经网络
人工智能·深度学习·神经网络·目标检测·自动驾驶
Neituijunsir8 小时前
2024.06.28 校招 实习 内推 面经
c++·python·算法·面试·自动驾驶·汽车·求职招聘
高登先生12 小时前
南京,协同开展“人工智能+”行动
大数据·人工智能·科技·百度·机器人·自动驾驶
Neituijunsir12 小时前
2024.06.27 校招 实习 内推 面经
c++·算法·面试·车载系统·自动驾驶·汽车·求职招聘
豆皮卷香菜1 天前
横穿自动驾驶
人工智能·机器学习·自动驾驶·最优化
渡众机器人3 天前
自动驾驶水泥搅拌车在梁场的应用(下)
人工智能·科技·物联网·机器学习·机器人·自动驾驶·搅拌车
Kin__Zhang3 天前
【论文阅读】自动驾驶光流任务 DeFlow: Decoder of Scene Flow Network in Autonomous Driving
论文阅读·人工智能·自动驾驶
AI-Seeker4 天前
自动驾驶世界模型系列 - 2 | Delphi
人工智能·深度学习·机器学习·自动驾驶·aigc·音视频
Ezekiel Mok4 天前
面向阿克曼移动机器人(自行车模型)的LQR(最优二次型调节器)路径跟踪方法
matlab·自动驾驶·汽车·移动机器人·路径跟踪·lqr