尧图网络科技YAOTU DIGITAL 获取报价
获取报价
首页 / 资讯中心 / 文章详情

点云分割总结

发布时间:2026/9/25 5:44:14

资讯中心
01
ARTICLE

点云分割总结

点云分割总结
点云分割总结point transformerbackground 标量自注意力和向量自注意力可参考论文标量自注意力向量注意力Point Transformer Layer下采样上采样整体结构point transformer v2group vector attentionPosition Encoding MultiplerPartition-based Pooling分区池化Point Transformer V3z-order聚类补充知识非论文重点点云序列化序列化注意力条件位置编码整体网络结构ptv3代码学习flash attentionOneFormer3DsonataConcertoutonia一、算法定位与目标二、三大核心创新模块1. 因果模态屏蔽 Causal Modality Blinding2. 感知粒度重缩放 Perceptual Granularity Rescale3. 粒度对齐坐标上的3D RoPE旋转位置编码三、训练框架与数据四、能力与下游任务五、关键实验结论point transformerpoint transformer和pointNet属于一个流派基于点对点云进行处理这种结构仅能用于分类和分割任务不能用于目标检测。自注意力机制适合处理点云的原因排列不变性3D点云是无序的即点的顺序不应影响最终的处理结果。自注意力机制天然具有排列不变性因为它通过对所有点对的关系进行建模来处理输入而不依赖于任何特定的输入顺序。捕捉全局上下文点云数据通常覆盖了3D空间中的对象或场景理解这些数据需要捕捉点之间复杂的空间关系。自注意力机制能够有效地捕捉这些关系因为它为每对点赋予一个注意力权重这反映了它们之间的相对重要性。background 标量自注意力和向量自注意力可参考论文标量自注意力矩阵形势的公式如下self attention中QKV同源都是同一个输入经过一个MLP得到的cross attention中KV同源Q非同源真正的原理公式如下其中φ、ψ、α都是线性变换矩阵这里可能不是矩阵 linear projections or MLPsρ是softmax函数。δ是位置编码信息Xi是第i个位置的特征向量Xj是第j个位置的特征向量Yi是第i个位置的输出。∑也代表了多次查询去输入矩阵的每个位置都查询获得加权值最后相加。获得第i个位置的输出向量需要用第i个位置的输入向量分别去每个位置查询这就是query的意义向量注意力公式如下γ、α是线性变换β是向量关系函数例如相减等。⊙是向量点乘。上述的公式也揭示了向量注意力和标量注意力的区别标量注意力中第i个位置到第j个位置查询这个ij的权重是一个数标量而向量注意力中向量关系函数比如相减能够保证这个权重是一个向量这样Xj中的每个元素都能得到一个权重因此这里也从标量的普通相乘变成了⊙向量相乘Point Transformer Layer点云中每个点都和周围最近的N个点进行attention这里是向量自注意力公式向量关系函数是相减所不同的是value位置也加上了位置编码信息这是试验所得作者发现这里加上后效果会有所提升。点云中的每个位置的输入向量本身就是坐标信息这里的位置编码就是对应位置的向量相减计算位置偏置再经过一个θMLP训练得到。Χ(i)是与x_i临近的N个点的集合也就是要与临近的N个点进行特征融合上式中的几个函数主要是mlp或linear如下图所示。下采样图像中上采样下采样一般都是w h方向的点云的上采样、下采样是针对point本质相同实现却无法像规则化的图像特征一样方便。流程如下使用farthest point sample进行点数下采样论文汇总N - N/4fps算法介绍对下采样后的每个点使用KNN找到临近的n个点论文16然后对这16个点的特征进行mlp和local max pooling最后得到的还是N/4点的特征上采样其中input1为上一个模块的输出input2为下采样模块中相等维度Unet结构的下采样过程中对应的层的输出对于input1和input2首先经过一个简单的MLP包括一个线性层以及batch normalization激活函数仍然为ReLU。之后对于input1执行三线性插值得到输入点集P1的超点集P2从而将点集的分辨率提升。之后与input2做简单的skap connection即残差连接之后输出。经过四个上采样模块将输出恢复至N个特征向量整体结构结构如下图可以进行分类或分割上图分割下图分类。分割模型整体类似于unet的对称结构先上采样然后进行下采样与cnn不同这里上下采样所采用的结构分别是transition up和transition down。point transformer v2相比v1主要优化的地方有group vector attention、Position Encoding Multipler和Partition-based Pooling三点。group vector attention标量注意力中矩阵Value中每一个向量的所有通道的权重值是相同的在向量注意力中矩阵Value中每一个向量的所有通道的权重值是不同的这样就导致了参数的增加。标量注意力的方法虽然参数少但是可能无法获得向量中通道之间的关系向量注意力的方法却可以关注到向量中通道之间的关系调整每个通道的权重但随之而来的问题就是参数数量的大量增加。为了避免上述问题作者采用了分组的方法将Value矩阵中每个向量的通道均匀的分成 g 组(1 ≤ g ≤ c)并且在每组内共享同一个权重参数用于解决模型性能和参数数量的问题。这样不仅减少了参数数量提高了模型的效率而且也保留着向量注意力的长处。这里本质上是两者的妥协类似于group卷积。Position Encoding Multiplerv2中attention采用了向量权重分段的方式在一定程度上限制了attention的能力因此这里加强了位置编码的力量。v1中采用的公式v2公式如下可以看到v2中的位置编码不仅只充当一个bias的角色δmul作为一个可学习的乘性因子和关系函数得到的权重向量进行相乘加强位置编码力量。Partition-based Pooling分区池化下采样采用fps进行采样采样点再用knn去聚合邻域点的特征knn查询到的点由于不是空间对齐的可能出现不同的采样点取到同一个邻域点。为了解决这个问题提出了按grid采样的方法。如上图所示通过划分不重合的网格每个网络内点通过均值得到位置max pooling取特征信息。把每个点的特征分成了两部分位置和特征上采样直接对同一个网格内的点进行特征复制Point Transformer V3PTv3的设计理念是优先考虑简单性和效率而非过度追求复杂的设计。通过优化网络结构和参数PTv3在保持强大性能的同时降低了计算复杂度和内存消耗。这种设计使得PTv3在推理阶段的速度更快更易于在广泛的硬件设备上部署和运行。与前任PTv2相比PTv3的处理速度提高了3倍内存效率提高了10倍。这一突破性的进步得益于PTv3对点云序列化方法的创新应用。PTv3采用了一种为串行点云量身定制的精简方法取代了更复杂的注意力补丁交互机制从而显著提升了处理速度并降低了内存消耗。z-order聚类补充知识非论文重点Z-order是一种聚类方式可用于数据序列化或存储系统中的数据分区方便数据的查询管理等。原理比较简单zorder了解zorder了解点云序列化PTv3通过引入空间填充曲线如Z-order曲线和Hilbert曲线对点云进行序列化。这种序列化方法能够在保持空间近邻性的同时将无结构的点云数据转换为结构化的序列。这种转换使得PTv3能够更高效地处理点云数据并提取出有用的信息。Z-order或Hilbert曲线可以遍历整个空间并且把空间中所有的离散点点云点串联起来串联起来以后把点分成不同的patch就是分段或分组。Hilbert是一种序列化的曲线这种特殊的曲线格式可以在空间中无限复制直至遍历整个空间。c 、d图的trans Z-order和trans Hilbert曲线相较a b只是变换了维度方向为了增加序列化信息的丰富性。序列化注意力PTv3 使用 patch attention 机制将点分组到 patch 中并在每个 patch 内进行注意力计算从而提高了效率。PTv3 使用多种 patch 交互策略例如 Shift Dilation、Shift Patch 和 Shuffle Order以扩大感受野并增强模型的泛化能力。Patch grouping将点分组成patches。这个过程既自然又高效为了保证数据的对齐会对数据进行padding操作。Patch interaction是指多种patch方式进行交互。standard最简单的方法按照索引顺序分段然后进行patch内的attention信息交互Shift Dilation 按照步长跳步进行分组如【0 4 8 ……】【1 5 9…… 】【2 6 10】【3 7 11 】Shift Patch 如下图c先将起始的两个点平移到末尾然后再进行standard分组借鉴了 image transformers 中的 shift-window 策略。这种方法最大化了 patches 之间的 interactionShift Order 循环使用不同的方式进行序列化防止过拟合。“the serialized order of the point clouddata is dynamically varied between attention blocks”论文中的描述不太理解Shuffle Order 基于Shift Order随机选择序列化方式。这种方法确保了每个注意力层的感受野不受限于单一模式提高泛化能力。条件位置编码PTv3提出了一种新的xCPE它通过在注意力层之前直接插入一个稀疏卷积层来实现该层具有跳跃连接skip connection。xCPE和序列化编码的结合使用使得PTv3能够有效地捕捉点云数据的全局和局部特征同时保持了模型的可扩展性和计算效率。相对位置编码RPE在一些早期的点云处理模型中如Swin3DPoint Transformer通常使用相对位置编码Relative Positional Encoding, RPE。RPE通过计算点之间的欧几里得距离来生成位置编码这种方法能够有效地捕捉局部空间结构但计算成本较高尤其是在大规模点云中。条件位置编码CPE一些后续的模型如OctFormer引入了条件位置编码Conditional Positional Encoding, CPE它通过八叉树Octree结构来生成位置编码这种方法在效率上有所提升但PTv3认为单个CPE仍不足以实现峰值性能。整体网络结构Block structure通过采用 pre-norm 结构与 post-norm 替代方案相比来简化传统的块结构通常是一个大的归一化和激活层堆叠。此外从 Batch Normalization (BN) 变为 Layer Normalization (LN)。建议的 xCPE 直接在注意力层之前添加带有一个跳跃连接。Pooling strategy继续采用在PTv2中引入的 Grid Pooling 认识到它的简单性和效率。实验表明BN 是必不可少的不能有效地被 LN 替代。假设在池化过程中BN 在池化时对于稳定点云中的数据分布至关重要。此外Shuffle Order用于对Shift Order的序列化顺序进行洗牌被整合到了池化中*。Model architecture PTv3的架构与 U-Net 框架保持一致。它包括四个阶段的编码器和解码器各自的块深度为 [2, 2, 6, 2] 和 [1, 1, 1, 1]。对于这些阶段grid size 的 multipliers 设置为 [×2, ×2, ×2, ×2]表示相对于前一池化阶段的扩展比例。transformer编解码中都包含了很多blockblock中有attention如上图每个stage中的不同block特征维度是一致的 encoder中不同stage特征维度是上升的如分别是[n, 32] [n, 64] [n, 128] [n, 256] [n, 512]encoder是上采样的同理decoder再逐渐下采样直至[n, 64]。注意针对不同批次的数据n是不同的。ptv3代码学习torch的dataloader默认返回的是listlist长度就是batch大小这里初始化dataloader的时候通过collate_fn参数 传入了一个自定义回调函数把list转换成dict将里面的坐标、特征等拼接增加offset字段以区分batch另外有个mix_prob超参可以修改batch和offset字段batch内的点进行合并变为batch为1应该是数据增强策略data_dict是模型输入数据字典格式coord字段是n3坐标矩阵grid_coord是整形索引化的坐标矩阵也是n3格式。这是通过数据增强的grid_sample来实现的默认坐标网格长度是0.01有了这个grid坐标和feat特征就可以进行稀疏卷积了空间中的点云很多grid中是没有数据因此适合使用系数卷积节约参数两。如果不用稀疏卷积使用0.01网格那么grid的w、h是一个很大的数字所以要用稀疏卷积同时可以增大卷积核尺寸。feat是n4矩阵模型真实input数据坐标和反射率调试训练backbone输出特征是n64n是点数n其实是batch内多帧数据的点数拼接而来modesl/point_transformer_v3下面定义的模型文件是DefaultSegmentorV2的backboneDefaultSegmentorV2类定义了完整的模型。headmodel/default.py是一个全连接层全连接in_channle是64out_channle是类别数把点数当成了batch这样就适配了不同点数的全连接分类test模式下voxelizedataset调用voxelize的时候会进行多次采样推理采样次数是同一个grid里存在的最大点数如果一个grid里只有一个点那么多次采样这个点会重复多次。index每个采样点在原点云的index位置offset采样点数多次采样后对子点云分别进行推理会根据index位置把多次采样的结果pred_part矩阵累加到全部结果pred矩阵中最后对pred进行softmax得到最终结果。对于重复采样的点相当于多次的推理结果进行了平均模型里面有seriallization就是z-order或希尔伯特曲线变换实际上就是根据坐标产生一个点的索引值。flash attentionptv3使用了flash attention减少内存占用加快运算效率添加链接描述ptv3 attention代码理解送入attention的是point字典feat特征是[n, 32]n是batch内所有帧的点数和属于哪一帧还是通过offset和batch字段区分。attention流程先经过序列化方法获得点的排序索引索引是帧内的索引比如batch为2一共7个点前三后四分别是一帧order可能是[2, 0 ,1, 4, 5, 6, 3]根据索引对feat进行重排。再经过linear层将特征通道3倍上采样feat特征变为[n, 96]接下来的attention分为两种情况不使用flash attention自己实现patch attention方法特征reshape为[patch_size, n / patch_size, 3, 2, 16]再变为tuple为3的[n/patch_size,2, patch_size, 16 ]其中2是attention head数量3对应刚才的3倍上采样方便分为三块分别是q k v这里的patch最大只能设置64n/patch_size就是分成的块数了这里可以看到多头注意力对数据的处理细节是在通道维度C按照head数量进行了切分进行分别处理也就是对每个token的特征进行了切分虽然没看到其他的实现个人认为多头时进行复制应该也是可以的使用flash attention特征reshape为[n, 3, 2, 16]然后和patch size可设置为1024一起送入flash attention函数。flash attention内部会实现patch分块由于flash attention节约显存所以pach设的更大classSerializedAttention(PointModule):def__init__(self,channels,num_heads,patch_size,qkv_biasTrue,qk_scaleNone,attn_drop0.0,proj_drop0.0,order_index0,enable_rpeFalse,enable_flashTrue,upcast_attentionTrue,upcast_softmaxTrue,):super().__init__()assertchannels%num_heads0self.channelschannels self.num_headsnum_heads self.scaleqk_scaleor(channels//num_heads)**-0.5self.order_indexorder_index self.upcast_attentionupcast_attention self.upcast_softmaxupcast_softmax self.enable_rpeenable_rpe self.enable_flashenable_flashifenable_flash:assert(enable_rpeisFalse),Set enable_rpe to False when enable Flash Attentionassert(upcast_attentionisFalse),Set upcast_attention to False when enable Flash Attentionassert(upcast_softmaxisFalse),Set upcast_softmax to False when enable Flash Attentionassertflash_attnisnotNone,Make sure flash_attn is installed.self.patch_sizepatch_size self.attn_dropattn_dropelse:# when disable flash attention, we still dont want to use mask# consequently, patch size will auto set to the# min number of patch_size_max and number of pointsself.patch_size_maxpatch_size self.patch_size0self.attn_droptorch.nn.Dropout(attn_drop)self.qkvtorch.nn.Linear(channels,channels*3,biasqkv_bias)self.projtorch.nn.Linear(channels,channels)self.proj_droptorch.nn.Dropout(proj_drop)self.softmaxtorch.nn.Softmax(dim-1)self.rpeRPE(patch_size,num_heads)ifself.enable_rpeelseNonetorch.no_grad()defget_rel_pos(self,point,order):Kself.patch_size rel_pos_keyfrel_pos_{self.order_index}ifrel_pos_keynotinpoint.keys():grid_coordpoint.grid_coord[order]grid_coordgrid_coord.reshape(-1,K,3)point[rel_pos_key]grid_coord.unsqueeze(2)-grid_coord.unsqueeze(1)returnpoint[rel_pos_key]torch.no_grad()defget_padding_and_inverse(self,point):pad_keypadunpad_keyunpadcu_seqlens_keycu_seqlens_keyif(pad_keynotinpoint.keys()orunpad_keynotinpoint.keys()orcu_seqlens_keynotinpoint.keys()):offsetpoint.offset bincountoffset2bincount(offset)bincount_pad(torch.div(bincountself.patch_size-1,self.patch_size,rounding_modetrunc,)*self.patch_size)# only pad point when num of points larger than patch_sizemask_padbincountself.patch_size bincount_pad~mask_pad*bincountmask_pad*bincount_pad _offsetnn.functional.pad(offset,(1,0))_offset_padnn.functional.pad(torch.cumsum(bincount_pad,dim0),(1,0))padtorch.arange(_offset_pad[-1],deviceoffset.device)unpadtorch.arange(_offset[-1],deviceoffset.device)cu_seqlens[]foriinrange(len(offset)):unpad[_offset[i]:_offset[i1]]_offset_pad[i]-_offset[i]ifbincount[i]!bincount_pad[i]:pad[_offset_pad[i1]-self.patch_size(bincount[i]%self.patch_size):_offset_pad[i1]]pad[_offset_pad[i1]-2*self.patch_size(bincount[i]%self.patch_size):_offset_pad[i1]-self.patch_size]pad[_offset_pad[i]:_offset_pad[i1]]-_offset_pad[i]-_offset[i]cu_seqlens.append(torch.arange(_offset_pad[i],_offset_pad[i1],stepself.patch_size,dtypetorch.int32,deviceoffset.device,))point[pad_key]pad point[unpad_key]unpad point[cu_seqlens_key]nn.functional.pad(torch.concat(cu_seqlens),(0,1),value_offset_pad[-1])returnpoint[pad_key],point[unpad_key],point[cu_seqlens_key]defforward(self,point):ifnotself.enable_flash:self.patch_sizemin(offset2bincount(point.offset).min().tolist(),self.patch_size_max)Hself.num_heads Kself.patch_size Cself.channels pad,unpad,cu_seqlensself.get_padding_and_inverse(point)orderpoint.serialized_order[self.order_index][pad]inverseunpad[point.serialized_inverse[self.order_index]]# padding and reshape feat and batch for serialized point patchqkvself.qkv(point.feat)[order]ifnotself.enable_flash:# encode and reshape qkv: (N, K, 3, H, C) (3, N, H, K, C)q,k,v(qkv.reshape(-1,K,3,H,C//H).permute(2,0,3,1,4).unbind(dim0))# attnifself.upcast_attention:qq.float()kk.float()attn(q*self.scale) k.transpose(-2,-1)# (N, H, K, K)ifself.enable_rpe:attnattnself.rpe(self.get_rel_pos(point,order))ifself.upcast_softmax:attnattn.float()attnself.softmax(attn)attnself.attn_drop(attn).to(qkv.dtype)feat(attn v).transpose(1,2).reshape(-1,C)else:featflash_attn.flash_attn_varlen_qkvpacked_func(qkv.half().reshape(-1,3,H,C//H),cu_seqlens,max_seqlenself.patch_size,dropout_pself.attn_dropifself.trainingelse0,softmax_scaleself.scale,).reshape(-1,C)featfeat.to(qkv.dtype)featfeat[inverse]# ffnfeatself.proj(feat)featself.proj_drop(feat)point.featfeatreturnpointOneFormer3DsonataConcerto图像点云多模态特征融合输入添加链接描述2024cvpr智驾相关utonia一、算法定位与目标Utonia 是面向多源异构点云的自监督Point Transformer编码器目标单个编码器适配全部类型点云统一室内RGB-D、室外激光雷达、遥感、CAD物体、视频重建点云。痛点不同数据源点云尺度、点密度、采样模式、模态RGB/法向量差异巨大直接混合训练会学习数据集专属捷径跨域迁移能力差。核心思想设计域无关的轻量模块不引入MoE混合专家等域专属分支在统一特征空间学习通用几何表征。二、三大核心创新模块1. 因果模态屏蔽 Causal Modality Blinding问题不同点云有的带RGB、法向量有的只有xyz坐标模型容易依赖颜色、法向量这些辅助模态模态缺失时性能断崖下跌。实现训练阶段随机屏蔽辅助模态样本级整体屏蔽 点级局部掩码仅保留坐标作为必选输入。缺失模态填充0。作用强制模型优先学习几何形状而不是依赖颜色、法向量提升纯激光点云无RGB/无法向量推理鲁棒性。2. 感知粒度重缩放 Perceptual Granularity Rescale概念感知粒度代表点云对应的真实物理尺度分为大粒度场景级、小粒度物体级。大粒度场景自动驾驶、室内房间、遥感大范围场景天然重力对齐Z轴向上。小粒度物体CAD零件、单独物体扫描无固定重力方向允许任意旋转。实现按样本所属粒度类别从对应区间随机采样缩放因子同一数据集内不同样本缩放因子不固定。实现方法就是对x y z坐标乘以缩放因子很简单将不同物理尺度的点云映射到模型统一的标准坐标空间保证Transformer邻域/注意力感受野对应的物理尺寸保持一致。重力先验做差异化处理大粒度场景保留Z向上重力仅允许小角度航向旋转小粒度物体启用完整三维SO(3)随机旋转消除重力方向依赖。自监督增强师生视图采用非对称缩放、旋转、平移约束同一物体在不同视图下特征保持一致。所谓师生视图就是对样本进行较弱的扰动或增强即为教师视图反之就是学生视图二者会在同一batch一起送入网络训练就是自监督增强。推理阶段可手动设置缩放因子适配下游任务是场景分割还是物体/零件分割。3. 粒度对齐坐标上的3D RoPE旋转位置编码问题传统位置编码对坐标平移、旋转、点密度变化敏感稀疏卷积位置编码绑定网格与数据集采样特性。实现在经过感知粒度重缩放后的归一化坐标上使用3D RoPE将特征分成三份分别对x/y/z坐标执行一维RoPE。优势无参数位置编码依靠点之间相对几何关系做注意力不依赖全局坐标系对激光雷达近密远疏的不均匀点云鲁棒性更好。三、训练框架与数据预训练范式沿用Pointcept系列Sonata/Concerto的师生自蒸馏框架就是上面的师生视图自监督学习两阶段训练。阶段1高质量精选数据集初始化阶段2全部混合数据集继续训练。训练数据25万真实/仿真点云 100万CAD物体。训练增强坐标抖动、各向同性缩放场景与物体采用差异化旋转增强策略。四、能力与下游任务3D感知任务室内/室外语义分割、物体分类、部件分割在缺少RGB/法向量输入时性能远优于Concerto、Sonata。具身智能作为VLA视觉-语言-动作模型输入特征提升机器人抓取成功率。开放世界分割接入P³-SAM框架提升部件分割边界质量。空间推理接入Video-3D-LLM给视觉大模型注入显式几何信息提升3D空间问答、定位能力。五、关键实验结论朴素混合多域数据集直接训练会失效尺度/模态/重力偏差会造成域偏移粒度重缩放是稳定联合训练的必要条件。因果模态屏蔽Concerto去掉颜色后mIoU大幅下降Utonia在无RGB条件下性能基本稳定。RoPE在密度不均匀的室外激光点云上收益显著。涌现特性多域联合训练后不同类型点云互相增益而不是互相竞争。
02
RELATED NEWS

相关资讯

更多网站建设与数字化升级内容

03
WHY YAOTU

想打造同款高转化官网?

懂行业、懂生意,从建站到增长一站式陪跑

◈

场景化定制

不做模板站,围绕你的业务场景量身设计,小众不撞款。

◐

营销型架构

以转化目标组织内容与路径,让官网真正带来询盘。

▲

全周期服务

设计、开发、运营、运维一体,上线只是开始。

免费获取你的建站方案

留下需求,专属顾问 24 小时内为你输出方案建议。