PointNet++改进策略 :模块改进 | SPVConv, 体素和点云特征融合提升小目标检测能力

news2024/11/15 11:24:19
  • 论文题目:Searching Efficient 3D Architectures with Sparse Point-Voxel Convolution
  • 发布期刊:ECCV
  • 通讯地址:麻省理工 & 清华大学
  • 代码地址:https://github.com/mit-han-lab/spvnas
    Pasted image 20240913094529

介绍

这篇论文的主题是如何为自驾车等应用场景设计高效的3D架构。论文提出了一个名为“稀疏点-体素卷积”(Sparse Point-Voxel Convolution, SPVConv)的3D深度学习模块,旨在在硬件资源有限的情况下提高3D感知模型对小目标(如行人和骑行者)的识别性能。传统的体素化方法由于分辨率低或过度下采样,导致模型难以识别这些小目标。SPVConv通过在标准的稀疏卷积基础上引入高分辨率的点云分支,显著提升了对细节的捕捉能力,并且计算开销很小。

为了进一步优化3D模型,论文还提出了3D神经架构搜索(3D-NAS)方法,它能够在一个多样化的设计空间中搜索出最优的3D网络架构。实验结果表明,基于SPVConv的SPVNAS模型在速度和准确性上均优于当前的最先进模型,如MinkowskiNet,在语义分割任务中提升了3.3%的mIoU,并实现了8倍的计算效率提升和3倍的推理速度加快。此外,SPVNAS还被成功应用于3D目标检测任务中,表现出了一致的性能提升。

总结来看,该论文的贡献包括:

  1. 设计了一个轻量级的3D卷积模块SPVConv,专门提升在硬件资源受限情况下对小目标的识别能力。
  2. 提出了首个用于3D场景理解的自动化机器学习框架3D-NAS,能够在给定资源约束下找到最优3D模型。
  3. 实验结果表明,该方法在多个数据集上的性能优于以往方法,并在语义KITTI排行榜上取得了第一名的成绩。

Pasted image 20240913094539
Pasted image 20240913094552

核心思想

SPVConv

SPVConv(Sparse Point-Voxel Convolution)的核心思想是在稀疏卷积的基础上,引入一个高分辨率的点云分支,以解决传统3D卷积方法中由于低分辨率体素化或过度下采样导致小目标识别能力不足的问题。具体来说,SPVConv通过结合稀疏体素卷积和点云卷积,实现了在保持高效计算的同时,更好地捕捉场景中的细节信息。
Pasted image 20240913094938
SPVConv的核心思想可以分为以下几个方面:

  1. 稀疏体素卷积:稀疏卷积通过只对非空体素执行卷积运算,减少了计算开销,并且能够在较大场景中保持较高的空间分辨率。稀疏卷积方法有效地利用了3D数据的稀疏性,减少了对无关区域的计算。

  2. 高分辨率点云分支:为了弥补稀疏卷积在处理小目标时的不足,SPVConv加入了一个点云分支。这个分支处理高分辨率的点云数据,不需要像体素化那样通过下采样来减少数据量,因此能够保留更多的细节信息,特别是针对小目标(如行人、自行车)的细节。

  3. 体素化和去体素化操作:SPVConv通过体素化(将点云数据转换为体素网格)和去体素化(将稀疏体素特征重新映射回点云空间)操作,在两个分支之间交换信息。这种操作成本很低,但可以让稀疏卷积和点云卷积分支共享和融合特征,从而提升整体的表现。

  4. 特征融合:稀疏体素分支和高分辨率点云分支的特征在每一层进行融合。稀疏卷积为场景提供全局上下文信息,而点云分支则为小目标和边缘区域提供细粒度的特征表示。两者的融合使得模型在保持全局感知能力的同时,增强了对细节的捕捉能力。

通过这种稀疏体素和高分辨率点云相结合的方式,SPVConv不仅减少了计算负担,而且提高了对细节的识别能力,特别是对于复杂场景中的小目标。

3D-NAS

3D-NAS(3D Neural Architecture Search)的核心思想是通过自动化的神经架构搜索(NAS)技术,针对3D场景理解任务找到最优的网络架构,从而在满足特定资源约束的条件下,最大化3D模型的性能。与手工设计网络相比,3D-NAS能够高效搜索并优化模型,使其在计算资源受限的环境中(例如自驾车系统的低功耗需求)保持高准确性和低延迟。

Pasted image 20240913095632
3D-NAS的核心思想可以总结为以下几个关键点:

1. 定义搜索空间

