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理解,来介绍其主要步骤。
- 随机选取点P0为起始点,获得初始集合S={P0},并定义初始距离矩阵D,其中D[i]记录集合中每个点Pi到集合S中点的最远距离。
- 计算点云中的点到P0的距离,更新距离矩阵D[i],选择D[i]最大值对应的点P1加入集合,S={P0,P1}
- 循环第二个步骤,直至S中集合的点数达到设定值
代码如下
def farthest_point_sample(xyz, npoint):"""Input:xyz: pointcloud data, [B, N, 3]npoint: number of samplesReturn:centroids: sampled pointcloud index, [B, npoint]"""device = xyz.deviceB, N, C = xyz.shapecentroids = torch.zeros(B, npoint, dtype=torch.long).to(device)distance = torch.ones(B, N).to(device) * 1e10farthest = 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] = farthestcentroid = xyz[batch_indices, farthest, :].view(B, 1, 3)dist = torch.sum((xyz - centroid) ** 2, -1)mask = dist < distancedistance[mask] = dist[mask]farthest = torch.max(distance, -1)[1]return centroids
其具体效果大致如下
而FPS算法不仅可以使用欧式空间来进行采样,同样也可以嵌入网络中,在特征空间利用特征向量来计算出特征距离矩阵,利用此来进行FPS。
Ball-query球查询
点云数据除了无序性的特征外,还存在着邻域相关性的特征,即点与点之间不是孤立的关系,相邻的点云构成的具有特征的点云集,故如何有效概括区域点云,则是ball-query要干的事。
ball-query的思想十分简单,即设定球心,将球心半径内的和球心最近的点聚类起来作为一个领域。而在PointNet系列中,其球心的一般是由FPS算法采样后的点确立的,故这两个算法经常同时使用,统称为QueryAndGroup
def query_ball_point(radius, nsample, xyz, new_xyz):"""Input:radius: local region radiusnsample: max sample number in local regionxyz: all points, [B, N, 3]new_xyz: query points, [B, S, 3],一般为FPS采样确定的点Return:group_idx: grouped points index, [B, S, nsample]"""device = xyz.deviceB, N, C = xyz.shape_, S, _ = new_xyz.shapegroup_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] = Ngroup_idx = group_idx.sort(dim=-1)[0][:, :, :nsample]group_first = group_idx[:, :, 0].view(B, S, 1).repeat([1, 1, nsample])mask = group_idx == Ngroup_idx[mask] = group_first[mask]return group_idx
一、PointNet
PointNet是直接处理点云的开山之作,我们假设如果没有现在这么多处理点云的方法,在我们拿到点云数据时,应该如何考虑通过神经网络进行处理。
通过分析,我们可以得出点云数据有着如下几大特点。
- 无序性:点云中的点不像图像中的像素一样,具有严格的顺序,即如果通过一个数据存储点云,随机的打乱数组的顺序,并不会有任何影响。
- 点与点之间存在联系:虽然点之间没有顺序的概念,但空间中相邻的点构成的领域具有联系性,能够表征整体的特征,每个点不是孤立的。
- 变换不变性:这点和图像是类似的,即不管如何旋转和翻转部分的点,其代表的整体还是同样的。
根据上述特点,当拿到一个(B,N,C)维度的点云数据时,应该利用什么神经网络的什么结构能处理呢。其实最直观,最简单的方法则是利用汇聚层来进行处理,不管是max pooling还是avg pooling,在图像领域里的作用都是将处理好的特征汇聚起来,集合成更有全局性的特点,且根据max pooling和avg pooling的数学表达max()和mean()操作,均满足点云中的无序性特征要求。
但对于一个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的基础上对局部区域进行改进的框架。
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++
作者另外还考虑到了点云在收集时,不同的区域中点云的稀疏性可能会差别很大,有可能某个角落的点云数量只有少数几个,那么这种情况就会导致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++的基础上,在网络中引入了残差结构,来构造更深更大的网络。
网络的处理module,在原来SA层的基础上,加入了InvResMLP残差结构,InvResMLP模块中,把原先的SA层中的3层MLP,划分为作用在grouping后的MLP,来提取邻域特征,和后两层MLP来提取点特征以此增强网络的性能。在PointNeXt中用这种SA+InvResMLP的结构来当成基础处理模块。
PointNeXt其他贡献在于其做了大量的实验,去说明调参的重要性(doge),这里就不介绍了。而PointNeXt的主要思想则是通过残差结构的设计来做大模型,以此提升模型的整体性能,也给网络的设计提供了一种方向。
四、PointMLP
PointMLP和PointNeXt的整体方向都是希望通过残差结构的MLP来提升原有PointNet架构的性能,并且也同时考虑了grouping前的局部区域特征,可以认为是同一方向但两种设计思路的方法。
PointMLP用数学表达的话,可以以下面的公式来呈现
可以看到其相对PointNet++而言,其多了来学习聚合后的深层信息,其实PointNeXt中的InvResMLP可以认为是
的一种,所以PointNext和PointMLP其实在数学表达上是一样的。而其中的差别在于其中MLP层的设计,PointMLP中在MLP层之间还加入了BN RELU的设计(感觉上没什么创新,本质上都是MLP层+pooling层的组合罢了)
另外文章还指出了如果单纯堆叠这样的处理结构,网络效果并不会变好,反而变差,作者分析是由于区域的局部稀疏和不规则导致的(我个人感觉是网络设计问题,因为PointNeXt并没有考虑这个问题,但也work),与是设计了一个类似归一化的映射模块,在点云输入到网络前就需要经过此模块进行处理,来解决区域稀疏性的问题。
其中表示
区域内的第j个点,其需要通过上述公式进行区域归一化映射,k表示第
附近拥有k个领域点,d表示点代表的维度信息,n则是总的点数。这个模块的功能,作者并没有进行过多的消融实验,如加入这个模块后,其他网络的性能是否有提升等,所以其泛用性还有待验证。
总结
本文介绍了3D目标检测中Point-Based方法中的Backbone处理方法,介绍常用backbone PointNet,PointNet++及其发展PointNeXt和PointMLP。这些种类的方法其实都是基于MLP和pooling层的结构,除此之外,也有许多方法如PointCNN尝试使用CNN来处理点云,和DGCNN尝试使用图网络来处理点云等。
相关文章:
3D目标检测(一)—— 基于Point-Based方法的PointNet系列
3D目标检测(一)—— PointNet,PointNet,PointNeXt, PointMLP 目录 3D目标检测(一)—— PointNet,PointNet,PointNeXt, PointMLP 前言 零、网络使用算法 …...
《设计模式》策略模式
策略模式 前言 先了解一下设计模式的几种类似: 行为型设计模式(Behavioral Design Pattern)是指一组设计模式,它们关注的是对象之间的通信和协作。行为型设计模式描述了对象之间的职责分配和算法的封装,以及如何在运…...

