当前位置: 首页 > news >正文

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

目录

  • 综述
    • export-camera.py
      • 加载模型
      • 加载数据
      • 生成需要导出成 onnx 的模块
        • Backbone 模块
        • VTransform 模块
      • 生成 onnx
        • 使用 pytorch 原生的伪量化计算方法
        • 导出 camera.backbone.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

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

相关文章:

  • StarRocks表设计——分区分桶与副本数
  • 基于微信小程序的健身房私教预约系统,附源码
  • 极其抽象的SpringSecurity理解
  • 【前端工程化面试题】webpack proxy的工作原理,为什么能解决跨域问题
  • devc++ 使用 winsock 实现 UDP 广播
  • Rust 初体验6
  • phpstrom创建thinkphp项目
  • 【Webpack】处理 js 资源
  • C++运算符重载(日期类的运算符重载为例)
  • js---webAPI
  • 原型设计模式
  • 工作心得——css让元素居中的方法
  • 嵌入式linux驱动开发篇之设备树
  • php 数组函数
  • 关于jupyter的一些小笔记
  • (三)从jvm层面了解线程的启动和停止
  • CentOS6 编译安装 redis-3.2.3
  • Electron入门介绍
  • ES2017异步函数现已正式可用
  • ES6--对象的扩展
  • Fundebug计费标准解释:事件数是如何定义的?
  • Hexo+码云+git快速搭建免费的静态Blog
  • Just for fun——迅速写完快速排序
  • Laravel5.4 Queues队列学习
  • node-glob通配符
  • React Transition Group -- Transition 组件
  • Shell编程
  • SOFAMosn配置模型
  • Swift 中的尾递归和蹦床
  • vue2.0项目引入element-ui
  • Webpack入门之遇到的那些坑,系列示例Demo
  • Zepto.js源码学习之二
  • 阿里云爬虫风险管理产品商业化,为云端流量保驾护航
  • 短视频宝贝=慢?阿里巴巴工程师这样秒开短视频
  • 简析gRPC client 连接管理
  • 如何抓住下一波零售风口?看RPA玩转零售自动化
  • 小程序button引导用户授权
  • 异常机制详解
  • MiKTeX could not find the script engine ‘perl.exe‘ which is required to execute ‘latexmk‘.
  • # MySQL server 层和存储引擎层是怎么交互数据的?
  • #define、const、typedef的差别
  • #我与Java虚拟机的故事#连载11: JVM学习之路
  • (Note)C++中的继承方式
  • (二)基于wpr_simulation 的Ros机器人运动控制,gazebo仿真
  • (论文阅读11/100)Fast R-CNN
  • (五)Python 垃圾回收机制
  • .md即markdown文件的基本常用编写语法
  • .NET LINQ 通常分 Syntax Query 和Syntax Method
  • .NET 表达式计算:Expression Evaluator
  • .NET/C# 如何获取当前进程的 CPU 和内存占用?如何获取全局 CPU 和内存占用?
  • .NetCore实践篇:分布式监控Zipkin持久化之殇
  • .NET分布式缓存Memcached从入门到实战
  • @Transactional类内部访问失效原因详解
  • [2544]最短路 (两种算法)(HDU)
  • [C#]winform制作仪表盘好用的表盘控件和使用方法