3D-NAS首先定义了一个灵活的网络架构搜索空间,包括网络层的通道数量网络深度等设计参数。这些参数控制着每一层的卷积通道数和模型的深浅,从而允许搜索算法在一个多样化的架构空间中寻找最佳配置。

  • 细粒度的通道数选择:不同于传统NAS中对通道数的粗粒度调整(如只提供2-3个选项),3D-NAS提供了更多通道数的选项,从而增加了架构的多样性。
  • 弹性的网络深度:3D-NAS允许搜索不同的网络深度,这可以通过调整每个阶段使用的卷积层数量来实现。这种弹性网络深度有助于平衡模型的计算量和性能。
2. 超网络训练和权重共享

为了降低搜索过程中重复训练不同架构的成本,3D-NAS采用了超网络(super network)训练的方式。超网络包含了所有候选网络的架构,在训练过程中每个子网络共享权重。这样,经过一次超网络的训练后,可以直接从中提取不同的子网络并进行评估,无需从头开始训练每个网络。

  • 权重共享:通过在超网络中共享不同架构的权重,所有候选模型都能从同一组权重中获益,极大地减少了训练时间。
  • 随机采样:每次训练迭代中,随机采样一个子网络进行优化,以确保整个搜索空间中的所有模型都能被充分训练。
3. 渐进式深度缩减(Progressive Depth Shrinking)

在搜索过程中,深度较大的网络架构往往因为被采样到的概率较小而训练不足。为了解决这一问题,3D-NAS采用了渐进式深度缩减策略。训练过程被分为多个阶段,每个阶段允许的网络深度逐渐增加,从而确保深层次的网络架构有更多的训练机会。

4. 进化搜索算法

在搜索阶段,3D-NAS使用进化算法来找到满足特定计算资源约束(如计算量、延迟等)的最优网络架构。进化算法通过模拟自然选择,基于候选网络的性能(如在验证集上的准确性)逐步优化架构:

  • 种群初始化:从搜索空间中随机选择若干个初始架构作为种群。
  • 适应度评估:对种群中的所有架构进行评估,根据性能选择最优的个体。
  • 变异和交叉:通过变异和交叉操作生成新的架构,逐步进化出性能更好的网络。
5. 基于资源约束的搜索

3D-NAS通过进化搜索,在给定的资源约束(如计算量和延迟)下,自动找到最优架构。由于3D卷积网络的计算复杂性不仅取决于输入大小,还受输入稀疏性的影响,3D-NAS采用了精确的计算估计方法,确保搜索到的网络满足预设的资源限制。

核心代码实现讲解

SPVCNN 是一种结合了体素(Voxel)和点云(Point Cloud)的 3D 神经网络架构,旨在高效处理稀疏的 3D 点云数据。其设计灵感和实现与 SPVConv 的核心思想紧密相关。SPVConv 通过稀疏卷积和点云卷积相结合,提升对大规模 3D 场景中细节和小物体的捕捉能力,同时在计算资源有限的情况下保证计算效率。下面将结合 SPVCNN 的代码结构,详细解析与 SPVConv 核心思想的关联。

SPVCNN 通过体素卷积(Voxel-based convolution)和点云卷积(Point-based convolution)相结合的方式,在稀疏点云数据中平衡全局上下文信息和局部细节捕捉。

1. 稀疏卷积与体素化操作

SPVCNN 中,大量操作使用稀疏卷积来处理体素化后的点云数据。首先,输入数据被转换成体素网格形式,然后通过稀疏卷积网络进行处理。这种设计通过 BasicConvolutionBlockResidualBlock 来实现卷积操作:

class BasicConvolutionBlock(nn.Module):
    def __init__(self, inc, outc, ks=3, stride=1, dilation=1):
        super().__init__()
        self.net = nn.Sequential(
            spnn.Conv3d(inc, outc, kernel_size=ks, dilation=dilation, stride=stride),
            spnn.BatchNorm(outc),
            spnn.ReLU(True),
        )
    def forward(self, x):
        out = self.net(x)
        return out

Conv3dBatchNorm 用于处理稀疏体素数据,并通过稀疏卷积在局部区域进行有效的特征提取。卷积核大小、步长和膨胀率可以调整,以适应不同尺度的体素数据。这与 SPVConv 中通过稀疏卷积处理体素的思想一致。

2. 点云卷积和特征转换

SPVCNN 中,体素卷积后的数据通过点云卷积进行处理,以保留高分辨率细节。这种操作通过 voxel_to_pointpoint_to_voxel 函数将体素数据和点云数据相互转换:

