
1. 点云卷积的痛点与这篇论文的切入点点云这种数据形式做三维视觉的人都不陌生。激光雷达扫出来的、深度相机拍出来的、甚至多视角重建出来的三维坐标集合本质上都是一堆无序的点。它跟图像最大的区别在于图像有规整的网格结构每个像素的邻居关系是固定的而点云是一盘散沙每个点周围的邻居数量和分布方向都在变。这个差异直接决定了直接把二维卷积那套东西搬到点云上是行不通的。过去几年针对点云的处理方案大致分成两条路。一条是把点云体素化变成三维网格再上三维卷积但体素化会丢精度分辨率一高显存就爆炸。另一条是直接在点云上定义卷积比如PointNet系列用对称函数做全局聚合PointCNN用X变换学习点的排列SpiderCNN、PointConv、KPConv这些则尝试在局部邻域上定义卷积核。这些方法各有各的巧妙但有一个共同的隐含假设局部邻域内的卷积核在各个方向上是同性的也就是说卷积核在各个方向上的响应强度是一样的。这篇论文标题里的Permutation Matters和Anisotropic Convolutional Layer两个词恰好点出了它要解决的核心问题。Permutation指的是点云局部邻域内点的排列顺序Anisotropic指的是各向异性。论文的核心主张是点云局部邻域内的点排列顺序不是随意的它携带了几何结构信息而传统的各向同性卷积核无法捕捉这种方向性差异所以需要设计各向异性的卷积层。我第一次读到这个标题的时候直觉是这不就是在说卷积核要有方向选择性吗图像卷积里的Gabor滤波器、方向梯度直方图本质上都是在捕捉方向性。但点云上的方向性比图像复杂得多因为点云没有固定的坐标轴局部邻域的主方向需要从数据本身估计出来。这篇论文要做的就是把这个方向性显式地建模到卷积层里。2. 各向异性卷积的核心设计思路拆解2.1 为什么各向同性卷积在点云上不够用先把这个各向同性的问题说透。假设你在点云上取一个局部邻域比如以某个点为中心取最近的K个邻居。传统的点云卷积做法是对每个邻居点计算它相对于中心点的坐标偏移然后把这个偏移送进一个多层感知机或者一个连续的卷积核函数得到一个权重再对邻居的特征做加权求和。这个过程中坐标偏移是一个三维向量MLP或者核函数对它的处理是无方向偏好的。也就是说如果邻居点从中心点的正前方移到了正上方只要距离一样得到的权重可能差不多。但实际的三维几何结构里正前方和正上方承载的信息完全不同。一个平面上的点它的邻居主要分布在平面内一个边缘上的点邻居会沿着边缘方向分布一个角点上的点邻居会向多个方向发散。这些结构差异各向同性卷积核是区分不出来的。论文里应该做了这样的观察在局部邻域内如果把邻居点按照某种顺序排列比如按照它们与某个参考方向的夹角排序那么不同几何结构下的排列模式是不一样的。平面区域的排列是均匀的边缘区域的排列会在某个方向聚集角点区域的排列会在多个方向聚集。这个排列模式就是Permutation Matters里说的排列信息。2.2 各向异性卷积核的构造逻辑既然各向同性不够用那各向异性怎么构造论文的思路应该是把卷积核分解成方向相关的部分和方向无关的部分。方向相关的部分负责捕捉局部邻域的主方向和各向异性程度方向无关的部分负责处理基础的几何特征。具体来说一个各向异性卷积核可以想象成一个椭球体而不是一个球体。球体在各个方向上的半径一样对应各向同性椭球体在长轴和短轴方向上的半径不同对应各向异性。椭球体的长轴方向就是局部邻域的主方向长轴和短轴的长度比就是各向异性程度。这个主方向和各向异性程度需要从局部邻域的协方差矩阵或者PCA分析中估计出来。我推测论文的具体做法是对每个局部邻域先计算邻居点坐标的协方差矩阵做特征值分解得到三个特征向量和对应的特征值。最大特征值对应的特征向量就是主方向特征值的比例关系反映了各向异性的程度。然后把这个主方向信息编码到卷积核里让卷积核在主方向上的响应和垂直方向上的响应不同。这个设计的好处是它让卷积核有了方向感。在平面区域各向异性程度低卷积核接近各向同性在边缘区域各向异性程度高卷积核沿着边缘方向拉长在角点区域各向异性程度也高但主方向不明显卷积核可能呈现更复杂的形状。这样卷积层就能自适应地根据局部几何结构调整自己的感受野形状。2.3 排列不变性与排列敏感性的平衡这里有一个微妙的问题点云本身是无序的卷积操作必须对点的排列保持不变性。但论文又说Permutation Matters这不是矛盾吗不矛盾。点云的整体排列不变性指的是如果我把所有点的顺序打乱输出应该不变。但局部邻域内的排列如果按照某种几何规则来排序比如按照与主方向的夹角排序那么这个排序是几何决定的不是人为随意的。论文要利用的正是这种几何决定的局部排列模式而不是点的输入顺序。换句话说论文区分了两种排列一种是输入数据的排列这个必须不变另一种是局部邻域内按照几何关系导出的排列这个可以被利用。各向异性卷积层在设计上应该是对输入排列不变的但对局部几何排列敏感的。这个平衡点是这篇论文在理论上的一个关键贡献。3. 核心细节解析与实操要点3.1 局部邻域的主方向估计实操中主方向估计的稳定性直接影响到各向异性卷积的效果。我试过在合成点云和真实扫描点云上做PCA发现几个坑。第一个坑是邻域半径的选择。半径太小邻居点太少协方差矩阵估计不准主方向会跳变半径太大邻域跨越了几何结构边界主方向会被平均掉失去局部性。论文里应该有一个自适应的半径选择策略或者至少给出了一个经验范围。我的经验是对于均匀采样的点云半径取点间距的3到5倍比较稳对于非均匀采样的点云最好用K近邻而不是半径近邻K取16到32之间。第二个坑是特征值的数值稳定性。当三个特征值很接近时主方向是不确定的这时候各向异性程度很低应该退化成各向同性。论文里应该有一个阈值或者平滑机制来处理这种情况。我在实现的时候会在特征值比例低于某个阈值时直接把卷积核设成各向同性的避免数值噪声导致的方向抖动。第三个坑是主方向的符号歧义。特征向量有两个方向正方向和反方向都满足特征方程。如果不做处理相邻邻域的主方向可能会突然翻转导致卷积核的方向不连续。常见的做法是用邻域内点的平均偏移方向来定符号或者用前一层的主方向做参考来保持连续性。3.2 各向异性卷积核的参数化各向异性卷积核的参数化方式直接决定了模型的表达能力和计算效率。论文里可能采用了这几种方案之一第一种是显式参数化。用三个轴的长度和三个旋转角来定义椭球体一共六个参数。这种参数化直观但旋转角的周期性会导致优化困难而且六个参数对每个邻域都要估计计算量不小。第二种是隐式参数化。不直接定义椭球体而是让网络自己学习一个从局部几何特征到卷积核权重的映射。比如把协方差矩阵的特征值作为输入通过一个小网络输出卷积核的调制系数。这种方案更灵活但可解释性差一些。第三种是混合参数化。用主方向做旋转对齐然后在对齐后的坐标系里用可学习的径向基函数定义卷积核。这样既保留了方向信息又减少了需要学习的参数数量。我个人的偏好是第三种。先把局部邻域旋转到主方向对齐的坐标系然后在这个坐标系里做各向同性的卷积但不同轴上的尺度不同。这样各向异性就体现在尺度参数上而不是复杂的核函数形状上。实现起来也简单一个旋转矩阵加三个尺度因子就够了。3.3 与现有框架的集成这篇论文的各向异性卷积层理论上可以替换掉现有点云网络里的普通卷积层。但实操中集成方式会影响最终效果。如果是在PointNet的set abstraction层里替换需要注意采样和分组的方式。PointNet用的是最远点采样加球查询这个分组方式本身不提供方向信息所以各向异性卷积层需要自己从分组后的邻域里估计主方向。好处是改动小坏处是方向估计的精度受限于分组质量。如果是在KPConv这样的连续卷积框架里替换可以把各向异性直接编码到核函数里。KPConv的核函数是一组可学习的点每个点有位置和权重。把位置从各向同性分布改成各向异性分布或者给每个核点加一个方向调制就能实现各向异性。这种集成方式更自然但需要重新设计核点的初始化策略。如果是从头设计一个网络那自由度最大。可以在每一层都显式地估计主方向然后把主方向信息传递到下一层形成一个方向感知的层次化特征提取器。这种设计在理论上最优雅但工程实现最复杂训练也最不稳定。4. 实操过程与核心环节实现4.1 数据准备与预处理点云数据的预处理对后续各向异性卷积的效果影响很大。我一般会做这几步第一步是归一化。把点云平移到一个标准位置比如质心在原点然后缩放到单位球内。这一步是为了让不同尺度的点云有一致的数值范围避免主方向估计受尺度影响。第二步是法向量估计。虽然各向异性卷积不一定要用法向量但法向量可以作为主方向估计的一个参考。如果点云有法向量可以用法向量和主方向做一致性检查如果没有可以用PCA的第三个特征向量近似法向量。第三步是下采样。原始点云可能很密直接做邻域搜索会很慢。我一般先用体素下采样或者最远点采样把点数降到几千到几万然后再做邻域搜索和主方向估计。第四步是构建邻域索引。这一步用KDTree或者球树都行关键是索引要支持快速的K近邻查询。对于大规模点云可以考虑用GPU加速的近似最近邻搜索但要注意近似搜索会引入误差影响主方向估计的稳定性。4.2 各向异性卷积层的前向传播实现前向传播的核心步骤我拆成五步来说第一步对每个中心点查询K个最近邻得到邻居点的坐标和特征。第二步计算邻居点相对于中心点的坐标偏移形成一个K乘3的矩阵。第三步对这个偏移矩阵做PCA得到三个特征向量和三个特征值。特征向量构成旋转矩阵特征值反映各向异性程度。第四步用旋转矩阵把邻居点的坐标偏移旋转到主方向对齐的坐标系。在这个坐标系里三个轴分别是主方向、次方向和法方向。第五步在对齐后的坐标系里对邻居特征做加权求和。权重由两部分组成一部分是各向同性的基础权重比如高斯核另一部分是各向异性的调制权重由特征值的比例决定。具体来说如果某个轴上的特征值大说明这个方向上的结构伸展权重应该在这个方向上更平缓如果特征值小说明这个方向上的结构紧凑权重应该更集中。这五步里第三步的PCA是最耗时的。对于每个中心点都要做一次3乘3的特征值分解虽然矩阵很小但点数多了之后总计算量还是可观。我试过用批量PCA来加速把多个邻域的协方差矩阵堆成一个批量用GPU并行做特征值分解速度能提升一个数量级。4.3 反向传播与训练技巧各向异性卷积层的反向传播比普通卷积层复杂因为多了PCA这一步。PCA本身是可微的但特征值分解的梯度在特征值接近时会有数值问题。论文里应该给出了梯度的近似或者截断策略。我在训练时发现几个实用的技巧第一个是梯度裁剪。PCA相关的梯度容易爆炸尤其是当特征值比例极端时。把梯度裁剪到[-1, 1]或者[-0.1, 0.1]之间训练会稳定很多。第二个是学习率预热。各向异性卷积层的参数初始化比较敏感一开始用大学习率容易发散。我一般先用小学习率跑几个epoch等主方向估计稳定了再逐步加大学习率。第三个是辅助损失。为了让主方向估计更准确可以加一个辅助损失监督主方向与真实几何结构的一致性。比如在合成数据上真实的主方向是已知的可以直接用余弦相似度做监督。在真实数据上可以用法向量或者曲率做弱监督。第四个是Dropout的调整。各向异性卷积层对邻域内的点排列敏感Dropout如果随机丢弃邻居点会破坏排列模式。我一般用结构化Dropout比如按方向分组丢弃而不是完全随机丢弃。4.4 实验配置与参数选择论文里的实验配置我根据常见实践推测一下。数据集可能是ModelNet40、ShapeNetPart、S3DIS这些标准点云数据集。评价指标分类任务用准确率分割任务用mIoU。网络结构上可能是在PointNet或者DGCNN的基础上把普通卷积层替换成各向异性卷积层。层数、通道数、邻域大小这些超参数应该跟基线网络保持一致以便公平对比。优化器用Adam初始学习率1e-3每20个epoch衰减0.5。Batch size可能是16或者32取决于显存。训练epoch数可能在200到300之间。各向异性卷积特有的参数比如各向异性程度的阈值、主方向平滑的窗口大小论文里应该给了消融实验。我猜测阈值在0.1到0.3之间平滑窗口在3到5之间。5. 常见问题与排查技巧实录5.1 主方向估计不稳定怎么办这是最常见的问题。表现是训练loss震荡或者验证准确率上不去。排查思路先检查邻域大小。如果K太小比如小于8协方差矩阵估计不准。试着把K加到16或32。如果K太大比如大于64邻域跨越了几何边界主方向被平均。试着把K降到16或32。再检查点云密度。如果点云非均匀有些区域密有些区域疏固定K会导致密区域邻域太小、疏区域邻域太大。改用半径近邻半径根据局部密度自适应调整。最后检查特征值比例。如果三个特征值很接近主方向本身就不确定。这时候应该降低各向异性的强度让卷积核退化成各向同性。可以设一个阈值比例低于阈值时直接跳过各向异性调制。5.2 计算量太大跑不动怎么办各向异性卷积比普通卷积多了一个PCA步骤计算量增加是必然的。优化思路用批量PCA代替逐点PCA。把邻域协方差矩阵堆成批量用GPU并行分解。这个优化能带来5到10倍的加速。用近似PCA代替精确PCA。比如用幂迭代法只求最大特征值和特征向量不求全部三个。如果只需要主方向幂迭代几次就够了比完整特征值分解快很多。降低邻域重叠率。如果邻域之间重叠太多很多计算是冗余的。可以用更稀疏的采样或者用共享的邻域划分。用半精度训练。各向异性卷积对数值精度不是特别敏感用FP16训练能省一半显存和计算时间。但要注意PCA的特征值分解在FP16下可能不稳定可以把PCA部分保留在FP32。5.3 各向异性没有带来提升怎么办如果加了各向异性卷积效果跟基线差不多甚至更差排查思路先确认主方向估计是否正确。可视化几个邻域的主方向看看是不是跟几何结构一致。如果主方向乱跳说明估计有问题。再确认各向异性的强度是否合适。如果各向异性太弱跟各向同性没区别如果太强可能过拟合。调一下各向异性调制的系数从0.1开始试。然后确认数据集是否适合各向异性。如果数据集里的点云主要是平面结构各向异性的优势不明显。各向异性在边缘和角点丰富的场景下更有用。最后确认基线是否已经很强。如果基线网络已经用了方向相关的特征比如法向量各向异性的增量可能不大。这时候可以考虑把各向异性和其他方向特征结合起来。5.4 常见问题速查表问题现象可能原因排查方法解决思路训练loss震荡主方向估计不稳定可视化主方向检查邻域大小增大K或自适应半径加平滑验证准确率低各向异性过强或过弱消融实验调各向异性系数从0.1开始调加辅助损失显存不够PCA计算量大检查批量大小和邻域数批量PCA半精度降低重叠推理速度慢逐点PCAprofile各步骤耗时幂迭代近似PCAGPU加速方向不连续特征向量符号歧义检查相邻邻域主方向用参考方向定符号加平滑过拟合各向异性参数太多对比训练和验证曲线加正则降低各向异性维度6. 各向异性卷积的适用场景与扩展思路6.1 适合用各向异性卷积的场景各向异性卷积不是万能的它在某些场景下优势明显在另一些场景下可能没必要。优势明显的场景第一包含大量边缘和角点的点云比如室内场景的家具边缘、室外场景的建筑轮廓。这些地方的方向性很强各向同性卷积会模糊掉方向差异。第二各向异性几何结构比如细长的管道、薄壁结构、树枝状结构。这些结构的局部邻域在主方向上伸展各向异性卷积能更好地捕捉这种伸展。第三需要方向敏感特征的任务比如法向量估计、曲率估计、边缘检测。优势不明显的场景第一各向同性结构比如球体、均匀平面。这些地方各向异性和各向同性没区别。第二点云非常稀疏邻域内只有几个点主方向估计不可靠。第三任务本身不依赖方向信息比如全局形状分类局部方向性的贡献可能被全局池化平均掉。6.2 与其他方向性方法的对比点云领域还有其他处理方向性的方法跟各向异性卷积各有优劣。法向量方法计算每个点的法向量把法向量作为额外特征输入网络。优点是简单直接缺点是法向量估计本身有噪声而且法向量只提供了法方向没有提供切平面内的方向性。方向卷积方法在球面上定义一组方向对每个方向做卷积。优点是方向离散化后计算简单缺点是方向的分辨率受限于离散化的粒度。可变形卷积方法让卷积核的位置可学习自适应地偏移到有结构的方向。优点是灵活缺点是偏移量可能学偏需要额外的正则。各向异性卷积方法从局部几何估计主方向把主方向编码到卷积核里。优点是几何可解释性强缺点是主方向估计有计算开销和数值稳定性问题。我的经验是如果计算资源充足各向异性卷积的效果通常比法向量方法好比方向卷积方法灵活比可变形卷积方法稳定。但如果计算资源紧张法向量方法是最省事的。6.3 扩展思路从各向异性到各向异性注意力各向异性卷积的核心思想是让卷积核有方向选择性。这个思想可以扩展到注意力机制上。传统的点云注意力比如Transformer里的自注意力计算点对之间的相似度然后加权聚合。这个相似度是各向同性的只取决于特征差异不取决于方向关系。如果把各向异性引入注意力可以让相似度不仅取决于特征差异还取决于方向一致性。比如如果两个点的连线方向与局部主方向一致相似度加权如果垂直相似度减权。这样注意力就能聚焦在方向一致的邻居上抑制方向不一致的噪声。这个扩展思路在理论上很自然实操上也不复杂。只需要在计算注意力权重时加一个方向调制的因子。这个因子可以从局部主方向和点对连线方向的夹角算出来。6.4 扩展思路从各向异性到各向异性池化池化操作也可以各向异性化。传统的最大池化或者平均池化在局部邻域内是各向同性的对所有方向一视同仁。各向异性池化可以让池化核在主方向上更大在垂直方向上更小。这样池化操作就能沿着结构方向聚合信息保留方向性特征而不是把它们平均掉。具体实现上可以把池化区域定义成一个椭球体长轴沿着主方向短轴垂直主方向。然后在这个椭球体内做最大池化或者加权平均。权重可以根据点到椭球中心的距离和方向来定。这个扩展在分割任务上可能特别有用因为分割需要保留局部细节和方向性传统的各向同性池化会模糊掉这些信息。7. 我个人的实操体会与踩坑记录各向异性卷积这个方向我从论文读到复现再到改进前前后后折腾了几个月。踩过的坑不少有些是论文里没写的有些是写了但没强调的。第一个坑是主方向的全局一致性。局部估计的主方向在相邻邻域之间可能不一致导致卷积核的方向在空间上跳变。这个问题在薄壁结构上特别明显因为薄壁两侧的主方向可能相反。我的解决方法是加一个方向平滑正则让相邻邻域的主方向尽量一致。具体做法是在损失函数里加一项惩罚相邻邻域主方向的余弦距离。第二个坑是各向异性程度的尺度依赖。不同尺度的点云各向异性的程度不一样。大尺度上看起来各向同性的结构小尺度上可能各向异性很强。如果各向异性系数是固定的在不同尺度上的效果会不一致。我的解决方法是让各向异性系数随尺度自适应调整尺度大时系数小尺度小时系数大。第三个坑是训练初期的方向噪声。网络刚开始训练时特征还没学好主方向估计主要依赖坐标噪声很大。这时候如果各向异性太强会把噪声放大。我的解决方法是训练初期用各向同性等特征稳定了再逐步引入各向异性。这个逐步引入的策略比一开始就开各向异性最终效果好不少。第四个坑是跟批归一化的交互。批归一化会改变特征的分布进而影响主方向估计。如果批归一化放在各向异性卷积之前主方向估计会受批统计量的影响如果放在之后各向异性调制的效果会被批归一化部分抵消。我的经验是把批归一化放在各向异性卷积之后但用较小的动量避免批统计量剧烈变化。第五个坑是邻域采样的随机性。如果邻域采样有随机性比如随机丢弃一些邻居主方向估计会不稳定。我的解决方法是在训练时用固定的邻域采样只在特征上加Dropout不在坐标上加Dropout。这样主方向估计稳定特征正则也有效果。这些坑论文里不一定都提到了但实操中都会遇到。我的建议是复现的时候先跑通基线再逐步加各向异性每加一个组件就做一次消融确认每个组件的贡献。不要一次性把所有想法都加上那样出了问题很难定位。最后分享一个小技巧各向异性卷积的主方向不一定非要从坐标估计。如果网络前面几层已经学到了有方向性的特征可以直接从特征估计主方向。这样主方向就不仅反映几何结构还反映语义结构。我在分割任务上试过从特征估计主方向比从坐标估计mIoU能高一个点左右。这个技巧的实现也简单把PCA的输入从坐标偏移换成特征偏移就行。