自动驾驶环境感知之激光雷达物体检测算法

本文详细介绍了激光雷达在自动驾驶环境感知中的物体检测算法,包括点云数据库、基于点视图、俯视图和前视图的检测方法。点云数据的处理和不同视图的优缺点进行了比较,强调了多视图融合的重要性。文章讨论了PointNet、PointNet++、VoxelNet、SECOND、PIXOR等算法,并提出了融合俯视图和点视图的检测方法,如PointPillar和MV3D,强调了不同视图的互补性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言:视觉感知包括二维和三维视觉感知,其最终目的是为了获取三维世界坐标系下感兴趣的目标和场景的信息。单目相机下,需要几何约束或者海量数据来学习,以此来推测三维信息。双目相机下,可基于立体视觉原理来计算目标的深度信息,但在光照条件比较差或者纹理信息比较少的区域,很难找到匹配特征,因此深度估计效果会比较差,而且深度估计的精度会随着距离的增加会显著降低。相比于视觉系统间接推测三维信息,激光雷达可直接获取物体和场景的三维信息,因此激光雷达对于视觉传感器来说是一个很好的补充。

1. 激光雷达基础

(1)激光探测与测距系统(Light Detection And Ranging, LiDAR)

  • 激光波长
    • 905nm:需要限制功率,以保证对人眼没有损伤
    • 1550nm:对人眼没有损伤,探测距离更远,但是成本高
  • 测距原理
    • 单脉冲飞行时间法(ToF):测出发射脉冲到接收脉冲所需的时间,再结合光速计算距离
    • 调频连续波(FMCW):与毫米波类似,在后续毫米波雷达章节介绍
    • 结构光法:在激光SLAM中有过详细介绍
  • 硬件结构
    • 机械旋转式:包含多个发射接收模块,需要人工调教。因此成本高,量产困难。另外,实际中当车身发生震动颠簸时会对机械转动模块产生较大影响,故很难满足车规级要求。
    • 半固态(MEMS):采用微电子的机械系统来驱动激光雷达中的微小悬镜,然后将激光束反射到不同方向,这样可减少发射接收模块数量,从而降低生产成本,是目前自动驾驶系统中较为常见的量产方案。
    • 全固态(FLASH):它没有空间扫描过程,也没有悬镜去反射激光束。是短时间内发射激光束,同时覆盖大面积的区域,但目前技术还不是很成熟。
    • 考虑到整个生产成本、量产难度、车规级要求以及技术成熟度,目前半固态式激光雷达是比较有前景的。

(2)为什么要使用激光雷达——传感器之间的互补性

  • 摄像头
    • 优点:能够提取丰富的纹理和颜色信息,适用于目标的检测和分类,以及语义信息的提取
    • 缺点:3D信息的感知能力比较弱,且受光照条件影响比较大
  • 激光雷达
    • 优点:能够精确感知目标的3D信息,且不受光照影响
    • 缺点:成本较高,量产难度大,受天气影响较大

(3)不同级别自动驾驶系统的需求

  • L2级(自适应巡航 + 车道保持)
    ​ 可以采用纯视觉系统来进行简单的目标检测和距离估计,因为此时驾驶主体是驾驶员本身,驾驶员需要时刻保持对车辆的掌控和周围环境的观察,自动驾驶系统只是起到辅助的作用。

  • L3级(拥堵辅助,领航辅助)
    ​ 至少需要配备前向的激光雷达,来对车辆行进方向的运动或静止障碍物进行精确的距离估计

  • L4级(RoboTaxi)
    ​ 在特定场景下,车辆可完全自主行驶,不需要驾驶员接管。需要多个激光雷达提供360°视场,以及需要一定的系统冗余性,当一个激光雷达失效时,其他激光雷达还能继续完成感知任务。

2. 点云数据库

(1)三种数据库比较
在这里插入图片描述
(2)WOD上的基准测试结果

  • 基准算法:PointPillar物体检测算法
  • 性能指标
    • 输出3D框与ground truth的3D框进行对比
    • 忽略高度信息,在俯视图(BEV)上将输出2D框与ground truth投影的2D框进行对比(大小、朝向等)
    • Average Percision(AP),APH(AP with Heading)——带朝向的AP
    • LEVEL_1/LEVEL_2(将数据分为两种 不同难度进行对比)
  • 检测结果
    • 远距离目标检测准确率较低
    • 行人的检测准确率较低
    • 不同城市的数据之间存在较大差异,算法的适应性不佳
    • 增加训练数据可以显著地提高检测准确率

