自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

xiaohu的博客

博观而约取,厚积而薄发

  • 博客(179)
  • 资源 (2)
  • 收藏
  • 关注

原创 Apollo Planning——TASK之PathBoundsDecider

利用前几个决策器,根据相应条件,产生相应的SL边界。这里说明以下Nudge障碍物的概念——主车旁边的障碍物未完全阻挡主车,主车可以通过绕行避过障碍物(注意图中的边界)。

2023-12-19 20:49:29 173 1

原创 Apollo Planning——PathLaneBorrowDecider

借道决策器的主要功能为判断当前车辆是否具备借道能力,其实现在类PathLaneBorrowDecider的成员函数process()中。process()函数的功能一共分为三部分:检查输入、如果路径复用则跳过借道决策。// 如果路径复用则跳过借道决策/**/经过借道决策模块计算输出的借道能力仅表示为当前车辆有借道需求且满足借道条件,但是否真的借道仍需要下游的路径生成、路径选优决定。

2023-12-19 17:58:08 120 1

原创 Apollo Planning——换道:LANE_CHANGE_DECIDER

4、判断是否为可变车道时调用了 IsChangeLanePath(),它的逻辑也很简单, 如果自车在当前ReferenceLine 的车道segment上,则为FALSE;2、在stage阶段会依次调用每个 task 的 Execute() 函数,LaneChangeDecider继承自 Decider 类,Decider继承自基类 task 类,并且override了Execute() 方法;场景下,所调用的第一个task,它的作用主要有两点:判断当前是否进行变道,以及变道的状态,并将结果存在变量。

2023-12-19 15:39:57 1089

原创 apollo7.0——规划代码解析

于根据当前车辆状态信息和上一条轨迹,计算出拼接后的轨迹,并返回拼接后的轨迹。

2023-12-15 14:43:04 1173

原创 二值贝叶斯滤波计算4d毫米波聚类目标动静属性

为了估计目标在给定时刻的动态概率,计算速度大于给定值的点与目标点云中的点总数的比率。在二值贝叶斯滤波器中使用贝叶斯定理来更新目标的状态,它可以是静态的,也可以是动态的,在t时刻分别用0或1的二进制值表示。的点数与目标点云中的点总数的比值。在动态和静态属性更新中,计算为速度大于给定值。

2023-09-21 20:05:34 724

原创 Ghost Target Identification by Analysis of the Doppler Distribution in Automotive Scenarios

为了安全地操作驾驶员辅助系统,必须清楚地识别和表征目标参数,即目标车辆的方向和尺寸。真实目标在反射停放的汽车、高速公路上的金属路障,甚至更大的路标等表面时的反射可能会导致错误的决定。这种不需要的目标被称为重影目标,并且应该避免。重影目标的识别,例如在穿墙成像的应用中,是众所周知的问题。通过精确了解反射表面的位置和方向,可以将重影目标与真实目标区分开来,如[1]所示。可以如[2]中那样应用发射波束成形来仅照射某个角度域,同时在整个角度域上进行接收。

2023-09-20 11:14:04 153

原创 ros2——Time

对于即使在模拟中运行也希望访问实际挂钟时间的情况,roslib 提供了所有时间结构的 Wall 版本,即 ros::WallTime、ros::WallDuration 和 ros::WallRate,它们具有相同的接口 分别为 ros::Time、ros::Duration 和 ros::Rate。您应该使用 roscpp 的时间例程来访问当前时间,而不是使用平台时间例程,这将与模拟时钟时间以及挂钟时间无缝配合。基元类型,roslib 分别提供 ros::Time 和 ros::Duration 类。

2023-08-22 17:07:30 551

原创 多目标跟踪数据关联算法

wkts跟踪门的作用是将观测回波分配给已建立的目标轨迹或者新目标轨迹的一种粗略检验方法, 是机动目标跟踪中首当其冲的问题。跟踪门是跟踪空间中的一块子空间 ,中心位于被跟踪目标的预测状态 ,其大小由接收正确回波的概率确定。设置的跟踪门的质量好坏直接影响着数据关联算法的计算量的大小 ,也影咱着跟踪起始和跟踪终结以及航迹质量。在多目标跟踪的数据关联过程 中 ,如果没有量测落跟踪门内 ,则用目标状态的一次预测更新航迹;如果只有单个量测落在被跟踪目标的跟踪门内 , 则此量测被直接用于轨迹更新;

