3D目标检测(一)—— 基于Point-Based方法的PointNet点云处理系列

这篇具有很好参考价值的文章主要介绍了3D目标检测(一)—— 基于Point-Based方法的PointNet点云处理系列。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

3D目标检测(一)—— PointNet,PointNet++,PointNeXt, PointMLP

目录

3D目标检测(一)—— PointNet,PointNet++,PointNeXt, PointMLP

前言

零、网络使用算法

FPS最远点采样法

Ball-query球查询

一、PointNet

二、PointNet++

MSG-PointNet++

三、PointNeXt

四、PointMLP

总结

前言

在3D目标检测中,可以大致分为基于图像、基于点云和基于多模态融合的三种方法。而基于点云处理的3D目标检测中,如何有效处理点云数据信息是其中的重点。常见的处理点云的方法有两种,一种为将无序的点云处理成有规则的体素或者柱体(voxel or pillar)等来进行处理,被称为Voxel-Based,另一种则是直接在原始点云上进行操作的Point-Based方法。

本文主要介绍如何Point-Based中的经典网络PointNet,PointNet++和其发展PointNeXt、PointMLP。


零、网络使用算法

有许多对于点云预处理的算法,如FPS,ball-query等,在这里介绍一下,方便大家对于后续网络结构的了解和认识。

FPS最远点采样法

对于点云来说,每次采集的信息少则是上万个点,多则则是几十万个点,如果把这些点都塞到网络结构中进行处理,毫无疑问对于显存等的消耗都是十分巨大的,故如何对这些点进行采样降低点云的数量的同时,最大程度保留其中蕴含的特征是研究之一。

而FPS最远点采样,则是其中比较常用的方法之一,其核心思想则是使采样后的点集中的点互相相距最远,从欧式空间来看,这种方法最大限度的使点在空间中较为分散的分布,概率上能最大保留空间中点的特征。这里引用知乎文章FPS理解,来介绍其主要步骤。

  1. 随机选取点P0为起始点,获得初始集合S={P0},并定义初始距离矩阵D,其中D[i]记录集合中每个点Pi到集合S中点的最远距离。
  2. 计算点云中的点到P0的距离,更新距离矩阵D[i],选择D[i]最大值对应的点P1加入集合,S={P0,P1}
  3. 循环第二个步骤,直至S中集合的点数达到设定值

代码如下

def farthest_point_sample(xyz, npoint):
    """
    Input:
        xyz: pointcloud data, [B, N, 3]
        npoint: number of samples
    Return:
        centroids: sampled pointcloud index, [B, npoint]
    """
    device = xyz.device
    B, N, C = xyz.shape
    centroids = torch.zeros(B, npoint, dtype=torch.long).to(device)
    distance = torch.ones(B, N).to(device) * 1e10
    farthest = torch.randint(0, N, (B,), dtype=torch.long).to(device)
    batch_indices = torch.arange(B, dtype=torch.long).to(device)
    for i in range(npoint):
        centroids[:, i] = farthest
        centroid = xyz[batch_indices, farthest, :].view(B, 1, 3)
        dist = torch.sum((xyz - centroid) ** 2, -1)
        mask = dist < distance
        distance[mask] = dist[mask]
        farthest = torch.max(distance, -1)[1]
    return centroids

其具体效果大致如下

3D目标检测(一)—— 基于Point-Based方法的PointNet点云处理系列

而FPS算法不仅可以使用欧式空间来进行采样,同样也可以嵌入网络中,在特征空间利用特征向量来计算出特征距离矩阵,利用此来进行FPS。

Ball-query球查询

点云数据除了无序性的特征外,还存在着邻域相关性的特征,即点与点之间不是孤立的关系,相邻的点云构成的具有特征的点云集,故如何有效概括区域点云,则是ball-query要干的事。

ball-query的思想十分简单,即设定球心,将球心半径内的和球心最近的点聚类起来作为一个领域。而在PointNet系列中,其球心的一般是由FPS算法采样后的点确立的,故这两个算法经常同时使用,统称为QueryAndGroup

def query_ball_point(radius, nsample, xyz, new_xyz):
    """
    Input:
        radius: local region radius
        nsample: max sample number in local region
        xyz: all points, [B, N, 3]
        new_xyz: query points, [B, S, 3],一般为FPS采样确定的点
    Return:
        group_idx: grouped points index, [B, S, nsample]
    """
    device = xyz.device
    B, N, C = xyz.shape
    _, S, _ = new_xyz.shape
    group_idx = torch.arange(N, dtype=torch.long).to(device).view(1, 1, N).repeat([B, S, 1])
    sqrdists = square_distance(new_xyz, xyz)
    group_idx[sqrdists > radius ** 2] = N
    group_idx = group_idx.sort(dim=-1)[0][:, :, :nsample]
    group_first = group_idx[:, :, 0].view(B, S, 1).repeat([1, 1, nsample])
    mask = group_idx == N
    group_idx[mask] = group_first[mask]
    return group_idx