z0 = voxel_to_point(x0, z, nearest=False)
z1 = voxel_to_point(x4, z0)
z2 = voxel_to_point(y2, z1)

这些函数将体素特征转换回点云形式,允许点云卷积分支处理局部区域的高分辨率信息。通过 point_transforms 模块,可以进一步提取和转换点云特征:

self.point_transforms = nn.ModuleList([
    nn.Sequential(
        nn.Linear(cs[0], cs[4]),
        nn.BatchNorm1d(cs[4]),
        nn.ReLU(True),
    ),
    ...
])

这种设计与 SPVConv 的点云分支相匹配,确保在稀疏卷积处理的同时,仍然可以通过高分辨率的点云特征捕捉细节,特别是小物体的特征。

3. 多尺度特征融合

SPVCNN 中通过编码和解码的结构,将多尺度特征进行融合。编码部分(stage1stage4)通过逐步下采样体素数据来捕捉更大的上下文信息;解码部分(up1up4)通过上采样将特征恢复到高分辨率并结合不同层次的特征进行融合:

y1 = self.up1[0](y1)
y1 = torchsparse.cat([y1, x3])  # 将上采样后的特征与编码阶段的特征结合
y1 = self.up1[1](y1)

解码过程中,使用 BasicDeconvolutionBlock 来执行反卷积(即上采样)操作,确保高分辨率的特征在最终输出中得以恢复和利用。这与 SPVConv 中通过稀疏卷积捕捉全局上下文,并通过点云分支捕捉局部细节的思想是一致的。

4. 跳跃连接(Skip Connections)与残差块(Residual Block)

残差块(ResidualBlock)在网络中通过跳跃连接(skip connections)将输入特征与输出特征相加,使得深层网络能够保留浅层网络的特征,这一设计能够缓解梯度消失问题,确保深层网络的有效训练:

class ResidualBlock(nn.Module):
    def __init__(self, inc, outc, ks=3, stride=1, dilation=1):
        super().__init__()
        self.net = nn.Sequential(
            spnn.Conv3d(inc, outc, kernel_size=ks, dilation=dilation, stride=stride),
            spnn.BatchNorm(outc),
            spnn.ReLU(True),
            spnn.Conv3d(outc, outc, kernel_size=ks, dilation=dilation, stride=1),
            spnn.BatchNorm(outc),
        )
        if inc == outc and stride == 1:
            self.downsample = nn.Identity()  # 如果输入输出通道一致,则直接传递
        else:
            self.downsample = nn.Sequential(
                spnn.Conv3d(inc, outc, kernel_size=1, dilation=1, stride=stride),
                spnn.BatchNorm(outc),
            )
        self.relu = spnn.ReLU(True)

残差结构的使用,确保了深度卷积网络在训练时的稳定性,同时也让不同层次的特征得以保留和融合,体现了多尺度特征融合的思想。

如何改进PointNet++

在改进 PointNet++ 时,结合 SPVConv 的思想,可以提升对局部细节和全局上下文的捕捉能力,特别是在处理稀疏点云数据和小物体时具有优势。SPVConv 提供了稀疏卷积与点云卷积结合的策略,这可以有效增强 PointNet++ 对空间结构的理解。

稀疏卷积与多尺度特征融合

改进思路
PointNet++ 使用的多尺度特征聚合(MSA)在局部区域进行聚类和特征提取时,忽略了点云数据的稀疏性和局部细节。在每个局部区域内使用 SPVConv,可以通过稀疏卷积操作有效地捕捉局部几何结构,同时结合 PointNet++ 原有的特征聚合方式。

改进方案

  • 在 PointNet++ 的每个 Set Abstraction(SA)层 中,首先对局部点云数据进行稀疏体素化,将局部点云映射到体素网格。
  • 然后,通过 SPVConv 对体素数据进行稀疏卷积处理,提取更具全局和局部信息的特征。
  • 结合稀疏卷积的特征,再通过 PointNet++ 的聚类和池化操作,进一步提取局部的几何特征。

优点

  • SPVConv 可以利用稀疏数据结构提高计算效率,同时通过卷积核捕捉局部几何信息,从而增强 PointNet++ 对局部点云的特征提取能力。
  • 这种改进可以提升对小物体和稀疏点云的感知能力。

全局上下文信息的融合

改进思路
PointNet++ 的特征聚合方法主要依赖于逐层聚集的局部信息,缺乏全局上下文的融合能力。SPVConv 可以在多尺度体素化的基础上引入全局上下文感知机制,增强模型对场景级别特征的理解。

