MIT-BEVFusion系列九--CUDA-BEVFusion部署3 create_core方法2

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

初始化指向 bevfusion::head::transbbox::TransBBox 对象的指针

这一部分也是有onnx的模型的,所以也是反序列化engine加为输出分配模型

  • create_transbbox
    • 入参:
      在这里插入图片描述

    • 返回 engine,开辟内存

RAII加节后模式的思想
在这里插入图片描述

在这里插入图片描述

110行,反序列化
在这里插入图片描述

根据 序列化的engine文件 head.bbox.plan 来构建推理引擎,检查捆绑点是否存在动态维度。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

因为 FFN 的六个输出维度不是相同的,所以需要根据每个输出的形状来分配内存。我们只需要为输出节点分配内存,可以调用 bindingIsInput 函数通过捆绑点索引来筛掉输入节点。通过 https://gitee.com/duanmushuangquan/feishu_img/tree/master/static_dims 函数来获取当前捆绑点的形状,用于计算输出节点参数量。通过 dtype 函数来获取输出的类型,实际是通过 getBindingDataType 函数实现的。通过数据形状和数据类型,就可以为 FFN 的当前输出节点在 device 上分配内存。最后,将数据形状和指向数据的指针存储到容器中,用于后续推理使用。

在这里插入图片描述

为最终检测框数量和检测框数据在 hostdevice 上分配内存,MAX_DETECTION_BOX_SIZE1024,并为输出缓存重新分配储存空间。

初始化指向 bevfusion::lidar::SCN 对象的指针
  • 入参 param.lidar_scn
    在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

init 函数的入参为之前构建 bevfusion::Core 是关于稀疏卷积网络的参数,其中主要包含 体素化的参数序列化engine路径输出维度顺序

在这里插入图片描述

  • 35 行,入参
    在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

  • 在创建体素网格时,主要是对体素参数和输出体素网格的尺寸进行初始化。之后就是计算一些参数的内存占用,为它们在 host 和 device 上分配内存。
  • hash_table_size 的赋值方式是在最大点云数据(300000)的基础上乘了 4,这个一方面是为了避免哈希冲突,另一方面也是进行调试结果挑选出来可以达到最优性能的

在这里插入图片描述

  • 这里的 load_engine_from_onnx 就是加载之前导出的 lidar.backbone.xyz.onnx 模型,并生成 engine (trt engine?),这部分代码封装在libspconv.so 文件中(#include <spconv/engine.hpp>),无法看到源代码,需要查看 复杂onnx
    在这里插入图片描述
初始化指向 bevfusion::camera ::Normalization 对象的指针
  • 入参
    在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

加载图像预处理的参数,并为原始图像特征和预处理之后的图像特征分配内存。

初始化指向 bevfusion::camera ::Depth 对象的指针
  • 入参:

    • param.normalize.output_width:704
    • param.normalize.output_height:256
    • param.normalize.num_camera:6
  • 执行结果:内部分配变换矩阵 img_aug_matrix_、lidar2image_、depth_output_内存

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

初始化图像特征的形状变量,为图像增强矩阵、lidar2image 矩阵和点云数据转换到视锥中的深度信息分配内存。

初始化指向 bevfusion::camera ::Geometry 对象的指针
  • 入参:
    在这里插入图片描述

  • 函数执行结果:开始视锥相关的数据内存(矩阵、视锥点数量),通过核函数计算像平面坐标系下,视锥的点的 xyz 索引。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

  • 上图 196 行,代码(11 行)。

    • param_属于 GeometryParameterExtra 类型,GeometryParameterExtra 继承 GeometryParameter
    1. 静态类型转换https://gitee.com/duanmushuangquan/feishu_img/tree/master/static_cast<GeometryParameter&>(param_)param_(派生类对象)转换为它的基类 GeometryParameter 的引用。这是可能的,因为 GeometryParameterExtra 继承自 GeometryParameter
    2. 赋值操作:赋值操作 = paramparam 的值赋给了 param_ 的基类部分。这意味着 param_GeometryParameter 部分的所有成员变量都将被设置为 param 中对应成员变量的值。

    这种操作通常用于多态场景中,当您想要只操作或只修改派生类对象中基类的部分时。在这种情况下,它允许您更新 GeometryParameterExtra 对象的 GeometryParameter 部分,而不影响其余扩展的部分(如 Ddxbxnx 字段)。

  • 初始化相关参数,并分配内存。

  • 上图 218 行,219 行,计算间隔,得到采样的步长,对比 mit-bevfusion
    在这里插入图片描述

  • 图中 239 行,用 cuda_2d_launch 宏启动核函数

    • 结果:frustum_赋值。值为,float3 类型的最初的视锥点。
      • 类似 python 中,1 到 704 采样 88 个点这种

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

  • cuda_2d_x
    在这里插入图片描述

  • 图中 125 行:

    • offset 计算,左乘右加
      Did
      feat_heightiy
      feat_widthix

构建视锥,根据全局线程索引来分配视锥中点的位置。宽度 (x 方向) 划分为 88 个点,高度 (y 方向) 划分为 32 个点,深度 (z 方向) 划分为 118 个点。宽高的点的间隔通过图像特征宽高和视锥宽高比计算得到。

在这里插入图片描述

  • 26
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值