2023-07-14 17:58:49 1521

原创 不确定推理方法

证据理论可处理由不知道所引起的不确定性,它采用信任函数而不是概率作为度量,通过对一些时间的概率加以约束一建立信任函数而不必说明精确的难以获得的概论,当约束限制为严格的概率时,它就进而成为概率论。

2023-06-20 21:07:08 341

原创 Apollo 7.0——percception:rader源码剖析

该模块的启动是通过融合模块的dag文件而启动的,在中,并没有单独启动radar的launch文件或者单独启动的dag文件。其具体路径为:Apollo/modules/perception/production/dag/dag_streaming_perception.daglaunch文件用来启动,dag文件描述了整个系统的拓扑关系,也定义了每个Component需要订阅的话题。

2023-05-02 13:45:37 1101 1

原创 Cuda—— Atomic Functions

原子函数对驻留在全局或共享内存中的一个 32 位或 64 位字执行读取-修改-写入原子操作。在 float2 或 float4 的情况下,对驻留在全局内存中的向量的每个元素执行读取-修改-写入操作。例如,atomicAdd() 在全局或共享内存中的某个地址读取一个字,向其添加一个数字,然后将结果写回同一地址。原子函数只能在设备函数中使用。

2023-03-27 13:55:12 773

原创 基于3d稀疏卷积的centerpoint部署

backbone前面部分全部用tensorRT实现定义算子并调用TensoRT API搭建推理引擎。

2023-03-11 19:31:09 1123 13

原创 TensorRT量化工具pytorch_quantization代码解析(四)

补充下相关的公式理论基础,再写!!!继续看其作用:收集校准数据的统计信息:将校准数据馈送到模型,并以直方图的形式收集每个层的激活分布统计信息以进行量化。收集直方图数据后,使用一个或多个校准算法( compute_amax)校准刻度( calibrate_model )。在标定过程中,尽量确定每一层的量化尺度,以达到优化模型精度等目标。

2023-03-02 17:33:07 1513 4

原创 TensorRT量化工具pytorch_quantization代码解析(二)

为了处理量化梯度,除了未定义的点之外,几乎所有地方都是零,可以使用 直通估计器 ( STE ),它通过伪量化操作符传递梯度。希望存储为float,pytorch函数接受float量化值,它可能不接受整数输入。例如,对于num_bits=8,[0,255]。输入将在[-amax,amax]范围内量化,amax将广播到inputs tensor。例如,对于num_bits=8,用[-127,127]代替[-128,127]。在前向过程中,对浮点权重和激活进行伪量化,并使用这些伪量化的权重和激活来执行层的操作。

2023-02-28 19:51:47 1596 1

原创 TensorRT量化工具pytorch_quantization代码解析(一)

API 的核心是 TensorQuantizer 模块,它可以量化、伪量化或收集张量的统计信息。在 TensorQuantizer 之上的是量化模块,这些模块被设计为 PyTorch 全精度模块的替代品。这些是使用 TensorQuantizer 对模块的权重和输入进行伪量化或收集统计信息的方便模块。转换也可以使用 API 手动完成,这允许在不想量化所有模块的情况下进行部分量化。会动态地修改 PyTorch 代码,以便将 torch.nn.module 的一些子类替换为对应的量化版本。

2023-02-28 16:29:18 3130 1

原创 基于pointpillars的点云目标检测、测试评估、TensorRT后量化及ROS可视化

参考:https://github.com/traveller59/kitti-object-eval-python,把相应的的依赖函数提取出来了,不需要单独安装second-1.5.1,spconv-1.0。也可以混合精度测试,通过修改config里的yaml参数,测试评估时要保证路径一一对应。可以看出int8精度损失比较严重,需要进一步做感知训练量化,接下来会利用英伟达提供的。编译代码,会得到两个可执行文件,一个用于获取数据的推理结果,一个用于可视化。进一步做感知训练量化。

2023-02-09 20:44:10 1558 7

