全国做暧小视频网站,易记域名网站大全,合肥市住房建设局网站,凡客v十商城还在吗Li, Y., et al. “PointCNN: Convolution On X-Transformed Points.” NeurIPS 2018. 博主导读#xff1a; 在点云深度学习领域#xff0c;PointNet 系列通过“对称函数”#xff08;Max Pooling#xff09;解决了点云无序性的问题#xff0c;但代价是放弃了传统 CNN …Li, Y., et al. “PointCNN: Convolution On X-Transformed Points.” NeurIPS 2018.博主导读在点云深度学习领域PointNet 系列通过“对称函数”Max Pooling解决了点云无序性的问题但代价是放弃了传统 CNN 强大的卷积操作。我们知道CNN 之所以在图像上大杀四方靠的就是卷积核能够在局部区域提取空间相关性。那么问题来了能不能在无序的点云上直接通过卷积核提取特征呢PointCNN 给出的答案是能但需要先“变身”。它提出了X \mathcal{X}X-Conv算子通过学习一个K × K K \times KK×K的变换矩阵把无序的邻居点“排列”成潜在的规范顺序从而让卷积操作再次焕发荣光。本文将带你拆解这个神奇的X \mathcal{X}X变换以及它背后关于“置换不变性”的深刻思考。原文链接PointCNN: Convolution On X-Transformed Points代码链接代码链接1. 核心痛点为什么点云不能直接卷积在图像Grid中数据是规则排列的卷积核K KK是固定的。比如一个3 × 3 3 \times 33×3的卷积核左上角的权重永远乘左上角的像素。但在点云中有两个致命问题不规则性 (Irregularity)点云在空间中是连续分布的没有固定的网格。无序性 (Unordered)对于中心点p pp它的邻居是{ a , b , c , d } \{a, b, c, d\}{a,b,c,d}。如果你把它们存成[ a , b , c , d ] T [a, b, c, d]^T[a,b,c,d]T还是[ c , a , b , d ] T [c, a, b, d]^T[c,a,b,d]T它们代表的几何结构是一样的。致命后果如果你直接拿卷积核K KK去卷输入顺序变了卷积结果就变了。这导致网络无法学习到稳定的形状信息。2. 核心创新X \mathcal{X}X-Conv 算子PointCNN 的核心思想非常直观既然顺序是乱的那我就学一个矩阵X \mathcal{X}X把你乘到一个“正确”的顺序上然后再卷这个过程被称为X \mathcal{X}X-Transformation。2.1 算法流程 (Algorithm 1)假设我们要在中心点p pp处提取特征周围有K KK个邻居{ p 1 , . . . , p K } \{p_1, ..., p_K\}{p1,...,pK}特征为F i n F_{in}Fin。X \mathcal{X}X-Conv 的步骤如下局部坐标变换将邻居坐标减去中心点坐标P ′ ← P − p P \leftarrow P - pP′←P−p。目的获得局部几何形状保证平移不变性。特征升维 (Feature Lifting)F δ ← M L P δ ( P ′ ) F_\delta \leftarrow MLP_\delta(P)Fδ←MLPδ(P′)。目的把低维的坐标信息映射为高维特征并与原有特征F FF拼接形成F ∗ [ F δ , F ] F_* [F_\delta, F]F∗[Fδ,F]。学习X \mathcal{X}X变换矩阵 (重点!)X ← M L P ( P ′ ) \mathcal{X} \leftarrow MLP(P)X←MLP(P′)。这里用一个 MLP 去学习一个K × K K \times KK×K的矩阵。物理含义这个矩阵负责对K KK个邻居进行加权 (Weighting)和重排列 (Permutation)。注这里隐含了一个极其重要的转置操作详见下文深度解析。执行变换F X ← X × F ∗ F_\mathcal{X} \leftarrow \mathcal{X} \times F_*FX←X×F∗。这一步发生了什么原本乱序的F ∗ F_*F∗被X \mathcal{X}X矩阵左乘之后变成了“规范顺序”的特征F X F_\mathcal{X}FX。标准卷积F p ← C o n v ( K , F X ) F_p \leftarrow Conv(K, F_\mathcal{X})Fp←Conv(K,FX)。现在特征顺序已经规范了我们可以放心地用标准卷积核K KK去卷它了2.2 核心公式F p Conv ( K , MLP ( P − p ) × [ MLP δ ( P − p ) , F ] ) F_p \text{Conv}\left( K, \, \text{MLP}(P-p) \times [ \text{MLP}_\delta(P-p), \, F ] \right)FpConv(K,MLP(P−p)×[MLPδ(P−p),F])3. 深度解析X \mathcal{X}X矩阵到底干了什么很多同学看到这里会懵为什么乘一个矩阵就能解决乱序问题我们可以把X \mathcal{X}X矩阵看作是一个“软置换矩阵” (Soft Permutation Matrix)。3.1 “众筹”排座次X \mathcal{X}X矩阵的生成是一个“基于内容的加权”过程当执行X × F \mathcal{X} \times FX×F时实相当于对特征矩阵进行了行变换。矩阵乘法左乘是行变换。无论输入的点顺序怎么乱只要几何形状没变“左上角”的点永远会把特征投递到“第 1 行”。这样后续的卷积核K KK就能安心地提取特征了。3.2 硬核细节为什么 MLP 输出X \mathcal{X}X需要转置!!!在数学推导上这里有一个容易被忽视的细节直接关系到代码实现的正确性假设邻居点的坐标K, 3经过mlp变为K, K他们的第一行完全是由第一个点的坐标得到的。假设他认为第10个点权重最大。邻居点的特征K, C也就把第10个点放在了第一个点的位置。现在把第10个点和第11个点互换其他什么都不变那么邻居点的坐标K, 3经过mlp变为K, K他们的第一行完全是由第一个点的坐标得到的所以也不会变那么依然会认为第10个点权重最大但是实际上第10个点和第11个点已经互换了。这样就完全错误了。把X × F \mathcal{X} \times FX×F看做是邻居特征的线性变换。至于选择他们的顺序是由所有的点坐标决定的。所有必须要进行转置4. 网络架构层级化学习PointCNN 模仿了传统 CNN 的层级结构Hierarchical Architecture这点和 PointNet 类似。特征编码 (Encoder)通过堆叠X \mathcal{X}X-Conv 层。每一层通过下采样如随机采样或最远点采样 FPS减少点数N NN同时增加特征维度C CC。感受野Receptive Field逐层扩大。空洞卷积 (Dilated Convolution)为了扩大感受野而不增加计算量PointCNN 在点云上引入了空洞卷积的概念。做法在找K KK个邻居时先找K × D K \times DK×D个然后均匀抽样K KK个。分割网络 (Decoder)类似于 U-Net使用X \mathcal{X}X-Conv 作为反卷积DeConv并将编码层的特征通过 Skip Connection 传过来。5. PyTorch 核心代码复现Talk is cheap, show me the code. 我们来实现一个简化版的XConv帮助理解数据流。importtorchimporttorch.nnasnndefindex_points(points,idx):根据索引提取点# points: [B, N, C], idx: [B, N, K]devicepoints.device Bpoints.shape[0]view_shapelist(idx.shape)view_shape[1:][1]*(len(view_shape)-1)repeat_shapelist(idx.shape)repeat_shape[0]1batch_indicestorch.arange(B,dtypetorch.long,devicedevice).view(view_shape).repeat(repeat_shape)new_pointspoints[batch_indices,idx,:]returnnew_pointsclassXConv(nn.Module):def__init__(self,in_channels,out_channels,k16,dim3):super(XConv,self).__init__()self.kk# 1. 学习 X 变换矩阵的 MLP (输出 K*K)# 注意这里输出的是 K*K需要 reshapeself.mlp_xnn.Sequential(nn.Linear(dim,64),nn.ELU(),nn.Linear(64,k*k))# 2. 卷积层 (相当于 Algorithm 1 中的 Conv)# 输入维度是 in_channels dim (因为做了feature lifting)# 这里的卷积核高度是 K宽度是 C_delta C1相当于做深度卷积self.convnn.Sequential(nn.Conv2d(k,out_channels,kernel_size(1,in_channelsdim)),nn.BatchNorm2d(out_channels),nn.ELU())defforward(self,p,x,idx): p: (B, N, 3) - 坐标 x: (B, N, C) - 特征 idx: (B, N, K) - 邻居索引 B,N,_p.shape# 1. 获取邻居坐标# neighbor_p: (B, N, K, 3)neighbor_pindex_points(p,idx)# 2. 局部坐标变换 (P P - p)# p_local: (B, N, K, 3)p_localneighbor_p-p.unsqueeze(2)# 3. 获取邻居特征并拼接 (Feature Lifting)ifxisnotNone:neighbor_xindex_points(x,idx)# 拼接坐标和特征: [P, F] - (B, N, K, C3)feature_startorch.cat([p_local,neighbor_x],dim-1)else:feature_starp_local# 4. 学习 X 变换矩阵# (B, N, K, 3) - (B, N, K, K*K) - (B, N, K, K)# 每一个邻居点预测一个 K 维向量K 个邻居拼成 KxKX_matself.mlp_x(p_local).view(B,N,self.k,self.k).transpose(-1,-2)# 5. 应用 X 变换 (X * F_star)# (B, N, K, K) (B, N, K, C3) - (B, N, K, C3)# 这一步通过矩阵乘法实现了特征的加权和重排feature_transformedtorch.matmul(X_mat,feature_star)# 6. 卷积# 此时 feature_transformed 已经被 排序 好了outself.conv(feature_transformed)returnout6. 实验结果与可视化 (Results)6.1 性能表现PointCNN 在ModelNet40上达到了92.2%的准确率在ScanNet上达到了92.5%。这些成绩在当时都达到了 SOTA (State-of-the-Art) 水平证明了X \mathcal{X}X-Conv 在处理点云分类和分割任务上的强大能力。6.2 可视化证明 (X \mathcal{X}X真的有用吗)为了验证X \mathcal{X}X变换矩阵是否真的起到了“排序”和“规范化”的作用论文作者通过 t-SNE 可视化了变换前后的特征分布。在一个已经训练好的网络中但通常取中间某一层如第 2 或第 3 层X \mathcal{X}X-Conv因为那里的特征既有局部几何信息又有一定的语义抽象。在Modelnet40中不同的物体选取15个局部点然后经过网络。图a是完全没有X \mathcal{X}X的操作图b是经过一层的X \mathcal{X}X-Conv但是有打乱了点图c是经过X \mathcal{X}X但没有Conv也就是重新排序的点。注意点维度是C邻居是Kt-sne的输入维度是K*C也就是说图b是把邻居点随机的拼接图c是把邻居点按顺序拼接变换前 (F ∗ \mathcal{F}_*F∗或F o \mathcal{F}_oFo)特征分布是模糊、混杂的 (Fuzzy/Blended)。这说明在没有X \mathcal{X}X介入时由于输入点的无序性网络很难区分不同几何结构的特征大家“乱成一锅粥”。变换后 (F X \mathcal{F}_\mathcal{X}FX)特征分布变得非常紧凑 (Concentrated)和有区分度 (Discriminative)。 结论这直接证明了X \mathcal{X}X变换成功地将乱序的输入“规范化” (Canonicalized)了。它就像一个自动整理器把特征摆放到了卷积核熟悉的位置使得卷积操作可以有效地提取几何信息。7. 总结 (Conclusion)PointCNN 是点云深度学习中非常有野心的一个工作。它没有妥协于 Max Pooling 这种“简单粗暴”的对称函数而是硬刚“无序性”问题。它通过学习一个X \mathcal{X}X变换矩阵实现了对无序点云的隐式排序 (Implicit Ordering)和加权 (Weighting)。这使得经典的 CNN 架构卷积、下采样、上采样可以被近乎无缝地迁移到点云领域重新利用了空间局部相关性。虽然现在的 SOTA 更多被 Transformer如 Point Transformer占据但 PointCNN 关于“Canonical Ordering” (规范化排序)的思考依然极具价值。它告诉我们与其设计复杂的对称函数不如教网络自己学会“整理队形”。 参考文献[1] Li, Y., et al. “PointCNN: Convolution On X-Transformed Points.” NeurIPS 2018.互动话题你理解为什么点云不能直接使用卷积了么你知道为什么X \mathcal{X}X-Conv 算子需要转置么你明天t-SNE可视化的输入到底是什么么 附录MLP点云网络系列导航本专栏致力于用“人话”解读 3D 点云领域的硬核论文从原理到代码逐行拆解。 欢迎订阅专栏【点云特征分析_顶会论文硬核拆解】持续更新中…本文为 CSDN 专栏【深度学习-论文讲解】原创内容转载请注明出处。