一、PointNet

3D目标检测(一)—— 基于Point-Based方法的PointNet点云处理系列

PointNet是直接处理点云的开山之作,我们假设如果没有现在这么多处理点云的方法,在我们拿到点云数据时,应该如何考虑通过神经网络进行处理。

通过分析,我们可以得出点云数据有着如下几大特点。

  • 无序性:点云中的点不像图像中的像素一样,具有严格的顺序,即如果通过一个数据存储点云,随机的打乱数组的顺序,并不会有任何影响。
  • 点与点之间存在联系:虽然点之间没有顺序的概念,但空间中相邻的点构成的领域具有联系性,能够表征整体的特征,每个点不是孤立的。
  • 变换不变性:这点和图像是类似的,即不管如何旋转和翻转部分的点,其代表的整体还是同样的。

根据上述特点,当拿到一个(B,N,C)维度的点云数据时,应该利用什么神经网络的什么结构能处理呢。其实最直观,最简单的方法则是利用汇聚层来进行处理,不管是max pooling还是avg pooling,在图像领域里的作用都是将处理好的特征汇聚起来,集合成更有全局性的特点,且根据max pooling和avg pooling的数学表达max()和mean()操作,均满足点云中的无序性特征要求。

                                         3D目标检测(一)—— 基于Point-Based方法的PointNet点云处理系列

                                        3D目标检测(一)—— 基于Point-Based方法的PointNet点云处理系列

但对于一个sample的点云(N,3)来,其初始只有XYZ三个坐标维度的特征,直接进行汇聚操作,得到的特征都是十分浅层的特征,没法利用来做什么后续的操作。那根据图像领域利用卷积来获得高维特征,最后进行汇聚的思路,点云框架也可以这么设计,而由于点云是二维的特征,没法利用卷积,则使用全连接层(也可以认为是一维卷积)的方法,来对点云进行升维,在PointNet中,则将初始点云由(N,3)经过MLP一步步从3维升维至64维,最后为1024维度,在升维后,通过max pooling操作将(N,1024)的特征,汇聚成1024的特征向量,完成对点云的特征处理。

而在点云送入神经网络前,由于每个物体采集到点云的数量不一样,为了方便处理,会利用FPS算法或者就随机采样将点云采样到相同的数量来进行处理。

至于PointNet中还有input transform模块和feature transform模块,则是考虑到变换不变性来设计的,但在后续的论文中,被认为其对整体的效果并不大,这里就不讲述了。

所以PointNet作为开山之作,其提供的最重要的思想就是,对于无序的点云,可以沿用图像领域的经验,对点云先升维,然后利用max pooling或者avg pooling等汇聚操作来处理特征。

二、PointNet++

根据上述对PointNet的讲解,可以知道PointNet只是提出了一种直接处理点云的整体的框架,但其在处理时,并没有考虑到点云的第二个特征,即点与点之间的局部特征特点,故PointNet++则是基于此在PointNet的基础上对局部区域进行改进的框架。

       3D目标检测(一)—— 基于Point-Based方法的PointNet点云处理系列

 PointNet++的设计思路也很直观,既然PointNet是缺少局部特征处理的,而在图像领域中卷积的作用就是把一个个局部的特征提取出来生成高维的特征,可在点云里无法利用卷积核这种方便的操作,于是作者就引入了sampling&grouping的操作,被称为set abstraction(SA)层来模拟这种卷积的操作。

像图示如此,作者对原始的N个点进行FPS采样得到N1个点,并将采样后的N1个点作为中心点,使用ball-query算法来形成K个领域,而后将每个领域都单独的经过PointNet层,即上述PointNet框架中的mlp升维+汇聚操作,这样采样后的N1个点就可以认为汇聚了其对应区域中点的特征。经过上述操作,原本N个带有d+C特征的点,被采样升维为N1个带有d+C1个特征点,其中d一般为原始坐标特征xyz。至此,SA层的设计思路一直被沿用,可以认为就是当初图像领域中conv+bn+relu层的点云版本。

                                                   

可以用上述的数学表达式来表示PointNet++的网络结构,其中表示特征聚合操作(在PointNet++为max_pooling),表示局部的特征提取器(在PointNet++为MLP),则表示第个采样点的第个领域的特征。

PointNet++可以说奠定了点云处理的框架都依此数学表达式来构建,后面的更多工作都在上做许多文章,如引入attention机制或者用CNN,GNN等方法。