原创 一文读懂TensorRT整数量化

模型量化是一种流行的深度学习优化方法,其中模型数据(包括网络参数和激活)从浮点表示转换为较低精度表示,通常使用 8 位整数。在处理 8 位整数数据时, NVIDIA GPU 使用更快更低成本的 8 位张量核来计算卷积和矩阵乘法运算。这会产生更多的计算吞吐量,这在计算受限的层上尤其有效。将数据从内存移动到计算单元(在 NVIDIA GPU s 中的流式多处理器)需要时间和能量,而且还会产生热量。将激活和参数数据的精度从 32 位浮点值降低到 8 位整数可导致 4 倍的数据缩减,从而省电并减少产生的热量。

2023-02-07 22:44:27 1100

原创 cuda Sgemm矩阵乘法优化

一个线程的计算过程如下图所示,每次从Shared memory中取矩阵A的长度为TM的向量和矩阵B的长度为TN的向量,这两个向量做外积并累加到部分和中,一次外积共TM * TN次乘累加,一共需要循环BK次取数和外积。计算一次 FMA(乘累加)之前需要读一次 A 和读一次 B,众所周知,读取 Global Memory 的代价很大,通常都需要几百个 cycle(时钟周期),而计算一次 FMA 通常只需要几个 cycle,大量的时间被花费在了访存上。注意M、N要为4的倍数,M可以为任意数。,同时考虑边缘情况,

2023-01-18 09:32:17 405

原创 TensoRT—— buffers管理(samplesCommon::BufferManager)

BufferManager类处理主机和设备缓冲区分配和释放。这个RAII类处理主机和设备缓冲区的分配和释放、主机和设备缓冲器之间的memcpy以帮助推断,以及调试转储以验证推断。BufferManager类用于简化缓冲区管理以及缓冲区和引擎之间的任何交互。

2022-12-13 13:45:46 1146 4

原创 CUDA——向量化内存

cuobjdump 从 CUDA 二进制文件(独立的和嵌入在主机二进制文件中的文件)中提取信息,并以人类可读的格式呈现它们。此外,如前所述,如果您的指针未对齐或您的数据类型大小(以字节为单位)不是 2 的幂,则您不能使用矢量化加载。在本文中,我将向您展示如何在 CUDA C/C++ 中使用矢量加载和存储来帮助提高带宽利用率,同时减少执行指令的数量。最后,我们启动的线程数是我们在标量内核中执行的线程数的一半。所有其他指令都是相同的。但是,需要注意的是,执行的指令数量将减少一半,因为循环只执行了 N/2 次。

2022-11-25 15:13:03 947

原创 生成voxel——spconv源码剖析(六)

是一个只包含头文件的轻量级库,可以通过它实现。的优点是API比较简单且对。直接看代码,有详细的注释。调用时,将调用该函数。

2022-11-24 20:52:28 2017 1

原创 TensoRT API自定义trt网络结构

若使用tensorrt加载wts格式,需将模型训练的pt、pth、ckpt等格式权重转换为wts。

2022-11-24 09:24:20 572 2

原创 3d稀疏卷积——spconv源码剖析(五)

