首页 > 其他分享 >PointNet++改进策略 :模块改进 | SWA| PVT,融入Transformer的点云与体素的模块同时提升模型精度和效率

PointNet++改进策略 :模块改进 | SWA| PVT,融入Transformer的点云与体素的模块同时提升模型精度和效率

时间:2024-09-11 10:53:30浏览次数:13  
标签:Transformer PVT 特征 self 改进 模块 点云 体素 features

目录

Pasted image 20240911104414

  • 论文题目:PVT: Point-Voxel Transformer for Point Cloud Learning
  • 发布期刊:International Journal of Intelligent Systems
  • 通讯地址:杭州电子科技大学&伦敦大学学院
  • 代码地址:https://github.com/HaochengWan/PVT

介绍

这篇论文的主要内容是提出了一种新的点云学习架构,名为点体素变换器(Point-Voxel Transformer, PVT)。PVT结合了基于点的方法和基于体素的方法的优点,通过引入稀疏窗口注意力(Sparse Window Attention, SWA)模块,能够高效地从3D数据中捕获有用的特征。

论文的主要贡献包括:

  1. 提出PVT架构:这是第一个将基于点和基于体素的网络优势深度结合的Transformer方法。
  2. 引入稀疏窗口注意力(SWA)模块:该模块实现了与输入体素分辨率线性相关的计算复杂度,同时避开了空体素的无效计算。
  3. 实验验证了PVT的有效性:在多种点云学习任务(如分类和语义分割)上,PVT显示出了竞争力,并实现了相较于其他基于变换器模型10倍的推理速度提升。

PVT原理

Point-Voxel Transformer (PVT) 是一种用于点云学习的新型神经网络架构。它结合了基于点(point-based)和基于体素(voxel-based)的方法的优点,旨在提高点云数据处理的效率和性能。

PVT的核心思想和结构

  1. 结合点和体素的优势

    • 基于点的方法:直接在点云数据上进行操作,可以保留每个点的精确位置和细节信息,但是计算代价较高,尤其是在处理大规模点云数据时。
    • 基于体素的方法:通过将点云数据转换为规则的三维网格(体素),使用3D卷积神经网络进行特征提取。这种方法计算效率高,但在体素化过程中会丢失细粒度的位置信息。

    PVT 通过融合这两种方法的优势,既保持了高效的计算性能,又保留了点云的精确位置信息。

  2. 稀疏窗口注意力模块(Sparse Window Attention, SWA)

    • PVT引入了一个新的模块——稀疏窗口注意力(SWA),它能够在非空体素内局部聚合特征,避免了对空体素的无效计算,从而降低了计算复杂度。SWA的计算复杂度与体素分辨率线性相关,而不是传统方法的平方复杂度。
      Pasted image 20240911094501
图 稀疏窗口注意力模块(Sparse Window Attention, SWA)
  1. 双分支架构
    • 体素分支(Voxel Branch):负责从体素空间中聚合局部特征。体素分支使用SWA模块在体素网格内进行局部注意力计算,从而高效地提取局部特征。
    • 点分支(Point Branch):直接在点云数据上执行自注意力(self-attention)计算,捕获全局特征。该分支使用了两种不同的自注意力变体来处理不同尺度的点云数据:一种是相对注意力(Relative Attention, RA),用于小规模点云;另一种是外部注意力(External Attention, EA),用于大规模点云。

PVT模块结构

Pasted image 20240911094721

  1. 输入点云数据:将原始点云数据输入网络。
  2. 体素分支处理
    • 将点云数据体素化,形成稀疏体素结构。
    • 使用稀疏窗口注意力(SWA)在局部体素窗口中计算局部特征。
    • 应用循环窗口机制以增强跨窗口的信息交互。
    • 将体素特征解体素化,映射回点空间。
  3. 点分支处理
    • 根据点云数据规模,使用相对注意力(RA)或外部注意力(EA)计算全局特征。
  4. 特征融合
    • 将体素分支的局部特征和点分支的全局特征相加,得到融合的特征表示。
  5. 输出:根据任务(如点云分类或语义分割)生成最终的结果。