MSG-PointNet++

                                                     3D目标检测(一)—— 基于Point-Based方法的PointNet点云处理系列 

作者另外还考虑到了点云在收集时,不同的区域中点云的稀疏性可能会差别很大,有可能某个角落的点云数量只有少数几个,那么这种情况就会导致grouping后的点云区域中只有少量的点云,而少量的点云无法有效的概括局部特征。解决这个问题,最简单的想法就是加大ball-query中球的半径,那么可以保证每个领域点的数量都不会太少,但领域的半径过大,就会导致网络对于精细局部的建模不够。综合上述因素,作者提出multi-scale grouping(MSG)的思路,即在每层grouping的时候,不仅使用一个半径来进行grouping,而使用多个半径来进行grouping,把这几个半径grouping的结果邻域送入PointNet后最后拼接起来形成最后的新特征。

PointNet++的核心思想就是考虑在PointNet的基础上,利用邻域的概念,对局部特征进行了有效的建模,提出的SA层,也成为现在直接处理点云框架中最常用的backbone module。

三、PointNeXt

个人认为PointNeXt本身是一篇偏向于工程性的文章,但其提出了如何做大PointNet系列的一个思路。最直观的做大PointNet获得高性能的方法,就是加多几个SA层,并把维度升的更高,以获得更大感受野和更深层的特征,但PointNeXt通过实验证明,单纯的这么做,对网络没有太大的提升,反而会影响网络的性能,作者给出的解释在于过深的网络结构会导致梯度消失和过拟合现象的产生,于是作者仿照Resnet的成功,也在PointNet++的基础上,在网络中引入了残差结构,来构造更深更大的网络。

3D目标检测(一)—— 基于Point-Based方法的PointNet点云处理系列

网络的处理module,在原来SA层的基础上,加入了InvResMLP残差结构,InvResMLP模块中,把原先的SA层中的3层MLP,划分为作用在grouping后的MLP,来提取邻域特征,和后两层MLP来提取点特征以此增强网络的性能。在PointNeXt中用这种SA+InvResMLP的结构来当成基础处理模块。

PointNeXt其他贡献在于其做了大量的实验,去说明调参的重要性(doge),这里就不介绍了。而PointNeXt的主要思想则是通过残差结构的设计来做大模型,以此提升模型的整体性能,也给网络的设计提供了一种方向。

四、PointMLP

PointMLP和PointNeXt的整体方向都是希望通过残差结构的MLP来提升原有PointNet架构的性能,并且也同时考虑了grouping前的局部区域特征,可以认为是同一方向但两种设计思路的方法。

       3D目标检测(一)—— 基于Point-Based方法的PointNet点云处理系列

PointMLP用数学表达的话,可以以下面的公式来呈现

                                         

可以看到其相对PointNet++而言,其多了来学习聚合后的深层信息,其实PointNeXt中的InvResMLP可以认为是的一种,所以PointNext和PointMLP其实在数学表达上是一样的。而其中的差别在于其中MLP层的设计,PointMLP中在MLP层之间还加入了BN RELU的设计(感觉上没什么创新,本质上都是MLP层+pooling层的组合罢了)

另外文章还指出了如果单纯堆叠这样的处理结构,网络效果并不会变好,反而变差,作者分析是由于区域的局部稀疏和不规则导致的(我个人感觉是网络设计问题,因为PointNeXt并没有考虑这个问题,但也work),与是设计了一个类似归一化的映射模块,在点云输入到网络前就需要经过此模块进行处理,来解决区域稀疏性的问题。

         3D目标检测(一)—— 基于Point-Based方法的PointNet点云处理系列

                 3D目标检测(一)—— 基于Point-Based方法的PointNet点云处理系列

 其中表示区域内的第j个点,其需要通过上述公式进行区域归一化映射,k表示第附近拥有k个领域点,d表示点代表的维度信息,n则是总的点数。这个模块的功能,作者并没有进行过多的消融实验,如加入这个模块后,其他网络的性能是否有提升等,所以其泛用性还有待验证。

总结

本文介绍了3D目标检测中Point-Based方法中的Backbone处理方法,介绍常用backbone PointNet,PointNet++及其发展PointNeXt和PointMLP。这些种类的方法其实都是基于MLP和pooling层的结构,除此之外,也有许多方法如PointCNN尝试使用CNN来处理点云,和DGCNN尝试使用图网络来处理点云等。文章来源地址https://www.toymoban.com/news/detail-408652.html