下面介绍了根据构建的Rulebook执行具体稀疏卷积计算,继续看类。PyTorch` 会自动调度该函数,合适地执行前向和反向计算。SubMConvFunction的前向传播forward调用。在前向推理或者反向传播时的调度,使用。类有一个很好的性质:如果它定义了。把这个调用方法取了一个更简短的别名。的一个方法,这个方法完成了。函数不太“美观”,这里用。算子时,我们可以忽略。对象辗转还是会继续调用。来封装算子的底层调用。扩充:对模型部署来说,的实现细节,而只通过。这个接口来访问算子。

2022-11-22 14:39:27 751

原创 3d稀疏卷积——spconv源码剖析(四)

对于counter变量含义可以参考注释代码,如哪些些地方理解有误,也麻烦大家指出来。作用根据输入点计算输出哈希表和输出所用到的卷积核权重的位置,同时返回有效输出个数。我们继续看普通稀疏卷积RuleBook的建立过程,返回。卷积为例:给定输入点的输出点取决于内核大小。直接看下列代码,注释比较详细了。函数的普通3D稀疏卷积部分。普通3d稀疏卷积调用。

2022-11-21 20:10:14 428

原创 3d稀疏卷积——spconv源码剖析(三)

注册的算子可以通过torch.xxx或者tensor.xxx的方式进行调用,该方式同样与pytorch源码解耦,增加和修改算子不需要重新编译pytorch源码。用该方式注册一个新的算子,流程非常简单:先编写C++相关的算子实现,然后通过pytorch底层的注册接口(torch::RegisterOperators),将该算子注册即可。逻辑部分,并且子流行3d稀疏卷积和正常3d稀疏卷积分开讨论,优先子流行3d稀疏卷积。用于保存卷积核每一个位置上的总的计算的次数,这里分配理论最大的内存,它的。

2022-11-19 16:35:21 1793 1

原创 3d稀疏卷积——spconv源码剖析(二)

本文基于OpenPCDet框架中算法,对spconv库中稀疏卷积源码进行剖析:首先看OpenPCDet下的​。package`目录下有__init__.py 文件,在导入spconv时__init__.py中的可执行代码会被执行在导入完spconv后,可以直接使用等子模块__init__.py是Python中package的标识,定义了包的属性和方法__在__init__.py中定义了3d稀疏卷积的核心数据结构,但是本身并不是一个,只是对稀疏Tensor的一个抽象。

2022-11-19 16:27:04 2325 2

原创 3d稀疏卷积——spconv源码剖析(一)

和对应上图的Hash_in,和Hash_out。对于是下标,key_ in表示value在中的位置。现在的input一共两个元素P1和P2,P1在的(2, 1)位置,P2在的(3,2)的位置,并且是YX顺序。这里只记录一下p1的位置 ,先不管p1代表的数字把这个命名为。input hash tabel的构建完成了,接下来构建 output hash table。用一个kernel去进行卷积操作:但是,并不是每次卷积kernel都可以刚好碰到P1。所以,从第7次开始,输出的这个矩阵就不再变化了。

2022-11-14 10:33:38 3377 1

原创 CUDA动态并行实现快速排序

排序是任何应用的基本构造块的关键算法之一。有许多排序算法已经被广泛研究。,常见的排序算法时间和空间复杂度如下:一些排序算法属于分治算法的范畴。这些算法适用于并行性,并适合 GPU 等架构,在这些架构中,要排序的数据可以被划分进行排序。快速排序就是这样一种算法。如前所述,Quicksort 属于“分而治之”的范畴。与其他排序算法(如需要额外存储的合并排序)相比,快速排序的内存负载和要求更低。快速排序的更实际的实现使用随机化版本。随机化版本的预期时间复杂度为O(nlogn)。

2022-11-02 12:34:41 2388 5

原创 模型部署——CenterPoint转ONNX(自定义onnx算子)

4.torch stack算子 onnx不支持,导出onnx计算图很,将stack和后续PointPillarScatter转换一起定义为ScatterBevPlugin算子,自定义onnx节点和自定义TensorRT算子来实现。2.torch_scatter的scatter_mean和scatter_max onnx不支持,人为自定义onnx节点,后续并自定义tensorRT的scatter_mean和scatter_max算子。

2022-10-27 09:17:55 3066 15

原创 onnx_graphsurgeon修改onnx计算图

shape (Sequence[Union[int, str]]) :张量的形状,如果模型使用尺寸参数,则可能包含字符串。方便函数,用于获取此张量的输入节点之一的输入张量。producer_idx(int):如果张量有多个生产者,则输入张量的生产者节点的索引,默认为0。注:此处的“空”是指张量的名称,对于可选张量,省略了该名称,而不是张量的形状。tensor_idx(int):输入节点的输入张量的索引,默认为0。方便函数,用于获取此张量的输出节点之一的输出张量。制作此张量的浅拷贝,省略输入和输出信息。

2022-10-21 22:47:36 3222 1

原创 模型部署——pointpillars转一个onnx

在torch和onnx精度对齐过程中发现,scatterND reshape输出值,有部分为nan,影响后续计算,决定认为将值为nan替换为0,可以在onnx图中看出多了isnan和where节点。本文转的onnx是静态的,也可以将voxel个数改为动态输入。