体素分支

  • 目的:用于提取点云数据的局部特征。
  • 体素化(Voxelization)
    • 将点云数据 PPP 转换为规则的三维网格或体素格式。每个体素包含一个或多个点,并生成一个稀疏体素结构表示。
  • 稀疏窗口注意力模块(Sparse Window Attention, SWA)
    • PVT引入了一个新的模块——稀疏窗口注意力(SWA),它能够在非空体素内局部聚合特征,避免了对空体素的无效计算,从而降低了计算复杂度。SWA的计算复杂度与体素分辨率线性相关,而不是传统方法的平方复杂度。
  • 循环窗口机制(Shifted Window Mechanism)
    • 使用循环窗口方法跨窗口聚合信息,这样能够在多个非重叠窗口之间进行信息交换,进一步提高特征提取的有效性和模型的感受野。
  • 解体素化(Devoxelization)
    • 将聚合后的体素特征映射回原始点云的特征空间,得到体素分支提取的局部特征。

点分支

  • 目的:用于提取点云数据的全局特征。
  • 相对注意力(Relative Attention, RA)
    • 适用于小规模点云数据。通过在点云数据上直接计算自注意力,同时引入相对位置表示(Relative Position Representations, RPR),使得模型在处理刚性变换时具有更好的鲁棒性。
  • 外部注意力(External Attention, EA)
    • 适用于大规模点云数据。EA是一种线性注意力机制,通过使用两个小型可学习的共享存储单元,以避免平方复杂度(O(N^2)),使其更适合大规模点云数据的处理。

代码实现

下面是实现PVT模块的具体细节,详细可以参照github中的代码

class PVTConv(nn.Module):
    def __init__(self, in_channels, out_channels, kernel_size, resolution, normalize=True, eps=0):
        super().__init__()
        # 初始化输入和输出通道、卷积核大小、分辨率、归一化参数
        self.in_channels = in_channels  # 输入特征的通道数
        self.out_channels = out_channels  # 输出特征的通道数
        self.kernel_size = kernel_size  # 卷积核大小
        self.resolution = resolution  # 体素分辨率
        self.boxsize = 3  # 体素化窗口大小
        self.mlp_dims = out_channels  # MLP的输出维度
        self.drop_path1 = 0.1  # Dropout路径1的比例
        self.drop_path2 = 0.2  # Dropout路径2的比例
        
        # 体素化模块,用于将点云数据转换为体素网格
        self.voxelization = Voxelization(resolution, normalize=normalize, eps=eps)
        # 体素编码器模块,用于编码体素化后的特征
        self.voxel_encoder = VoxelEncoder(in_channels, out_channels, kernel_size, resolution, self.boxsize,
                                          self.mlp_dims, self.drop_path1, self.drop_path2)
        # 3D注意力模块,用于增强体素特征
        self.SE = SE3d(out_channels)
        # 共享变换器模块,用于在点特征中引入全局上下文信息
        self.point_features = SharedTransformer(in_channels, out_channels)

    def forward(self, inputs):
        # 输入包括原始特征(features)和点的坐标(coords)
        features, coords = inputs

        # 将输入特征进行体素化,得到体素特征(voxel_features)和对应的体素坐标(voxel_coords)
        voxel_features, voxel_coords = self.voxelization(features, coords)
        
        # 对体素特征进行编码,通过体素编码器提取特征
        voxel_features = self.voxel_encoder(voxel_features)
        # 通过3D注意力模块增强体素特征
        voxel_features = self.SE(voxel_features)
        # 对体素特征进行反体素化操作,将其映射回点云特征空间
        voxel_features = F.trilinear_devoxelize(voxel_features, voxel_coords, self.resolution, self.training)
        
        # 计算相对位置,用于相对注意力计算
        pos = coords.permute(0, 2, 1)  # 将点的坐标从(B, N, 3)转换为(B, 3, N)的形状
        rel_pos = pos[:, :, None, :] - pos[:, None, :, :]  # 计算相对位置矩阵
        rel_pos = rel_pos.sum(dim=-1)  # 计算相对位置的总和
        
        # 将体素特征和点特征融合,得到最终的融合特征
        fused_features = voxel_features + self.point_features(features, rel_pos)
        # 返回融合后的特征和原始点的坐标
        return fused_features, coords

标签:Transformer,PVT,特征,self,改进,模块,点云,体素,features
From: https://blog.csdn.net/u012901740/article/details/142133744