改进方案

  • 在 PointNet++ 的 Global Feature Aggregation(全局特征聚合)层 中,使用 SPVConv 对整个场景进行体素化,然后通过稀疏卷积捕捉全局特征。
  • 该全局特征可以与 PointNet++ 的局部特征进行融合,通过跳跃连接或残差连接的方式,将全局上下文信息引入到局部特征中。

优点

  • 这种方式能够有效结合局部细节与全局上下文,弥补 PointNet++ 在全局场景理解上的不足。
  • 特别适合处理大型点云数据集,如自动驾驶中的场景点云。

高效点云分支的融合

改进思路
PointNet++ 逐点处理点云的方式较为耗时,尤其在高分辨率点云数据上计算代价较高。引入 SPVConv 的点云卷积分支,可以通过稀疏卷积降低计算复杂度,同时在局部范围内保留高分辨率的点云信息。

改进方案

  • 将 SPVConv 的稀疏卷积和高分辨率点云分支引入 PointNet++ 中。对于每个点云片段(clustered region),先通过体素卷积获取稀疏特征,再通过点云分支进行高分辨率处理。
  • 最后,将稀疏卷积特征和点云特征在每个局部片段上进行融合,以增强模型的细节捕捉能力,同时降低计算开销。

优点

  • 稀疏卷积分支提升了对局部结构的理解,而点云分支保留了细节信息,计算效率显著提高。
  • 适用于大规模、高分辨率的点云数据。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2150887.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[译] Go语言的源起,发展和未来

本篇内容是根据2019年9月份Creating the Go programming language音频录制内容的整理与翻译, 两位主持人与Go 的创始人 Rob Pike 和 Robert Griesemer谈论了 Go 的起源、发展、影响和未来。这是一个史诗般的剧集,深入探讨了 Go 的历史和详细信息,以及他们…

手动部署并测试内网穿透(ssh 和 nginx)

原理回顾 首先需要一台连接了公网的云服务器,然后我们要访问的内网穿透对象最好是Linux服务器,比如虚拟机,然后我们通过向云服务器发送指令,云服务器再将指定发送给指定对象,让其能够执行命令。 总结就是&#xff1a…

数据结构与算法——Java实现 6.递归

要学会试着安静下来 —— 24.9.17 一、递归的定义 计算机科学中,递归是一种解决计算问题的方法,其中解决方案取决于同一类问题的更小子集 说明: ① 自己调用自己,如果说每个函数对应着一种解决方案,自己调用自己意味着解决方案是…

数据建模无法满足复杂业务需求?别慌,数据开发平台可以完美互补!

前言 数据可视化建模无论是对于企业的数字化转型,还是对数据资源的价值开发来说,都是至关重要的工具,小兵在前文《数据可视化建模平台介绍》。中有详细介绍过他的能力,包括面向多源异构的企业数据,为企业提供数据集成…

web基础—dvwa靶场(十一)CSP Bypass

CSP Bypass(CSP 绕过) 内容安全策略(CSP)用于定义脚本和其他资源可以从何处加载或执行,本模块将指导您根据开发人员犯下的常见错误来绕过该策略。 这些漏洞都不是 CSP 中的实际漏洞,它们都是实现 CSP 的方式中的漏洞。 绕过内容安…

xtop:如何debug fail reason

我正在「拾陆楼」和朋友们讨论有趣的话题,你⼀起来吧? 拾陆楼知识星球入口 fix_xx_violations之后,工具会报告fail reason summary,通过man reason_name可以获知fail原因&#x

STM32(十六):MPU6050简介

