![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
点云处理
文章平均质量分 73
昌山小屋
917
展开
-
【点云处理】点云法向量估计及其加速(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 · 1953 阅读 · 2 评论 -
【点云处理】点云法向量估计及其加速(4)
我们应该注意到,k近邻搜索这一步我们只是简简单单使用了一个for循环进行逐个点云的搜索,完全没有考虑到这一查找过程的可并行性,所以这里我们首先尝试使用多线程对这一过程进行提速。当我们考虑多线程时可以使用boost::thread库或者自从C++ 11开始支持的std::thread,也可以使用操作系统相关的线程API,如在Linux上,可以使用pthread库。它的好处是跨平台,使用简单。编译器会创建一个包含N(在运行时决定,通常为服务器的逻辑核数)个线程的先成组,由他们来并行地运行后面的for语句块。原创 2022-11-26 15:30:06 · 1990 阅读 · 0 评论 -
【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 · 851 阅读 · 0 评论 -
【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 · 1399 阅读 · 0 评论 -
【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 · 2550 阅读 · 0 评论 -
【点云处理】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 · 1337 阅读 · 6 评论 -
【点云处理】点云法向量估计及其加速(3)
接上篇)。在上一篇文章中,我们直接使用pcl的NormalEstimation和NormalEstimationOMP来计算点云表面法向量都存在明显的效率问题。其中NormalEstimation没有用到多核多线程性能自然低,但NormalEstimationOMP使用到了多核多线程也并没有取得加速效果。纵观点云法线的计算过程,耗时主要几种在两处运算。一个是计算每一个点云的K近邻,另一处就是紧接着的计算法向量。原创 2022-10-07 23:16:34 · 2671 阅读 · 3 评论 -
【点云处理】点云法向量估计及其加速(2)
在上一篇文章【点云处理】点云法向量估计及其加速(1)中我们为点云表面法线计算作了理论铺垫,从这一篇开始结合示例代码实际体验点云法线的计算过程,以及在加速方面进行一些尝试。原创 2022-10-07 14:32:15 · 1315 阅读 · 0 评论 -
【点云处理】点云法向量估计及其加速(1)
点云法向量是3D点云一个极其重要的几何表面特征,众多的点云处理算法都依赖精确的法向量估计,例如点云分割,点云去噪等。在自动驾驶领域,面对特殊场景我们主要依赖点云法向量进行场景分割。估计点云法向量需要得到该点的邻域内点,根据邻域内点估计出平面及法向量。在众多法向量估计方法中,基于局部表面拟合法使用最为广泛,原理简单,计算效率较高。原创 2022-10-04 16:03:06 · 2015 阅读 · 0 评论 -
【点云处理】Lidar点云障碍物形状估计(1)
简单起见,我们只考虑偏航角(Yaw),忽略俯仰和翻滚角,这也符合自动驾驶场景中对一般障碍物的设定。这里有一个疑点就是,minAreaRect是如何定义的矩形框的宽(width)高(height)?旋转的角读范围为[-90,0),你没有看错,角度就是负的。这个理解没有错,前提是搞对坐标轴的定义,因为你有可能是照下图理解的,这个就有问题。以上图为例,橙色3D框内的卡车是我们待估计的点云簇,通过minAreaRect函数可得到该簇在2D平面上的最小外接矩形的中心(x,y),宽,高以及 旋转角度。原创 2022-09-24 16:18:55 · 1356 阅读 · 2 评论 -
【模型加速】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 · 4941 阅读 · 6 评论 -
【模型加速】CUDA-Pointpillars项目解读(1)
本文主要是在官方给出的技术博客使用NVIDIA CUDA-Pointpillars检测点云中的对象的基础上结合自己的使用体验做一些扩展说明。在以往的模型部署操作中,我们习惯于将训练好的诸如Pytorch模型直接导出为onnx,再通过TensorRTAPI或者trtexe等工具将onnx序列化为TensorRT引擎文件。之后,加载引擎文件进行推理加速。但是,对于点云3D检测模型pointpillars而言,这样做存在若干障碍。首先,不同于图像这类结构化数据,点云在送入网络之前需要经过相对复杂的预处...原创 2022-03-29 19:50:26 · 5481 阅读 · 24 评论 -
【点云处理】Jetson平台pcl计算全局点云k近邻
传统激光点云聚类算法如欧式聚类、区域生长等都需要获取点云的邻域信息,PCL中提供了KD树来进行点云的邻域搜索。最近的工作需要在Jetson agx xavier平台上完成,訪平台性能规格参数如下:部分工作需要一个高效的全局点云k近邻查找算法,也就基于訪平台做了一些研究和实验,在此记录下来。这里使用pcl自带的kdtree来构造全局点云的k近邻表,并测试其性能表现,核心代码如下:#include <chrono>#include <pcl/point_ty...原创 2021-12-07 23:14:06 · 560 阅读 · 0 评论 -
【点云处理】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 · 2993 阅读 · 4 评论 -
【点云处理】LeGO-LOAM在robosense激光雷达上的地面点云分割实验
LeGO-LOAM是一种激光雷达SLAM算法,算法在软件架构上分为5个流程,分别是: 分割聚类:这部分主要操作是分离出地面点云;同时,对剩下的点云进行聚类,剔除噪声(数量较少的点云簇,被标记为噪声); 特征提取:对分割后的点云(排除地面点云部分)进行边缘点和面点特征提取; Lidar里程计:在连续帧之间(边缘点和面点)进行特征匹配找到连续帧之间的位姿变换矩阵; Lidar Mapping:对特征进一步处理,然后在全局的 Point Cloud Map 中进行配准;...原创 2021-12-04 10:41:24 · 2874 阅读 · 1 评论 -
【可视化】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 · 1571 阅读 · 1 评论 -
【可视化】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 · 1138 阅读 · 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 · 475 阅读 · 0 评论 -
【模型加速】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 · 1123 阅读 · 1 评论 -
【模型加速】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 · 900 阅读 · 0 评论 -
【模型加速】PointPillars模型TensorRT加速实验(5)
MFN转TensorRT引擎MFN CPU推理MFN GUDA InferenceRPN ONNX-TensorRT InferenceFPN TensorRT InferenceRPN TensorRT InferenceAfter-Process原创 2021-08-01 15:38:26 · 1435 阅读 · 0 评论 -
【模型加速】PointPillars模型TensorRT加速实验(3)
在上一篇PointPillars模型加速实验(2)中,我们成功将PFN导出dynamic shape onnx,接下来要将MFN也导出dynamic shape onnx。MFN导出Dynamic Shape ONNX 虽然叫做MFN(Middle Feature Extractor Network),具体到PointPillars中,实际上主要是一个scatter操作。借助PointPillars的源代码简单回顾一下MFN的内容。 class P...原创 2021-07-25 23:01:58 · 1440 阅读 · 7 评论 -
【模型加速】PointPillars模型TensorRT加速实验(4)
接上一篇文章PointPillars模型加速实验(3),到目前为止我们已经成功的将PointPillars网络部分的3大组件PFN,MFN和RPN分别导出了onnx。接下来要将onnx文件build成TensorRT engine并序列化到文件中。对于一般的网络,onnx模型转TensorRT还是比较容易的,目前TensorRT官方对onnx模型的支持是最好的。官方的转换工具TensorRT Backend For ONNX(简称ONNX-TensorRT)也比较成熟了,最新版本已经到8.0.1....原创 2021-07-25 23:02:39 · 3206 阅读 · 2 评论 -
【模型加速】PointPillars模型TensorRT加速实验(2)
PFN导出Dynamic Shape ONNX 在上一篇文章中讲到通过make_input函数,已经准备好了模型转化所需要的输入数据。现在先考虑将PFN(Pillar Feature Network)结构转换为onnx。因为不同点云帧的点云数量是变化的,非空Pillar的数量自然也是不同的,在考虑将PFN导出onnx模型时需要采用dynamic shape。什么意思呢?就是在将PyTorch模型转成onnx模型的时候,根据输入数据的尺寸是否固定,将onnx分成static shape和d...原创 2021-07-25 23:00:06 · 1583 阅读 · 2 评论 -
【模型加速】PointPillars模型TensorRT加速实验(1)
在阅读这个系列文章之前假定你已经对PointPillars算法本身有一定的了解,并且有一个可用的Pytorch模型。这里的加速实验主要还是遵循"Pytorch-->ONNX-->TensorRT引擎-->推理"这一思路,暂不涉及使用TensorRT API手动搭建网络。 实验环境系统,Ubuntu16.04 内核,Linux version 4.15.0-112-generic CUDA,10.2 Python, 3.6 Pytorch,1.4.0 ...原创 2021-07-25 22:56:46 · 3365 阅读 · 4 评论 -
【玩转PointPillars】PillarScatter操作
ing....原创 2021-07-18 08:59:51 · 2885 阅读 · 2 评论 -
【玩转PointPillars】点云特征提取结构PFN(PillarFeatureNet)
class PFNLayer(nn.Module): def __init__(self, in_channels, out_channels, use_norm=True, last_layer=False): """ Pillar Feature Net Layer. The Pillar Fea...原创 2021-07-17 21:00:04 · 4156 阅读 · 7 评论 -
【点云处理】c++读取rosbag并转pcd和bin文件
【代码】#include <ros/ros.h>#include <pcl/point_cloud.h>#include <sensor_msgs/PointCloud2.h>#include <pcl_conversions/pcl_conversions.h>#include <pcl/point_types.h>#include <string>#include <stdlib.h>#inc...原创 2021-07-07 16:26:56 · 4624 阅读 · 13 评论 -
【点云处理】图达通激光点云数据转换
刚刚拿到一批图达通雷达的激光点云数据的rosbag,准备拿去做3D目标的标注。播出来看了一眼,发现点云的坐标轴的设定与我们平常使用的坐标轴设定还不太一样。下图(1)是我直接通过rviz看到的点云图像,这样看你很难看出来是个什么东西。真实的图像应该是图(2)的样子,这样路面和山坡就看的比较清晰了。图1图(2)好了,现在就是要做一个坐标转换,转换到我们熟悉的坐标轴定义下。【代码】#include <ros/ros.h>#include <pcl/po...原创 2021-07-05 14:24:49 · 1208 阅读 · 2 评论 -
【玩转PointPillars】虚拟环境中import tensorrt报错
TensorRT是由C++、CUDA、python三种语言编写成的一个库,其中核心代码为C++和CUDA,Python端作为前端与用户交互。当然,TensorRT也是支持C++前端的,如果我们追求高性能,C++前端调用TensorRT是必不可少的。导入tensorrt报错(pointpillars) zuosi@node8:~$ ipythonPython 3.6.10 |Anaconda, Inc.| (default, May 8 2020, 02:54:21) Type 'copy原创 2021-06-29 21:22:46 · 1071 阅读 · 0 评论 -
【玩转PointPillars】kitti数据集中有关标定的若干问题
传感器外部布局Cam0 左边灰度相机 Cam1 右边彩色相机 Cam2 左边灰度相机 Cam3 右边彩色相机 Velodyne laserscanner Velodyne64线激光雷达 标定参数标定文件P0: 7.070493e+02 0 6.040814e+02 0 0 7.070493e+02 1.805066e+02 0 0 0 1.e+00 0P1: 7.070493e+02 0 6.040814e+02 -3.797842e原创 2021-06-21 15:45:45 · 827 阅读 · 3 评论 -
【玩转PointPillars】Ubuntu18.04上部署nutonomy/second.pytorch
【我的环境】Ubuntu18.04cuda10.2GeForce GTX 1650原创 2021-06-19 08:40:54 · 2628 阅读 · 19 评论 -
【论文解读】点云深度学习网络PointNet
点云数据天然的存在无序性,直接将用于图像的网络结构用于点云效果很差。有一些研究将点云空间进行划分成规则的3D体素网格,再使用3D卷及等方式来进行处理。而PointNet这篇原创 2021-06-18 11:11:35 · 924 阅读 · 1 评论 -
【玩转PointPillars】Ubuntu18.04上部署second
(base) ➜ ~ conda create -n second python=3.6(base) ➜ ~ conda activate second原创 2021-06-17 17:07:45 · 1115 阅读 · 1 评论 -
【点云处理】CropBox过滤指定立方体内的点云
之前为了剔除地面点,计算了全部点云的法向量。然后,先通过点云的法向量做一个粗过滤,剔除明显的非地面点,再通过随机采样一致性算法估算出地面方程。计算全部点云的法向量相对是比较耗时的操作,大部分的点一开是就对我们最后估算地平面方程没有什么用,所以先通过CropBox做一个立方体过滤,只保留对我们有意义的点。【代码】#include <ros/ros.h>#include <sensor_msgs/PointCloud2.h>#include <pcl/poin...原创 2021-06-07 08:50:51 · 2375 阅读 · 9 评论 -
【点云处理】结合点云法线以及RANSAC分离地面点后再做欧式聚类
这篇实验是在上一篇ros点云处理学习(5):点云法线联合随机采样一致性(RANSAC)分割地面点的基础上做的原创 2021-05-28 00:43:33 · 844 阅读 · 7 评论 -
【点云处理】点云法线联合随机采样一致性(RANSAC)分割地面点
在之前的代码中尝试直接使用随机一致性采样来分割地面点,但是在我的实验环境下效果很差,始终没有找到地表这个平面。这里尝试一种新思路,计算点云的法线。因为地面点云的法线z值较高,通过阈值先过滤出非地面点云,再对剩下的点云进行随机一致性采样得到地面点云。【代码】#include <pcl/segmentation/sac_segmentation.h>#include <pcl/segmentation/extract_clusters.h>#includ...原创 2021-05-28 00:22:03 · 1327 阅读 · 0 评论 -
【点云处理】pcl中使用欧式聚类
今天尝试跑一下欧式聚类,看看在路侧场景下的聚类效果。【代码】#include <stdlib.h>#include <boost/bind.hpp>#include <ros/ros.h>#include <sensor_msgs/PointCloud2.h>#include <functional>#include <pcl/point_types.h>#include <pcl_conve...原创 2021-05-26 23:48:57 · 2178 阅读 · 2 评论 -
【点云处理】使用RANSAC分割地面点
谈谈这个方法实验完的感受,在我的实验场景下至少我觉得没法分离开地面点的。我用的是Horizon的雷达,而且不是水平安装,而是像下倾斜与地面有一个30度左右的夹角。#include <stdlib.h>#include <boost/bind.hpp>#include <ros/ros.h>#include <sensor_msgs/PointCloud2.h>#include <functional>#include...原创 2021-05-25 23:59:29 · 1835 阅读 · 2 评论 -
【点云处理】使用pcl内置的Voxel Grid Filter对原始点云进行降采样
该节点会订阅"/livox/lidar"话题的点云数据,使用PCL内置的Voxel Grid Filter对点云数据进行降采样,过滤后的结果发布到"filtered_points"上。#include <iostream>#include <thread>#include <sstream>#include <pcl/point_types.h>#include <pcl_conversions/pcl_conversio...原创 2021-05-22 21:32:30 · 1528 阅读 · 0 评论