自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

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

原创 【多模态融合】TransFusion学习笔记(2)

接上篇【,在聊完了TransFusion-L的基本实现之后,再来结合图像融合阶段理解TransFusion整体框架。

2023-10-05 13:09:13 682

原创 【多模态融合】TransFusion学习笔记(1)

工作上主要还是以纯lidar的算法开发,部署以及系统架构设计为主。对于多模态融合(这里主要是只指Lidar和Camer的融合)这方面研究甚少。最近借助和朋友们讨论论文的契机接触了一下这方面的知识,起步是晚了一点,但好歹是开了个头。下面就借助TransFusion论文及其开源代码来串一串这方面的知识。这个很好理解,参考FPointNet网络图示。就是利用现有的2D检测器在图像上提取2D初始框,根据Camera成像原理,捕获2D框视锥内的点云,再利用点云分类模型(如:PointNet)做进一步分类。

2023-10-03 23:37:59 1156

原创 【点云处理】点云法向量估计及其加速(5)

中我们尝试对pcl自带的KDTree的k近邻搜索过程使用OpenMP加速,但是结果不太理想。在这篇文章中我们暂时放弃pcl自带的KDTree,转而使用另一大杀器nanflann库提供的KDTree。nanoflann是一个c++11标准库,用于构建具有不同拓扑(R2,R3(点云),SO(2)和SO(3)(2D和3D旋转组))的KD树。nanoflann不需要编译或安装,你只需要在你的代码中加入#include 即可方便快捷地使用它。尽管没有并行,造成单核几乎被打满。

2022-11-26 19:03:35 1826 2

原创 【点云处理】点云法向量估计及其加速(4)

我们应该注意到,k近邻搜索这一步我们只是简简单单使用了一个for循环进行逐个点云的搜索,完全没有考虑到这一查找过程的可并行性,所以这里我们首先尝试使用多线程对这一过程进行提速。当我们考虑多线程时可以使用boost::thread库或者自从C++ 11开始支持的std::thread,也可以使用操作系统相关的线程API,如在Linux上,可以使用pthread库。它的好处是跨平台,使用简单。编译器会创建一个包含N(在运行时决定,通常为服务器的逻辑核数)个线程的先成组,由他们来并行地运行后面的for语句块。

2022-11-26 15:30:06 1884

原创 【OpenPCDet】稀疏卷积SPConv-v1.2代码解读(5)

cuda部分的计算逻辑这里分成两步,先调用create_conv_indice_pair_p1_cuda(...)函数,再调用create_conv_indice_pair_p2_cuda(...)函数。则每一行表示一个输出位置i,out[i][0]...out[i][NDim-1]存储第i个输出位置的索引。这里计算各个维度上的输出的边界值[lower,upper],他们是根据给定的参数信息使用公式推导出来的理论值。这里还没有做进一步的越界检查的,后面的代码会做进一步的处理。

2022-11-10 17:33:20 748 2

原创 【OpenPCDet】稀疏卷积SPConv-v1.2代码解读(4)

对于子流行稀疏卷积来说,kernel中心的元素一定会和输入中的每一个有效(active)元素进行一次运算,所以在第15行直接对indiceNum中中心位置的地址赋值为numActIn。第24行计算出当前卷积核内的偏移,以3x3x3(K0=3,K1=3,K2=3)3D卷积核为例,offset从0~26,但是代码25行规定当offset > center(13)时continue,所以offset实际只计算到13。第19,21,23行3层for循环对应卷积核3个维度D,H和W,大小分别为K0,K1和K2。

2022-11-04 23:17:27 778

原创 【OpenPCDet】稀疏卷积SPConv-v1.2代码解读(3)

在src/spconv/all.cc文件中通过Pytorch提供的OP Register(算子注册的方式)对底层c++ api进行了注册,所以这里实际调用的是src/spconv/spconv_ops.cc文件种的getIndicePairs函数。indiceNum用于保存卷积核每一个位置上的总的计算的次数,因为是稀疏卷积所以卷积核上每一个元素和有效数据的运算次数可能是不同的。本质上来说就是一个表。再将输入、输出的哈希表中的序号建立起联系,这样就可以基本实现稀疏卷积,因此这也是稀疏卷积实现的关键。

2022-11-03 23:40:16 1267

原创 【OpenPCDet】稀疏卷积SPConv-v1.2代码解读(2)

在上一篇文章里分别展示了spconv源码中的Python和c++/cuda目录,这里再来看一下spconv编译安装完后的目录结构。当我们 在Second代码中import spconv就是在导入安装好的spconv package。既然是package,那就必然有文件,别且在导入spconv时__init__.py中的可执行代码会被执行。