MPU6050 MPU6050是一个6轴姿态传感器,可以测量芯片自身X、Y、Z轴的加速度、角速度参数,通过数据融合,可进一步得到姿态角,常应用于平衡车、飞行器等需要检测自身姿态的场景。 3轴加速度计(Accelerometer&#…

攻防世界--->gametime

做题笔记。 前言: 因为有意思,所以,,,打通关了。。哈哈哈。 题外话:哦,程序结果还在,是因为我是在WSL—Debian上运行的。你还别说,真挺好用的,vm虚拟机能不…

Node-RED和物联网分析:实时数据处理和可视化平台

这篇论文的标题是《Node-RED and IoT Analytics: A Real-Time Data Processing and Visualization Platform》,发表在《Tech-Sphere Journal of Pure and Applied Sciences (TSJPAS)》2024年第一期上。论文主要探讨了Node-RED和物联网分析在物联网(IoT)实时数据处理…

列表、数组排序总结:Collections.sort()、list.sort()、list.stream().sorted()、Arrays.sort()

列表类型 一.Collections.sort() Collections.sort()用于List类型的排序&#xff0c;其提供了两个重载方法&#xff1a; 1.sort(List<T> list) &#xff08;1&#xff09;List指定泛型时只能指定引用数据类型&#xff0c;也就是说无法用于基本数据类型的排序。 &am…

9.20作业

手动封装一个顺序表&#xff08;SeqList&#xff09;,分文件编译实现 有私有成员&#xff1a; 顺序表数组的起始地址 ptr、 顺序表的总长度&#xff1a;size、顺序表的实际长度&#xff1a;len 成员函数&#xff1a; 初始化 init(int n) 判空&#xff1a;empty 判满&#xff1…

Rust语言入门第七篇-控制流

文章目录 Rust语言入门第七篇-控制流If 表达式基本结构特点和规则示例 let 语句中使用 ifloop 循环基本结构特点示例综合示例 while 循环基本结构特点示例综合示例 与 loop 循环的区别 for 循环基本结构详细说明特点示例综合示例 match 表达式match表达式的语法结构示例代码 Ru…

Mysql存储过程详细解读

目录 存储过程介绍 创建与调用 查看与删除 变量 系统变量 用户自定义变量 ​编辑局部变量 ​编辑​编辑IF判断 存储过程参数​编辑​编辑​编辑 CASE ​编辑 WHILE​编辑 ​编辑REPEAT​编辑​编辑 LOOP 游标 条件处理程序 存储函数 存储过程介绍 创建与调用 查…

GNN-RAG:用于大模型推理的图神经检索

GNN-RAG&#xff1a;用于大模型推理的图神经检索 秒懂大纲提出背景解法拆解全流程优化创意总结 论文&#xff1a;GNN-RAG: Graph Neural Retrieval for Large Language Model Reasoning 代码&#xff1a;https://github.com/cmavro/GNN-RAG 秒懂大纲 ├── GNN-RAG【主题】…

【刷题日记】43. 字符串相乘

43. 字符串相乘 其实就是大数乘法题&#xff0c;这道题用草稿纸演练一下&#xff0c;其实很好找到方法&#xff0c;模拟大数乘法即可。需要注意的是进位和迭代值&#xff0c;还有注意向下取整和去除前导0&#xff08;容易遗漏&#xff09;。去除前导0的时候还要注意如果全是0&…

命令行运行python时找不到模块怎么解决

问题&#xff1a; 新建了一个项目&#xff0c;目录结构如下&#xff1a; 然后在pycharm中运行glovar是没有问题的&#xff0c;但是在命令行中运行就会提示找不到init模块。 这是因为在pycharm中运行的时候&#xff0c;pycharm会自动将项目所在目录添加到了sys.path中&#xf…

天宝Trimble RealWorks2024.0.2注册机 点云后处理软件 点云三维重建软件

一、功能特色 1、强大的点云数据处理平台 Trimble Realworks2024是市面上先进的点云数据处理软件&#xff0c;能够配准、可视化、浏览和直接处理市面上几乎所有主流品牌扫描仪点云数据&#xff0c;包括Leica、Riegl、ZF、Faro、Topcon等。 2、业界领先的无目标全自动配准 T…

Apache Flink 流批融合技术介绍

摘要&#xff1a;本文整理自阿里云高级研发工程师、Apache Flink Contributor 周云峰老师在 Apache Asia CommunityOverCode 2024中的分享。内容主要分为以下三个部分&#xff1a; 从流批一体到流批融合流批融合的技术解决方案社区进展及未来展望 一、从流批一体到流批融合 1&…

记忆化搜索专题——算法简介力扣实战应用

目录 1、记忆化搜索算法简介 1.1 什么是记忆化搜索 1.2 如何实现记忆化搜索 1.3 记忆化搜索与动态规划的区别 2、算法应用【leetcode】 2.1 题一&#xff1a;斐波那契数 2.1.1 递归暴搜解法代码 2.1.2 记忆化搜索解法代码 2.1.3 动态规划解法代码 2.2 题二&#xff1…

网络模型的保存与读取

文章目录 一、模型的保存二、文件的加载三、模型加载时容易犯的陷阱 一、模型的保存 方式1:torch.save(vgg16, “vgg16_method1.pth”) import torch import torchvision.modelsvgg16 torchvision.models.vgg16(pretrainedFalse) torch.save(vgg16, "vgg16_method1.pth…