3. 基于激光雷达的物体检测算法概述

(1)大致流程

  • 输入
    • 点:X,Y,Z和反射强度R
    • 点云:多个点的集合(它是无序的,非结构化的数据)
  • 输出
    • 目标的类别和置信度
    • 目标的边框(Bounding Box):中心点3D坐标,长宽高,旋转角度
    • 目标的其他信息:速度,加速度等
  • 点云表示方法
    • 点视图(Point View, PV):原始点云集合
    • 俯视图(Brid’e Eye View, BEV):将点云量化为3D网格,将3D网格在高度方向上进行压缩可得到2D网格
    • 前视图(Range View, RV):将点云投影到图像平面
    • 多视图融合:俯视图+点视图,俯视图+前视图

(2)基于不同视图的激光雷达物体检测算法

  • 点视图:PointNet/PointNet++,Point-RCNN,3D SSD
  • 俯视图:VoxelNet,SECOND,PIXOR,AFDet
  • 前视图:LaserNet,RangeDet
  • 多视图融合
    • 俯视图+点视图:PointPillar,SIENet,PV-CNN
    • 俯视图+前视图:MV3D,RSN

4. 基于点视图的激光雷达物体检测

(1)PointNet

  • 论文:QI et al, PointNet. Deep learning on point sets for 3d classification and segmentation, 2017.
  • 核心思路:点云特征提取
    • MLP(多个全连接层)提取点特征:n个点,特征由3维提升到1024维
    • MaxPooling得到全局特征:1024维
  • 可端到端学习,对点云进行分类/语义分割
  • 拓展到物体检测:可先对点云进行聚类,然后使用PointNet对每一个聚类进行分类,即Clustering得到候选 + PointNet分类(经过clustering后,每个类别不一定都包含n个点。对于没有n个点的类别,需要进行上采样,对于超过n个点的类别,需要进行下采样,最终目的是使得每个类别都包含n个点)
  • 大致流程:

​ 输入n个点,每个点是由(X,Y,Z)坐标组成。首先,进行一个input transform空间变换,将不同朝向的物体归一化到一个统一的视角下(统一坐标系),使得不同物体的点云处于同一坐标系下。然后,通过MLP对点云进行点特征提取(由 n × 3 n \times 3 n×3转换为 n × 1024 n \times 1024 n×1024)。接着,通过MaxPooling进行全局特征提取(在n个点维度上进行Max Pooling,由 n × 1024 n \times 1024 n×1024转换成 1 × 1024 1 \times 1024 1×1024)。最后,通过MLP对1024大小的一维向量进行分类,获取点云分类结果。
在这里插入图片描述
(2)PointNet++

  • 论文:Qi et al, PointNet++. Deep hierachical feature learning on point sets in a metric space, 2017.

  • 它是在物体检测方向进行扩展:Clustering + PointNet

    • 用聚类的方式来产生多个候选点集,每个候选点集采用PointNet来提取特征
    • 上述过程重复多次:上一层的点集经过全局特征提取后看作下一层的点(Set Abstraction, SA)。也就是说,每个候选点集可以表示成一个特征向量,因此可将每个候选点集看成一个新的点,它有一个与之对应的特征向量。所以,多个候选点集可看成由多个点组成的新点云,它与原始点云在形式上是一样的。然后,再用上述过程对新点云进行相同处理,如此可重复多次。
    • 点特经过多次聚类+PointNet特征提取后,会得到比较稀疏的点云,每个点特征具有较大的感受野,包含周围环境的上下文信息。因此,每个点可以看作物体的候选,实现对物体分类和检测的目的。
    • PointNet++最后对得到的稀疏点云再经过PointNet进行场景的全局分类,同时将稀疏点云恢复到原始点云,进行点云分割。
      在这里插入图片描述

(3)PointNet和PointNet++中存在的问题

  • 无法利用视觉领域成熟的检测框架,比如:Faster R-CNN,YOLO等
  • Clustering部分的计算复杂度较高,而且难以并行处理
  • 两个改进方法:Point R-CNN,3D SSD

(4)Point R-CNN