2022-11-01 23:19:13 2311

原创 【OpenPCDet】稀疏卷积SPConv-v1.2代码解读(1)

以下左图展示了一个2D卷积,使用一个3x3的卷积核,在单通道图像上进行卷积,其中Padding为1,得到输出。右图为一个单通道的3D卷积,与2D卷积不同之处在于,输入图像多了一个 depth 维度,卷积核也多了一个depth维度,之前2D卷积上3x3的卷积核现在变成了3x3x3。这里的3D不是通道导致的,而是深度(多层切片,多帧视频),因此,虽然输入和卷积核和输出都是3D的,但都可以是单通道的。

2022-10-30 23:48:06 2200

原创 【点云处理】Lidar点云障碍物形状估计(2)

讲到使用OpenCV自带的minAreaRect来估计点云的2D形状,这篇文章再来谈谈目前应用也比较多的基于L-Shape的形状估计。L-Shape算法出自论文《Effificient L-Shape Fitting for Vehicle Detection Using Laser Scanners》,在L-Shape方法中将形状估计问题作为一个优化问题来研究,提出了一种高效的基于搜索的优化方法。矩形的可能方向θ从0°到90°不等,因为矩形的两边是正交的,我们只关心介于0°到90°之间的单条边;

2022-10-08 21:01:03 1204 6

原创 【点云处理】点云法向量估计及其加速(3)

接上篇)。在上一篇文章中,我们直接使用pcl的NormalEstimation和NormalEstimationOMP来计算点云表面法向量都存在明显的效率问题。其中NormalEstimation没有用到多核多线程性能自然低,但NormalEstimationOMP使用到了多核多线程也并没有取得加速效果。纵观点云法线的计算过程,耗时主要几种在两处运算。一个是计算每一个点云的K近邻,另一处就是紧接着的计算法向量。

2022-10-07 23:16:34 2328 3

原创 【点云处理】点云法向量估计及其加速(2)

​在上一篇文章【点云处理】点云法向量估计及其加速(1)中我们为点云表面法线计算作了理论铺垫,从这一篇开始结合示例代码实际体验点云法线的计算过程,以及在加速方面进行一些尝试。​

2022-10-07 14:32:15 1183

原创 【点云处理】点云法向量估计及其加速(1)

点云法向量是3D点云一个极其重要的几何表面特征,众多的点云处理算法都依赖精确的法向量估计,例如点云分割,点云去噪等。在自动驾驶领域,面对特殊场景我们主要依赖点云法向量进行场景分割。估计点云法向量需要得到该点的邻域内点,根据邻域内点估计出平面及法向量。在众多法向量估计方法中,基于局部表面拟合法使用最为广泛,原理简单,计算效率较高。

2022-10-04 16:03:06 1867

原创 【OpenPCDet】PointPillars模型中的角度和方向损失?

关于PointPillars模型的损失,其沿袭了SECOND的做法。在类别分类损失和box回归损失的同时还包含角度损失和方向损失。PointPillars中角度的编码使用真实值和Anchor的残差。但是再使用SmoothL1计算具体损失时会先计算出残差的sin值,再使用sin值来计算损失。

2022-09-26 11:56:26 747

原创 【点云处理】Lidar点云障碍物形状估计(1)

简单起见,我们只考虑偏航角(Yaw),忽略俯仰和翻滚角,这也符合自动驾驶场景中对一般障碍物的设定。这里有一个疑点就是,minAreaRect是如何定义的矩形框的宽(width)高(height)?旋转的角读范围为[-90,0),你没有看错,角度就是负的。这个理解没有错,前提是搞对坐标轴的定义,因为你有可能是照下图理解的,这个就有问题。以上图为例,橙色3D框内的卡车是我们待估计的点云簇,通过minAreaRect函数可得到该簇在2D平面上的最小外接矩形的中心(x,y),宽,高以及 旋转角度。

2022-09-24 16:18:55 1269 2

原创 【模型加速】自定义TensorRT NMS3D插件(2)

添加自定义TensorRT插件 TensorRT的NMS Plugin在官网已有开源,但不符合我本次实验的需求,所以还得再自定义TensorRT Plugin。随着tensorRT的不断发展(v5->v6->v7),TensorRT的插件的使用方式也在不断更新。插件接口也在不断地变化,由v5版本的IPluginV2Ext,到v6版本的IPluginV2IOExt和IPluginV2DynamicExt。添加自定义TensorRT Plugin的方式有多种,以Tens...

2022-04-10 17:20:56 1535

原创 【模型加速】自定义TensorRT NMS3D插件(1)

