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

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

  • 20
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值