论文:Shi et al. PointRCNN. 3D Object Proposal Generation and Detection from Point Cloud, 2018.

  • 核心思想:点处理(第一步) + Faster R-CNN(后三步)

    • 通过PointNet++提取点特征,同时进行前景分割,以区分物体点和背景点
    • 每个前景点生成一个3D候选框
    • 对每个候选框内的点进行ROI Pooling,得到固定大小的特征向量。
    • 最后与Faster RCNN一样,进行一系列的特征提取,如对bounding box进行分类,并修正其位置和大小
  • 运行速度瓶颈 (Point R-CNN中的前景分割是怎么实现的)

    • Point R-CNN是通过前景分割来代替聚类,在一定程度上可减少聚类所带来的计算量。但在进行前景分割时,需要通过PointNet++将点集特征经过上采样映射回原始点云(因为聚类生成的点集无法很好地覆盖所有物体),这一部分是比较耗时的。
    • 在ROI Pooling中需要全局搜索属于每个物体候选框中的点
      在这里插入图片描述

(5)3D SSD

  • 论文:Yang et al., 3dssd:Point-based 3d single stage object detector, 2020

​ 3D SSD相对于Point R-CNN而言,做出了如下改进:

  • 提高聚类质量

    • PointNet++是考虑点与点之间的空间距离(几何特征)进行聚类,3D SSD是同时考虑点与点之间在几何与特征空间上的相似度来进行聚类。
    • 此时,聚类可以更好地覆盖场景中的物体,可直接以聚类的输出作为物体候选,而不用再上采样到原始点云。
  • 避免重复计算

    • 高质量的聚类算法输出每个cluster的中心和邻域点,无需再上采样到原始点云。
  • 提高了聚类质量后,可确定聚类中的点属于哪个类别。因此,可避免在ROI Pooling阶段全局搜索场景中的所有点来确定其中每个点属于哪个物体候选框。

5. 基于俯视图的激光雷达物体检测

(1)VoxelNet

  • 论文:Zhou and Tuzel, Voxelnet: End-to-end learning for point cloud based 3d object detection, 2018.

  • 大致内容:特征学习网络(Feature Learning Network)、3D卷积网络(Convolutional Middle Layers)、区域候选网络(Region Proposal Network)

  • 特征学习网络

    • Grouping & Sampling:将输入点云在三维空间中进行量化,具体操作为:将三维空间划分为三维网格,每个网格中会分配到相应数量的点,然后通过上采样与下采样操作,来统一每个网格中的点数量。
    • Voxel Feature Encoding(VFE):先通过全连接层对每个网格中的点进行特征提取,然后对提取到的每个点特征进行Mean Pooling获取特征均值,最后将每个点特征与特征均值进行concat拼接,得到新的点特征,由此得到的特征既包含该点自身的特征,也包含该网格的整体特征(具有一定的邻域信息)。
    • Stacked VFE:重复多次VFE操作
      在这里插入图片描述
  • 3D卷积网络

​ 经过stacked VFE特征提取后,得到一个四维的Tensor。然后,采用3D卷积网络提取三维空间特征,并将高度压缩到一维,最终得到一个类似于二维图像表示形式的三维Tensor。
在这里插入图片描述

  • 区域候选网络

​ 在经过上述3D卷积网络后,得到类似于二维图像的特征,因此可采用类似于二维图像物体检测网络来进行处理。下面是通过类似于U-Net结构的网络进行特征提取,然后分别使用分类和回归Head进行处理。
在这里插入图片描述
(2)VoxelNet中存在的问题

  • 数据表示低效,存在大量空白区域
    • KITTI数据库一般生成5K-8K个Voxel,只有0.5%的Voxel是非空的
    • 改进方法:SECOND(采用稀疏卷积,避免空白区域的无效计算)
  • 三维卷积计算量巨大
    • 改进方法:PIXOR(将3D网格通过手工设计的方式压缩到2D)

(3)SECOND(Sparsely Embedded Convolutional Detection)

  • 论文:Yan et al., Second: Sparsely embedded convolutional detection, Sensors, 2018.
  • 大致结构
    在这里插入图片描述
  • 使用稀疏卷积避免无效计算:

​ 将VoxelNet中的3D卷积转换为稀疏卷积,相应的输入由稠密的网格表示形式转化为稀疏的结构,即只保留非空的网格特征,同时记录每个非空网格的索引位置,其余模块与VoxelNet类似。

  • 稀疏卷积操作:首先,网格数据上是由稠密表示转换为稀疏表示。其次,卷积操作只在非空网格上进行卷积操作,如下图所示:
    在这里插入图片描述