到了这里,关于3D目标检测(一)—— 基于Point-Based方法的PointNet点云处理系列的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【3D目标检测】基于伪雷达点云的单目3D目标检测方法研宄

    本文是基于单目图像的3D目标检测方法,是西安电子科技大学的郭鑫宇学长的硕士学位论文。 【2021】【单目图像的3D目标检测方法研究】 研究的问题: 如何提高伪点云的质量 伪点云体系中如何提高基于点云的检测算法的效果 提出的方法: 一种基于置信度的伪点云采样方法

    2024年02月06日
    浏览(56)
  • 基于卷积神经网络的3D动目标检测方法

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 ` 一种基于雷达的多类移动目标检测方法,该方法利用了目标级的专业知识(精确的二维定位、解决相位模糊),以及来自全三维立体雷达数据。包含的雷达数据可以在任何对象聚类之前对单个移动目标

    2024年02月08日
    浏览(51)
  • 基于pointnet的3D物体分类和分割检测(复现不出来你直接敲我家门)

    录 前言 一.资料下载 1.代码下载 2.数据集下载 二.环境配置 1.本文采用设备配置说明 2.虚拟环境配置 三.训练部分 1.分类训练部分 2.分割的训练部分 四.预测部分 1.分类结果展示 2.分割结果可视化 目前,2D的物体检测算法已经非常成熟,算法准确率的上升空间已经遇到瓶颈,而

    2024年02月01日
    浏览(52)
  • PointNet: Deep Learning on Point Sets for 3D Classification and Segmentation

    论文下载地址:https://arxiv.org/abs/1612.00593 代码开源地址:https://github.com/charlesq34/pointnet 作者以及论文信息如下: 论文作者的公开课链接 :https://www.shenlanxueyuan.com/channel/8hQkB6hqr2/detail(大佬的课必须去感受下啊~~) 最近,开始研究基于3D点云的深度学习算法。 PointNet 作为基于

    2023年04月15日
    浏览(36)
  • 3D点云分割系列1:PointNet,从Voxel-base到Point-base的进阶之路

    PointNet发布于2017CVPR。 《PointNet: Deep Learning on Point Sets for 3D Classification and Segmentation》 题外话 PointNet对于3D点云分割的意义有点像FCN对语义分割的意义。PointNet不同以往的voxel-based的模型,它试图通过直接对点云数据中每一个点进行处理,来分析点云中每一个点的信息,提取特征

    2024年01月18日
    浏览(41)
  • 深度学习系列之Anchor based 和 Anchor free 目标检测方法

      ——致敬各路网络无名大神   (持续更新中…)   目标检测算法通常会在输入图像中采样大量的区域,然后判断这些区域中是否包含我们感兴趣的目标,并调整区域边界从而更准确地预测目标的真实边界框(ground-truth bounding box)。目标检测算法会判断这些区域是否有

    2024年02月03日
    浏览(43)
  • yolov8(目标检测、图像分割、关键点检测)知识蒸馏:logit和feature-based蒸馏方法的实现

    在目标检测中,知识蒸馏的原理主要是利用教师模型(通常是大型的深度神经网络)的丰富知识来指导学生模型(轻量级的神经网络)的学习过程。通过蒸馏,学生模型能够在保持较高性能的同时,减小模型的复杂度和计算成本。 知识蒸馏实现的方式有多种,但核心目标是将

    2024年04月28日
    浏览(80)
  • 【半监督学习】5、Efficient Teacher | 专为 one-stage anchor-based 方法设计的半监督目标检测方法

    论文:Efficient Teacher: Semi-Supervised Object Detection for YOLOv5 出处:阿里 时间:2023.03 目标检测近年来的进展离不开大量的标注数据,但数据标识昂贵且耗时。 故此,半监督方法被提出,通过自动生成伪标签来利用大量的未标注数据。 目前的半监督学习有如下三个最重要的挑战:

    2024年02月05日
    浏览(71)
  • 【目标检测】Anchor-based模型:基于K-means算法获取自制数据集的Anchor(yolo源码)

    在Anchor-based目标检测模型中,根据数据集选择合适的Anchor有利于加快模型的收敛速度以及减少模型的边框预测误差。本篇文章首先介绍 Anchor 在目标检测模型中的作用;然后介绍 K-means 聚类算法;最后介绍 yolo源码 中 自制数据集的Anchor的获取 方法。   在 Anchor-based 目标检测

    2024年01月16日
    浏览(39)
  • 3D检测:从pointnet,voxelnet,pointpillar到centerpoint

    记录centerpoint学习笔记。目前被引用1275次,非常高。 地址:Center-Based 3D Object Detection and Tracking (thecvf.com) GitHub - tianweiy/CenterPoint CenterPoint:三维点云目标检测算法梳理及最新进展(CVPR2021)_哔哩哔哩_bilibili 作者解释。 CenterPoint 是一种用于激光点云的3D目标检测与跟踪算法框架

    2024年04月22日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包