这里写目录标题
该系列文章与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
上分配内存。最后,将数据形状和指向数据的指针存储到容器中,用于后续推理使用。
为最终检测框数量和检测框数据在 host
和 device
上分配内存,MAX_DETECTION_BOX_SIZE
为 1024
,并为输出缓存重新分配储存空间。
初始化指向 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
- 静态类型转换:
https://gitee.com/duanmushuangquan/feishu_img/tree/master/static_cast<GeometryParameter&>(param_)
将param_
(派生类对象)转换为它的基类GeometryParameter
的引用。这是可能的,因为GeometryParameterExtra
继承自GeometryParameter
。 - 赋值操作:赋值操作
= param
将param
的值赋给了param_
的基类部分。这意味着param_
中GeometryParameter
部分的所有成员变量都将被设置为param
中对应成员变量的值。
这种操作通常用于多态场景中,当您想要只操作或只修改派生类对象中基类的部分时。在这种情况下,它允许您更新
GeometryParameterExtra
对象的GeometryParameter
部分,而不影响其余扩展的部分(如D
、dx
、bx
和nx
字段)。 -
初始化相关参数,并分配内存。
-
上图 218 行,219 行,计算间隔,得到采样的步长,对比 mit-bevfusion
-
图中 239 行,用 cuda_2d_launch 宏启动核函数
- 结果:frustum_赋值。值为,float3 类型的最初的视锥点。
- 类似 python 中,1 到 704 采样 88 个点这种
- 结果:frustum_赋值。值为,float3 类型的最初的视锥点。
-
cuda_2d_x
-
图中 125 行:
- offset 计算,左乘右加
D id feat_height iy feat_width ix
- offset 计算,左乘右加
构建视锥,根据全局线程索引来分配视锥中点的位置。宽度 (x 方向) 划分为 88 个点,高度 (y 方向) 划分为 32 个点,深度 (z 方向) 划分为 118 个点。宽高的点的间隔通过图像特征宽高和视锥宽高比计算得到。