相关文章

  • PointNet++改进策略 :模块改进 | x-Conv | PointCNN, 结合局部结构与全局排列提升模型性
    目录前言PointCNN实现细节1.XXX-Conv操作输入输出步骤2.PointCNN网络架构层级卷积分类与分割任务......
  • 解决python封装Logging模块后,log位置显示错误的问题
    引入今天由于项目需要,要将logging库二次封装成一个类,以实现一些自定义的功能。我将二次封装了一个logService类,然后在其中同样也实现info,warn,error等日志函数。额外加了一个将日志存入数据库的功能。大概是像下面这样子:但是在封装的过程中,出现了一个问题:log中,不能正确显......
  • 爆改YOLOv8|利用BiFPN双向特征金字塔改进yolov8
    1,本文介绍BiFPN(BidirectionalFeaturePyramidNetwork)是一种增强特征金字塔网络(FPN)的方法,旨在改善多尺度特征融合。BiFPN的主要创新点包括:双向特征融合:与传统FPN仅在自下而上的方向进行特征融合不同,BiFPN引入了双向融合机制。它不仅从低层特征向高层传递信息,还从高层特征向......
  • opencv学习:模板匹配和argparse 模块的代码实现及优缺点
    模板匹配模板匹配算法(TemplateMatchingAlgorithm),这是一种在图像处理和计算机视觉领域常用的方法,用于在一个大图像中寻找一个小模板图像的位置。模板匹配算法通过滑动窗口的方式在目标图像上移动模板图像,并计算模板图像与目标图像的局部区域之间的相似度。算法步骤读取图......
  • 【深度学习 transformer】基于Transformer的图像分类方法及应用实例
    近年来,深度学习在图像分类领域取得了显著成果。其中,Transformer模型作为一种新型的神经网络结构,逐渐在图像分类任务中崭露头角。本文将介绍Transformer模型在图像分类中的应用,并通过一个实例展示其优越性能。一、引言图像分类是计算机视觉领域的一个重要任务,广泛应用于安......
  • ColchisFM 新模块发布 | ColchisFM-Python开发接口功能模块
    Python作为目前最流行的一种高级编程语言,‌以其易读性和易用性而闻名。‌特别在人工智能和数学计算上,有着天然的优势和丰富的开源算法库。ColchisFM在地质模型构建方面具有智能化、矢量化、可见即可得的特点。自动化建立地层格架,处理复杂正/逆断层、地层尖灭、地层超覆、削截、......
  • dotenv模块引入失败
    一、背景项目中需要加入环境变量到进程中,例如数据库连接地址、ETCD数据等使用dotenv,读取特定的配置文件进行数据的写入。代码如下:importdotenvfrom'dotenv';dotenv.config({path:'./config/.env',});该代码在其他项目使用过,应该是可以跑通的二、现象项目启动的时......
  • 鸿蒙OS模块化开发实战:独立路由与解耦策略
    前言在现代软件开发中,模块化设计是提高项目可维护性和可扩展性的关键。鸿蒙OS以其先进的架构设计,为开发者提供了强大的模块化开发工具。本文将深入探讨如何在鸿蒙OS中实现模块的独立路由配置,以降低模块间的耦合度,实现单模块的独立运行和开发。一、架构设计概述一个清晰的......
  • 大模型书籍推荐:大模型黑书《基于GPT-3、ChatGPT、GPT-4等Transformer架构的自然语言处
    一、内容介绍Transformer正在颠覆AI领域。这本书将引导你使用HuggingFace从头开始预训练一个RoBERTa模型,包括构建数据集、定义数据整理器以及训练模型等。《基于GPT-3、ChatGPT、GPT-4等Transformer架构的自然语言处理》分步展示如何微调GPT-3等预训练模型。研究机器翻译、语音转......
  • NLTK英文文本分词的常用模块
    目录1.断句模块:2.分词模块:3.去除文本中的除标点符号:4.去除停用词:5.词频提取与词频绘图: 5.1词频的提取5.2画出词频5.3画出出现频率最高的三个词 6.单词搜索1.断句模块:importnltkfromnltk.tokenizeimportsent_tokenize#英文断句模块#要断句的文本parag......