【离散数学】1. 数理逻辑
1.数理逻辑 2. 集合论 3. 代数系统 4. 图论 离散数学:研究离散量结构及相互关系的学科 数理逻辑集合论代数系统图论 逻辑:研究推理的科学 数学方法:引进一套符号系统的方法 数理逻辑是用数学方法研究形式逻辑的科学,即使用符号化…...

Java8新特性学习
Java8新特性学习为啥使用Lambda表达式Lambda表达式的基础语法无参无返回有参无返回一个参数多参单个语句体类型推断四大内置核心函数式接口其他接口方法引用与构造器引用Stream简介什么是StreamStream操作步骤创建Stream中间操作终止操作(终端操作)归约与收集并行流…...
SPARK outputDeterministicLevel的作用--任务全部重试或者部分重试
背景 目前spark的repartition()方法是随机分配数据到下游,这会导致一个问题,有时候如果我们用repartition方法的时候,如果任务发生了重试,就有可能导致任务的数据不准确,那这个时候改怎么解决这个问题呢? …...

图数据库中的 OLTP 与 OLAP 融合实践
在一些图计算的场景下,我们会遇到同时需要处理 OLTP 和 OLAP 的问题。而本文就给了一个 OLTP 与 OLAP 融合实践的指导思路,希望给你带来一点启发。 Dag Controller 介绍 Dag Controller 是 NebulaGraph 企业版的图系统,经过反复测试无误后已…...