需求是这样的,在做PointPillars模型的加速的时候我注意到网络的检测头部分小型操作很多,加速效果不明显。此外,3D检测模型的NMS部分通常是作为后处理的一部分来单独实现,TensorRT并没有直接支持3D NMS的导出。本着学习的目的,我将PointPillars模型中的检测头(单头)和3D NMS两部分合并到一个TensorRT Plugin,实现端到端的推理。其最终效果如下右图所示,自定义的NMS3D Plugin包含了整个后处理部分。如何在onnx的输出后面增加NM...

2022-04-09 15:50:44 1265

原创 【模型加速】CUDA-Pointpillars项目解读(3)

后处理 接上篇【模型加速】CUDA-Pointpillars项目解读(2),就PointPillars而言神经网络部分的耗时相对较少,时间消耗主要在后处理部分。PointPillars检测头输出3路信息,分别是类别置信度(cls_prds),带编码的3D框回归值(box_preds)和方向(dir_cls_preds)。这3路输出信息结合设定的anchors生成真实的预测框(box_preds)和类别置信度(cls_preds),再送入NMS。解码的过程包虽不复杂,但包含一系列细小的操作。

2022-04-02 23:39:30 2312 5

原创 【模型加速】CUDA-Pointpillars项目解读(2)

用于TensorRT的ONNX模型 接上篇【模型加速】CUDA-Pointpillars项目解读(1),预处理之后输出pillar points bev特征图以及pillar coords。其size分别为(MAX_VOXELS,32,10)和(MAX_VOXELS,4)。原始的pointpillars网络结构中,预处理之后的pillar points bev要经过以下一系列操作(PointNet -> MaxPooling->)后送入Scatter层生成伪图像。在...

2022-03-29 22:54:45 4812 6

原创 【模型加速】CUDA-Pointpillars项目解读(1)

本文主要是在官方给出的技术博客使用NVIDIA CUDA-Pointpillars检测点云中的对象的基础上结合自己的使用体验做一些扩展说明。在以往的模型部署操作中,我们习惯于将训练好的诸如Pytorch模型直接导出为onnx,再通过TensorRTAPI或者trtexe等工具将onnx序列化为TensorRT引擎文件。之后,加载引擎文件进行推理加速。但是,对于点云3D检测模型pointpillars而言,这样做存在若干障碍。首先,不同于图像这类结构化数据,点云在送入网络之前需要经过相对复杂的预处...

2022-03-29 19:50:26 5081 24

原创 【模型转换】onnx删除并新增节点

仍然以【模型转化】修改onnx节点属性这篇文章中的例子为例来学习onnx的基本操作。这次不再修改Squeeze节点的属性(attribute),而是删除原有Squeeze节点,再在原来位置添加一个新的Squeeze节点。1.定位要操作的节点import onnx ...

2022-03-28 22:16:03 5536 2

原创 【模型转化】修改onnx节点属性