(4)PIXOR(Oriented 3D object detection from Pixel-wise neural network predictions)

  • 论文:Yang et al., Pixor. Real-time 3d object detection from point clouds, CVPR, 2018.

  • 核心思想:通过手工设计高度维度的特征,将高度维度变成特征通道,从而将3D卷积变成2D卷积,可以使用2D卷积来提取特征。其中,手工设计包括Occupancy和Intensity两个方面的内容。

    • Occupancy:对于 L × W × H L \times W \times H L×W×H的网格,将高度维度划分成 H H H个格子,若当前高度格子内有点,则该高度格子参数为1,否则为0。
    • Intensity:对于 L × W × H L \times W \times H L×W×H的网格,将高度 H H H上所有点的反射强度进行平均,将 H H H维压缩成1维。
    • Total:将Occupancy和Intensity特征合并起来,由此将三维网格转换成 L × W × ( H + 1 ) L \times W \times (H+1) L×W×(H+1)格式的图像(图像大小: L × W L \times W L×W,通道数: H + 1 H+1 H+1
      在这里插入图片描述

6. 俯视图与点视图的比较

(1)俯视图

  • 优点:输入结构化数据,网络结构简单,可以通过标准的卷积操作得到最终的检测结果
  • 缺点:对量化参数敏感:粗网格导致较大的信息损失,细网格导致较大的计算量和内存使用量

(2)点视图

  • 优点:没有量化损失,数据比较紧致
  • 缺点:输入非结构化数据,网络结构复杂,并行处理困难,提取邻域特征困难

(3)检测结果比较

算法 VoxelNet SECOND PIXOR Point RCNN 3D SSD
点云表示
### 激光雷达在三维目标检测中的应用及其实现方法 激光雷达(LiDAR)是一种利用激光脉冲测量距离的技术,在自动驾驶、机器人导航等领域具有广泛应用。基于激光雷达点云的三维目标检测技术能够提供精确的距离信息和丰富的几何特征,从而实现对环境中物体的有效识别。 #### 1. 数据预处理 为了有效提取有用的信息并减少计算负担,通常会对原始点云数据进行预处理。常见的预处理步骤包括降采样、去除噪声以及坐标变换等[^3]。例如,VoxelNet 和 SECOND 方法采用体素化的方式将连续的点云离散成固定大小的立方体网格结构,以便后续网络更高效地处理这些数据。 #### 2. 特征提取 在完成初步的数据准备之后,下一步就是从点云中提取有意义的特征。这一步骤对于最终检测结果至关重要。PointPillars 提出了柱状表示形式,它不仅简化了模型架构还提高了运行效率。此外,TANet 利用了注意力机制增强了局部区域的重要性评估能力。 #### 3. 目标检测头设计 目标检测头负责具体执行分类与定位两项核心任务。正如所提到那样,BEV (Bird's Eye View)视角下的目标检测可以借鉴传统二维图像上的做法但需考虑额外维度带来的挑战——即除了常规边界框外还需预测角度参数以适应旋转矩形框的需求[^2]。Anchor-based 或 Anchor-free 的策略均可应用于此场景下分别对应先验假设引导型或者无任何预先设定自由探索型两种思路模式。 #### 4. 端到端优化框架 随着深度学习的发展,“端到端”的解决方案逐渐成为主流趋势之一。“伪 LiDAR”概念正是在这种背景下被提出并通过融合视觉模态进一步提升了整体表现水平[^1]。通过联合训练深度估计模块与三维对象感知组件使得即使存在初始误差也能逐步得到校正进而达到更高精度的结果展示效果如文中描述所示由最初粗略近似到最后精细调整过程清晰可见[^4]。 #### 5. 多传感器融合提升鲁棒性 尽管单独依赖于某一种传感设备已经可以获得不错的效果然而面对更加复杂的现实状况则往往需要综合运用多种手段共同作用才能更好地应对不确定性因素影响比如恶劣天气条件下光线变化剧烈可能造成摄像头失效此时如果能结合毫米波雷达甚至超声波装置就可以弥补各自短板发挥协同效应最大化整个系统的稳定性和可靠性[^5]。 ```python import numpy as np from sklearn.cluster import DBSCAN def preprocess_point_cloud(points, voxel_size=0.1): """ 对点云进行体素化 """ voxels = points // voxel_size unique_voxels = np.unique(voxels, axis=0) return unique_voxels * voxel_size + voxel_size / 2 def cluster_objects(features, eps=0.5, min_samples=10): """ 使用DBSCAN聚类算法发现潜在目标""" clustering = DBSCAN(eps=eps, min_samples=min_samples).fit(features) labels = clustering.labels_ return labels if __name__ == "__main__": raw_points = np.random.rand(1000, 3) # 示例输入:随机生成一些点 processed_points = preprocess_point_cloud(raw_points) object_labels = cluster_objects(processed_points) print(object_labels) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值