Shader Graph简介
使用着色器(shader)和材质(material),我们能够创造出非常多有趣的效果。除了Unity自带的shader外,还可以自己编写shader或使用其他人所编写的shader。编写shader通常需要我们了解shader编程语言的语法和相关…...

kubectl
目录 一、陈述式资源管理方法 二、基本信息查看 2.1 基本信息查看格式 2.2 查看master节点组件状态 2.3 查看命名空间 2.4 创建/查看命名空间 2.5 删除(重启)命名空间/pod 2.6 查看资源的详细信息 2.7 创建副本控制器来启动Pod 2.8 查看指定命…...

实验室设计SICOLAB第三方检测中心实验室设计
第三方检测中心实验室怎么设计?详细设计内容有哪些?功能区域有哪些?仪器有哪些?要多少面积?第三方检测中心实验室是一种独立的实验室,为客户提供各种测试和分析服务。以下是一个第三方检测中心实验室的详细…...
GPS经纬度转距离
function [pN, pE] distance_gps(lon1, lon2, lat1, lat2)d2r pi/180; % deg转radR 6371000.0; % 地球半径pN (lat2 - lat1) * d2r * R;pE (lon2 - lon1) * d2r * R * cos(lat2 * d2r); end...
7-周赛333总结
7-周赛333总结 还是只过了前两题,第三题又写了好久好久,然后也不知道错在了哪里,只过了部分题解,也许是思考不全面吧。下次也许先做第四题更好…第四题今天花了点时间 做出来了个大概 开心 :happy: 合并两个二维数组 - 求和法【…...
电子招标采购系统源码—互联网+招标采购
智慧寻源 多策略、多场景寻源,多种看板让寻源过程全程可监控,根据不同采购场景,采取不同寻源策略, 实现采购寻源线上化管控;同时支持公域和私域寻源。 询价比价 全程线上询比价,信息公开透明,可…...
SQL注入和XSS攻击
1、SQL注入 所谓SQL注入,就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。 我们永远不要信任用户的输入,我们必须认定用户输入的数据都是不安全的,我们都需要对用户输…...
js Map的使用
前言:Map数据集可以理解为加强版的对象 一、for...of 1、对象不能用于for of,因其没有部署Iterator接口;其他数据集如:数组、Map、Set、Iterator对象等都可以用for...of2、使用for...of的优势: for of的循环体中可以…...
企业应该怎么管理香港服务器?
做好服务器管理,往往能为站长避免很多麻烦。用户租用服务器,除了希望它快速而安全,还有就是如何才能得到优质及时的售后和指导建议了。服务器供应商只提供服务器管理的基础服务,负责提供硬件、带宽和电力等服务,服务器…...

软件设计(十四)-UML建模(上)
软件设计(十三)-原码、反码、补码、移码https://blog.csdn.net/ke1ying/article/details/129115844?spm1001.2014.3001.5501 UML建模包含:用例图,类图与对象图,顺序图,活动图,状态图ÿ…...

本地主机搭建服务器后如何让外网访问?快解析内网端口映射
本地主机搭建应用、部署服务器后,在局域网内是可以直接通过计算机内网IP网络地址进行连接访问的,但在外网电脑和设备如何访问呢?由于内网环境下,无法提供公网IP使用,外网访问内网就需要一个内外网转换的介质。这里介绍…...