2022-10-07 21:26:53 1773 12

原创 KL散度理解

相对熵(relative entropy),又被称为Kullback-Leibler散度(Kullback-Leibler divergence)或信息散度(information divergence),是两个概率分布(probability distribution)间差异的非对称性度量。在信息理论中,相对熵等价于两个概率分布的信息熵(Shannon entropy)的差值。KL散度的定义:一个随机变量X的可能值为Xx1​x2​...xn​,对应的概率为pi​pXx。

2022-09-20 13:31:29 249

原创 模型部署——onnx定义、读写和调试

尝试完全用 ONNX 的 Python API 构造一个描述线性函数 output=a*x+b 的 ONNX 模型。我们将根据上面的结构,自底向上地构造这个模型。首先,我们可以用 helper.make_tensor_value_info 构造出一个描述张量信息的 ValueInfoProto 对象。如前面的类图所示,我们要传入张量名、张量的基本数据类型、张量形状这三个信息。在 ONNX 中,不管是输入张量还是输出张量,它们的表示方式都是一样的。

2022-09-18 14:03:30 2538 1

原创 模型部署——融合BN和Conv层

今天我们将尝试了解如何使我们的模型在推理上更快一点。使用 Batch Normalization 作为提高泛化能力的一种方式浪费了大量的网络。但是在推理过程中,批量归一化被关闭,而是使用近似的每通道均值和方差。很酷的是,我们可以通过 1x1 卷积实现相同的行为。更好的是,我们可以将它与前面的卷积合并。

2022-09-14 15:23:45 1172

原创 内存池autobuffer

【代码】内存池autobuffer。

2022-09-09 22:05:38 277

原创 CenterPoint论文和代码解析

三维对象通常表示为点云中的 3D 框。这种表示模仿了基于图像的 2D 边界框检测,但也带来了额外的挑战。3D 世界中的对象不遵循任何特定的方向,基于框的检测器难以枚举所有方向或将轴对齐的边界框拟合到旋转的对象。在本文中,我们用点来表示、检测和跟踪三维物体。我们的框架 CenterPoint 首先使用关键点检测器检测对象的中心,然后回归其他属性,包括 3D 尺寸、3D 方向和速度。在第二阶段,它使用目标上的额外点特征来改进这些估计。在 CenterPoint 中,3D 对象跟踪简化为贪婪的最近点匹配。....

2022-08-24 19:01:34 2659

原创 cuda——nms

cuda——nms

2022-08-07 23:13:47 729

原创 基于单例模式的yaml参数配置

采用Meyers单例,简单编写文件参数配置库,支持多模块多个yaml参数配置。

2022-07-25 16:34:39 322

原创 激光雷达障碍物检测与追踪实战——cuda版欧式聚类

我实际测试过,cuda版本的欧式聚类耗时3ms左右,速度提升了10倍左右!直接看代码,注释很详细。

2022-07-15 17:10:22 1505 4

原创 apollo 7.0——工厂设计模式解析

代写!!!工厂方法是一种创建型设计模式,与简单工厂(Simple Factory)、抽象工厂(Abstract Factory)一并称为工厂模式,关于三者的区别可以概括为:应用:工厂方法模式的意义是定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类当中。核心工厂类不再负责产品的创建,这样核心类成为一个抽象工厂角色,仅负责具体工厂子类必须实现的接口,这样进一步抽象化的好处是使得工厂方法模式可以使系统在不修改具体工厂角色的情况下引进新的产品。在设计的初期,就考虑到产品在后期会进行扩展的情况下,可以使用工厂

2022-07-15 15:02:53 1025

地面分割方法:基于同心区域的区域地面分割和地面似然估计

地面分割方法:基于同心区域的区域地面分割和地面似然估计 ,并且提供了Ray Ground Filter和Ground Plane Fitting两种过滤方法与之对比

2022-04-07

CanDemo.zip

基于QT开发的毫米波雷达CAN上位机,可接受毫米波雷达数据帧地址,并解析数据。我用Qt5.9 MSVC2017能正常运行

2019-06-04

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除