在之前的一篇文章【模型转换】onnx转tensorrt报错:Attribute not found: axes中提到squeeze操作在不明确指定axes参数时onnx转tensorrt会报错。解决办法也很简单,因为我是先将pytorch转onnx,再转的tensorrt。pytorch网络结构中,给squeeze操作指定好axes参数再重新生成onnx即可。实际上我们还可以借助onnx的helper功能直接修改onnx节点属性来解决这个问题。 例如,我要将卷积层的输出[1x64x...

2022-03-28 15:25:02 7377 3

原创 【CUDA基础练习】向量内积计算的若干种方法

【显卡】GeForce GTX 1650 显卡 | NVIDIAGeForce GTX 1650 显卡拥有突破性的图形性能,能为热门游戏带来加速的游戏体验。https://www.nvidia.cn/geforce/graphics-cards/gtx-1650/Device0:"GeForce GTX 1650"Total amount of global memory 4101898240 bytesNumber of mltiprocessors ..

2021-12-18 13:34:04 1687

原创 【点云处理】Jetson平台pcl计算全局点云k近邻

传统激光点云聚类算法如欧式聚类、区域生长等都需要获取点云的邻域信息,PCL中提供了KD树来进行点云的邻域搜索。最近的工作需要在Jetson agx xavier平台上完成,訪平台性能规格参数如下:部分工作需要一个高效的全局点云k近邻查找算法,也就基于訪平台做了一些研究和实验,在此记录下来。这里使用pcl自带的kdtree来构造全局点云的k近邻表,并测试其性能表现,核心代码如下:#include <chrono>#include <pcl/point_ty...

2021-12-07 23:14:06 517

原创 【点云处理】CUDA-PCL 1.0在robosense激光雷达上的地面点分割实验

CUDA PCL 1.0是基于CUDA开发的点云处理库,目前为止提供了5个库:cluster、octree、ICP、segmentation和filter。本文只实验segmentation库在Robosense激光雷达下的地面分效果。关于雷达的基本信息如下图所示。我所用的实验平台是Nvidia Jetson AGX Xavier。PCL-CUDA 1.0中地面分割目前还只支持SAC_RANSAC + SACMODEL_PLANE方式,也就是RANSAC加地平面方程的形式...

2021-12-04 16:40:28 2920 4

原创 【点云处理】LeGO-LOAM在robosense激光雷达上的地面点云分割实验

LeGO-LOAM是一种激光雷达SLAM算法,算法在软件架构上分为5个流程,分别是: 分割聚类:这部分主要操作是分离出地面点云;同时,对剩下的点云进行聚类,剔除噪声(数量较少的点云簇,被标记为噪声); 特征提取:对分割后的点云(排除地面点云部分)进行边缘点和面点特征提取; Lidar里程计:在连续帧之间(边缘点和面点)进行特征匹配找到连续帧之间的位姿变换矩阵; Lidar Mapping:对特征进一步处理,然后在全局的 Point Cloud Map 中进行配准;...

2021-12-04 10:41:24 2749 1

原创 【OpenPCDet】解读代码中3d anchor的生成逻辑

对于anchor-based模型来说,anchor无疑是模型设计中至关重要的一环。之前有了解过2d网络中anchor的生成逻辑,这次借助训练3D模型的机会来了解一下OpenPCDet中3d网络模型中anchor的生成逻辑。这里主要是通过解读models/dense_heads/target_assigner/anchor_generator.py中generate_anchors函数来了解这一过程。为方便理解代码中各种变量的具体含义,我准备了一个小型的配置文件。训练集中总共包含'Truck...

2021-11-21 23:02:40 1226 2

原创 【OpenPCDet】优化器之adam_oncycle

OpenPCDet到目前版本(v 0.3.0)为止集成的优化器有3种:adam,sgd和adam_onecyel。这个可见代码build_optimizer(model,optim_cfg)函数。def build_optimizer(model, optim_cfg): if optim_cfg.OPTIMIZER == 'adam': optimizer = optim.Adam(model.parameters(), lr=optim_cfg.LR, weight...

2021-11-21 23:01:32 3868 2

原创 GDB调试基本操作(Ing)

Q:修改CMakeLists.txt让编译出来的程序支持gdb调试?A:CMakeLists.txt中增加Debug选项;SET(CMAKE_BUILD_TYPE "Debug") SET(CMAKE_CXX_FLAGS_DEBUG "$ENV{CXXFLAGS} -O0 -Wall -g2 -ggdb")SET(CMAKE_CXX_FLAGS_RELEASE "$ENV{CXXFLAGS} -O3 -Wall")Q:带参数的程序如何调试?A:通过set args设置启动参数;(g

2021-09-07 22:33:03 251 2

原创 【可视化】rviz下的kitti数据集可视化(1)

标准3d box,不带旋转 for box_3d in boxes_3d[:1]: #corners_3d_box = boxes_to_corners_3d_cam2(*box_3d) h,w,l,x,y,z,yaw = box_3d x_corners = [l/2,l/2,-l/2,-l/2,l/2,l/2,-l/2,-l/2] y_corners = [0,0,0,0,-h,-h,-h,-h]

2021-09-05 14:29:54 1043 3

原创 【可视化】rviz下的kitti数据集可视化(2)

接上篇【可视化】rviz下的kitti数据集可视化(1)Rviz下绘制Velodyne雷达坐标系下的3D标注框 前文已经提到,KIITI中3D框是标注在参考相机(0号相机)坐标系下。为了能够在Velodyne激光雷达坐标系下通过标注数据绘制3D框,一方面是要涉及参考相机坐标系到Velodyne激光雷达坐标系之间的坐标转换(旋转+平移),另一方面还要注意标注数据中的rotate_y(ry)值。它表示在相机坐标系下,3D物体的全局方向角(物体前进方向与相机坐标系x轴的夹角),取值范围为:...

2021-09-05 14:29:48 1476 1

原创 【可视化】娱乐一下,rviz上画出目标物的轨迹

这个就比较简单了,借助于visualization_msgs::MarkerArray,我们可以一次行装载N个不同位置的标记物。然后将该消息发送出去,在rviz上形成一条轨迹。#include <ros/ros.h>#include <visualization_msgs/Marker.h>#include <visualization_msgs/MarkerArray.h>int main(int argc, char** argv) {...

2021-08-29 13:56:13 1286

原创 【可视化】娱乐一下,rviz上让目标转起来

【Rviz可视化】娱乐一下,rviz上画个3D框这篇文章画3D框的时候我回避了一个重要的东西,那就是标志物的姿态,这也是我们在做3D点云检测框展示的时候肯定要涉及到的一个问题。为了简单起见,我只考虑偏航角(yaw),而俯仰角(pitch)和翻滚角(roll)保持为0度,也就是只考虑目标绕Z轴旋转的情况。为了比较直观的展示标志物的偏转情况,在这里我设置两个箭头,红色箭头的yaw角在[0,PI]之间变化,绿色箭头yaw角在[0,-PI]之间变化,代码如下:#include "ro...

2021-08-29 13:44:29 753

原创 【可视化】娱乐一下,rviz上画个3D框

https://www.jianshu.com/p/acbe1b8631dc那么marker到底是什么呢?和它的名字一样,它就是一个用来标记的东西。如果我们给定marker一个position和orientation(位置和姿态),那么rviz就会在中间画图区域的指定位置生成一个指定方向的marker,这个marker可以是立方体,箭头等我们可以在程序中自行选择。如何给marker一个orientation和position那自然就是我们发布消息,marker接收消息,消息里面包含了marker的位置和

2021-08-29 11:59:45 5058

原创 【模型转换】onnx转tensorrt报错:Attribute not found: axes

terminate called after throwing an instance of 'std::out_of_range' what(): Attribute not found: axesAborted (core dumped) ##features = features.permute(0, 2, 1, 3).squeeze(3).squeeze(0).contiguous() features = features.squeeze...

2021-08-22 15:07:40 2727 3

原创 【环境配置】Ubuntu16.04上Anaconda简单部署OpenPCD

OpenPCD在Ubuntu16.04上的部署还是很友好的,不怎么需要折腾,这里简单记录一下。我的环境Ubuntu 16.04CUDA 10.2RTX 2080 GPU创建并激活虚拟环境使用conda创建python3.6的虚拟环境,环境名字自取,我就叫openpcd好了。conda create -n openpcd python=3.6 anaconda激活虚拟环境,后续的操作就都是在虚拟环境中进行了conda activate openpcd安装依赖...

2021-08-19 00:27:52 447

原创 【模型加速】PointPillars模型TensorRT加速实验(7)

按照【模型加速】PointPillars模型TensorRT加速实验(7)中给出的思路对已有的推理代码进行优化,简而言之就是保持数据在GPU显存中流动,尽量避免内存和显存之间的流动。PFN推理v2def pfn_inference(self,engine,inputs): if self.pfn_context is None: self.pfn_context = engine.create_execution_context() ...

2021-08-15 15:47:29 1075 1

原创 【TensorRT】execute_async VS execute_async_v2

https://docs.nvidia.com/deeplearning/tensorrt/api/python_api/infer/Core/ExecutionContext.htmlexecute_async(self: tensorrt.tensorrt.IExecutionContext, batch_size: int = 1, bindings: List[int], stream_handle: int, input_consumed: capsule = None)→ bo...

2021-08-14 16:01:51 4268 2

原创 【模型加速】PointPillars模型TensorRT加速实验(6)

在【模型加速】PointPillars模型TensorRT加速实验(5)文末给出的实验结果表明,当前针对PFN的TensorRT的加速方案是有缺陷的,相比直接使用Pytorch GPU推理非但没有达到理想的加速效果,反而是更慢了。当你把PFN推理代码中最核心的3个步骤的时间消耗都打印出来你可以明显的看到这样一个事实:主机内存和设备内存之间的数据拷贝耗时比你想象中的要大得多。#synct1 = time.time()for hdm in inputs_hdm:cuda.memcpy...

2021-08-14 15:20:13 866

原创 【模型加速】PointPillars模型TensorRT加速实验(5)

MFN转TensorRT引擎MFN CPU推理MFN GUDA InferenceRPN ONNX-TensorRT InferenceFPN TensorRT InferenceRPN TensorRT InferenceAfter-Process

2021-08-01 15:38:26 1366

搭建ZoneMinder视频监控系统可能需要到的perl的rpm包

ZoneMinder的搭建过程是需要利用到perl,而perl所需要的安装并不完全包含在系统linux的发布版中,需要到网上去找,这里搜集到一些在发布版中没有但搭建zm又需要乃至的一些包!

2012-04-27

nginx-1.0.8.tar.gz

nginx源码包!Nginx是一个高性能的 HTTP 和 反向代理 服务器,也是一个 IMAP/POP3/SMTP 代理服务器。

2012-03-15

空空如也

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

TA关注的人

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