Flink-Table API 和 SQL(基本API、流处理的表、时间属性和窗口、聚合查询、联结查询、函数、SQL客户端、连接到外部系统)
文章目录Table API 和 SQL快速上手基本 API程序架构创建表环境创建表表的查询输出表表和流的转换流处理中的表动态表和持续查询将流转换成动态表原理用 SQL 持续查询-更新查询&追加查询将动态表转换为流(Append-only、Retract、Upsert)时间属性和窗口事件时间处理时间窗口&…...
C++入门:数据抽象
数据抽象是指,只向外界提供关键信息,并隐藏其后台的实现细节,即只表现必要的信息而不呈现细节。数据抽象是一种依赖于接口和实现分离的编程(设计)技术。让我们举一个现实生活中的真实例子,比如一台电视机&a…...
WRF进阶:使用IO选项控制WRF变量输出/WRF指定变量输出添加/删除
Registry文件 WRF模式在运行求解时,会涉及到大量的数据变量运算,而这些数据变量的管理、规定、控制则需要依赖于WRF的Registry文件,简单来说,它可以理解为管理WRF数据结构的“数据字典”("Active data-dictionar…...

【Linux】LInux下第一个程序:进度条
前言: 在前面的文章中我们学习了LInux的基础指令 【Linux】初见,基础指令-CSDN博客【Linux】初见,基础指令(续)-CSDN博客 学习了vim编辑器【Linux】vim编辑器_linux vim insert-CSDN博客 学习了gcc/g【Linux】编译器gc…...
46、web实验-遍历数据与页面bug修改
46、web实验-遍历数据与页面bug修改 在Web开发中,遍历数据和修改页面bug是常见的任务。以下是关于这两个主题的讲解: ### 一、遍历数据 **目的**:在页面上动态展示数据,例如用户列表、商品信息等。 **常用方法**: ####…...

国产pcie switch 8748+飞腾/龙芯/昇腾高速存储方案设计
方案概述 本设计以国微PCIe Switch 8748为核心交换芯片,通过多端口PCIe 4.0/5.0通道连接飞腾ARM架构处理器、龙芯LoongArch处理器及昇腾AI加速卡,构建支持NVMe协议的高速存储集群,目标实现6.5GB/s以上的可持续带宽。 硬件架构 处理器选型 飞…...

2025服装收银系统推荐:智能管理助力服装商家高效经营
在服装批发零售行业,一套高效的收银系统不仅能简化日常经营流程,还能通过数据分析帮助商家优化库存、提升销售。随着AI技术的普及,现代收银系统已不再局限于简单的记账功能,而是能提供智能选品、库存预警、精准营销等进阶服务。 …...

【Python 算法零基础 4.排序 ⑨ 堆排序】
目录 一、问题描述 二、算法对比 1.朴素算法 ① 数组模拟容器 ② 有序数组模拟容器 2.二叉堆 ① 二叉堆特点 ② 数组表示二叉树 ③ 堆 ④ 大顶堆 ⑤ 小顶堆 ⑥ 元素插入 ⑦ 获取堆顶 ⑧ 堆顶元素删除 三、代码分析 1.工具函数 2.调整大顶堆函数 Ⅰ、计算子节点索引 Ⅱ、找出最…...

贝叶斯深度学习!华科大《Nat. Commun.》发表BNN重大突破!
华科大提出基于贝叶斯深度学习的超分辨率成像,成功被Nat. Commun.收录。可以说,这是贝叶斯神经网络BNN近期最值得关注的成果之一了。另外还有AAAI 2025上的Bella新框架,计算成本降低了99.7%,也非常值得研读。 显然鉴于BNN“不确定…...

OPenCV CUDA模块光流------高效地执行光流估计的类BroxOpticalFlow
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 cv::cuda::BroxOpticalFlow 是 OpenCV CUDA 模块中实现Brox光流算法的类。该类用于在 GPU 上高效地计算两帧图像之间的稠密光流(Dens…...

在MATLAB中使用自定义的ROS2消息
简明结论: 无论ROS2节点和MATLAB运行在哪,MATLAB本机都必须拥有自定义消息源码并本地用ros2genmsg生成,才能在Simulink里订阅这些消息。只要你想让MATLAB或Simulink能识别自定义消息,必须把消息包源码(.msg等)拷到本机指定目录&a…...

机器人玩转之---嵌入式开发板基础知识到实战选型指南(包含ORIN、RDK X5、Raspberry pi、RK系列等)
1. 基础知识讲解 1.1 什么是嵌入式开发板? 嵌入式开发板是一种专门设计用于嵌入式系统开发的硬件平台,它集成了微处理器、内存、存储、输入输出接口等核心组件于单块印刷电路板上。与传统的PC不同,嵌入式开发板具有体积小、功耗低、成本适中…...

基于有效集MPC控制算法的直线同步电机simulink建模与仿真,MPC使用S函数实现
目录 1.课题概述 2.系统仿真结果 3.核心程序 4.系统仿真参数 5.系统原理简介 6.参考文献 7.完整工程文件 1.课题概述 有效集算法通过迭代地选择一组 "有效" 约束,将约束优化问题转化为一系列无约束或等式约束优化问题。直线同步电机 (Linear Synch…...