SGPN:代码解析——相似矩阵计算

  本文的目的是解析SGPN代码中由矩阵 F S I M \boldsymbol F_{SIM} FSIM(维度为 N p × N f N_p \times N_f Np×Nf)如何得到相似矩阵 S \boldsymbol S S(维度为 N p ×   N p N_p \times\ N_p Np× Np)。 S i , j S_{i,j} Si,j 的值是点 P i \boldsymbol P_i Pi和 点 P j \boldsymbol P_j Pj属于相同物体实例的度量。 S i , j S_{i,j} Si,j 越小表示点 P i \boldsymbol P_i Pi和 点 P j \boldsymbol P_j Pj属于相同实例的可能性越大。
数学分析
 首先假设 F S I M = [ x 1 T x 2 T ⋮ x N p T ] \boldsymbol F_{SIM}=\left[ \begin{matrix} \boldsymbol x_{1}^T \\ \boldsymbol x_{2}^T \\ \vdots \\ \boldsymbol x_{N_p}^T \end{matrix} \right] FSIM=x1Tx2TxNpT  其中 x i = [ x i , 1 x i , 2 ⋯ x i , N f ] T \boldsymbol x_{i}=\left [\begin{matrix}x_{i,1}&x_{i,2}&\cdots&x_{i,N_f} \end{matrix}\right]^T xi=[xi,1xi,2xi,Nf]T
  因为
标 量 S i , j = ∥ F S I M i − F S I M j ∥ 2 = ∥ x i − x j ∥ 2 = ( x i − x j ) T ( x i − x j ) = x i T x i − 2 x i T x j + x i T x i \begin{aligned} 标量S_{i,j} &=\lVert \boldsymbol F_{SIM_i}-\boldsymbol F_{SIM_j}\rVert_2=\lVert \boldsymbol x_{i}- \boldsymbol x_{j}\rVert_2\\ &=(\boldsymbol x_{i}-\boldsymbol x_{j})^T(\boldsymbol x_{i}-\boldsymbol x_{j})=\boldsymbol x_{i}^T\boldsymbol x_{i}-2\boldsymbol x_{i}^T\boldsymbol x_{j}+\boldsymbol x_{i}^T\boldsymbol x_{i} \end{aligned} Si,j=FSIMiFSIMj2=xixj2=(xixj)T(xixj)=xiTxi2xiTxj+xiTxi  所以
S = A − B + C (1) \boldsymbol S = \boldsymbol A-\boldsymbol B+\boldsymbol C \tag{1} S=AB+C(1)  其中
A = [ x 1 T x 1 x 1 T x 1 ⋯ x 1 T x 1 x 2 T x 2 x 2 T x 2 ⋯ x 2 T x 2 ⋮ ⋮ ⋮ ⋮ x N p T x N p x N p T x N p ⋯ x N p T x N p ] N P × N p \boldsymbol A = \left[ \begin{matrix} \boldsymbol x_{1}^T\boldsymbol x_{1} &\boldsymbol x_{1}^T\boldsymbol x_{1} & \cdots & \boldsymbol x_{1}^T\boldsymbol x_{1} \\ \boldsymbol x_{2}^T\boldsymbol x_{2} &\boldsymbol x_{2}^T\boldsymbol x_{2} & \cdots & \boldsymbol x_{2}^T\boldsymbol x_{2} \\ \vdots & \vdots & \vdots & \vdots\\ \boldsymbol x_{N_p}^T\boldsymbol x_{N_p} &\boldsymbol x_{N_p}^T\boldsymbol x_{N_p} & \cdots & \boldsymbol x_{N_p}^T\boldsymbol x_{N_p} \end{matrix} \right]_{N_P\times N_p} A=x1Tx1x2Tx2xNpTxNpx1Tx1x2Tx2xNpTxNpx1Tx1x2Tx2xNpTxNpNP×Np
C = [ x 1 T x 1 x 2 T x 2 ⋯ x N p T x N p x 1 T x 1 x 2 T x 2 ⋯ x N p T x N p ⋮ ⋮ ⋮ ⋮ x 1 T x 1 x 2 T x 2 ⋯ x N p T x N p ] N P × N p = A T \boldsymbol C= \left[ \begin{matrix} \boldsymbol x_{1}^T\boldsymbol x_{1} &\boldsymbol x_{2}^T\boldsymbol x_{2} & \cdots & \boldsymbol x_{N_p}^T\boldsymbol x_{N_p} \\ \boldsymbol x_{1}^T\boldsymbol x_{1} &\boldsymbol x_{2}^T\boldsymbol x_{2} & \cdots & \boldsymbol x_{N_p}^T\boldsymbol x_{N_p} \\ \vdots & \vdots & \vdots & \vdots\\ \boldsymbol x_{1}^T\boldsymbol x_{1} &\boldsymbol x_{2}^T\boldsymbol x_{2} & \cdots & \boldsymbol x_{N_p}^T\boldsymbol x_{N_p} \end{matrix} \right]_{N_P\times N_p}=A^T C=x1Tx1x1Tx1x1Tx1x2Tx2x2Tx2x2Tx2xNpTxNpxNpTxNpxNpTxNpNP×Np=AT
B = 2 ∗ [ x 1 T x 1 x 1 T x 2 ⋯ x 1 T x N p x 2 T x 1 x 2 T x 2 ⋯ x 2 T x N p ⋮ ⋮ ⋮ ⋮ x N p T x 1 x N p T x 2 ⋯ x N p T x N p ] N P × N p = F S I M ∗ F S I M T \boldsymbol B=2* \left[ \begin{matrix} \boldsymbol x_{1}^T\boldsymbol x_{1} &\boldsymbol x_{1}^T\boldsymbol x_{2} & \cdots & \boldsymbol x_{1}^T\boldsymbol x_{N_p} \\ \boldsymbol x_{2}^T\boldsymbol x_{1} &\boldsymbol x_{2}^T\boldsymbol x_{2} & \cdots & \boldsymbol x_{2}^T\boldsymbol x_{N_p} \\ \vdots & \vdots & \vdots & \vdots\\ \boldsymbol x_{N_p}^T\boldsymbol x_{1} &\boldsymbol x_{N_p}^T\boldsymbol x_{2} & \cdots & \boldsymbol x_{N_p}^T\boldsymbol x_{N_p} \end{matrix} \right]_{N_P\times N_p}= \boldsymbol F_{SIM}* \boldsymbol F_{SIM}^T B=2x1Tx1x2Tx1xNpTx1x1Tx2x2Tx2xNpTx2x1TxNpx2TxNpxNpTxNpNP×Np=FSIMFSIMT  到此理论分析完毕,接下来为代码实现分析,SGPN的github源码是用TensorFlow写的,其中计算相似矩阵 S \boldsymbol S S的代码如下:

# Similarity matrix
Fsim = tf_util.conv2d(F, 128, [1, 1], padding='VALID', stride=[1, 1], bn=False, is_training=is_training, scope='Fsim')
 #Fsim shape:BxNx1x128
Fsim = tf.squeeze(Fsim, [2])
 #Fsim shape:BxNx128
r = tf.reduce_sum(Fsim * Fsim, 2)
 #r shape:BxN
r = tf.reshape(r, [batch_size, -1, 1])
#r shape:BxNx1
print(r.get_shape(),Fsim.get_shape())
D = r - 2 * tf.matmul(Fsim, tf.transpose(Fsim, perm=[0, 2, 1])) + tf.transpose(r, perm=[0, 2, 1])

  其中 D D D为相似矩阵 S S S,代码中的r+ tf.transpose(r, perm=[0, 2, 1])的效果相当于公式(1)中的 A + C A+C A+C。你可能疑惑rtf.transpose(r, perm=[0, 2, 1])维度不同怎么能相加呢?针对这个地方我没查到tesorflow怎么对不同维度的向量相加,但是我查着了numpy关于不同维度相加的博客介绍,即如下:
  广播是指不同形状的输足之间执行算数运算额方式。当两个数组的shape不一致时,numpy会实行广播机制。遵循4个原则:
  (1)让所有的输入数组向其中shape最长的数组看齐,shape中不足的部分通过在前面加1补齐。
  (2)输出数组的shape是输入数组shape的各个轴上的最大值。
  (3)如果输入数组的某个轴和输出数组的对应轴的长度相同或者其长度为1,则这个数组能够用来计算,否则出错。
  (4)当输入数组的某个轴的长度为1时,沿着此轴运算时使用此轴上的第一组值。
最后2 * tf.matmul(Fsim, tf.transpose(Fsim, perm=[0, 2, 1]))相当于公式(1)中的 B B B
 到此结束。

### 回答1: 这里是 20 个比较流行的点云 3D 分割模型: 1. PointNet 2. PointNet++ 3. PointCNN 4. Kd-Net 5. SpiderCNN 6. PointSIFT 7. PointASNL 8. PointGroup 9. PointConv 10. PointWeb 11. PointGNN 12. PointPillars 13. PointSESA 14. PointSNE 15. DensePoint 16. PointSAP 17. PointSGN 18. PointGCN 19. PointSRNN 20. PointSOGN 希望这些模型能够帮助您解决问题。 ### 回答2: 以下是20个比较流行的点云 3D 分割模型的推荐: 1. PointNet: PointNet是一种用于点云分类和分割的经典模型,能够直接对点云进行分析和处理。 2. PointNet++: PointNet++是PointNet的扩展版本,通过层次化聚类和采样机制更好地捕捉点云的局部和全局特征。 3. PointCNN: PointCNN采用卷积操作在点云数据上进行局部特征提取和聚合,实现高效的点云分割。 4. PointSIFT: PointSIFT使用旋转不变的滤波器对点云数据进行采样,以实现稳健的点云分割。 5. DGCNN: DGCNN使用动态图卷积神经网络对点云数据进行分割,并在图像分类上取得了较好的性能。 6. KPConv: KPConv是一种新的基于点云的卷积操作,适用于点云分类和分割任务。 7. RSNet: RSNet是一种适用于点云分割的点级循环神经网络,能够有效地处理大规模点云数据。 8. 3D PointCapsNet: 3D PointCapsNet是一种基于胶囊网络的点云分割模型,具有旋转不变性和姿态估计能力。 9. PointWeb: PointWeb将点云数据转换为图像,以便使用传统的2D卷积神经网络进行分割。 10. \[1\]PCANet: PCANet是一种基于主成分分析的点云分割方法,能够提取点云的重要特征。 11. \[1\]Superpoint Graph: Superpoint Graph使用图神经网络在点云上建立图结构,实现点云分割任务。 12. \[1\]SGPN: SGPN是一种快速和准确的点云分割方法,能够对未见过的场景进行分割。 13. \[1\]PoissonNet: PoissonNet使用基于网格的曲面重建方法,将点云数据转换为曲面,并进行分割。 14. \[1\]PointCNN++: PointCNN++是PointCNN的改进版本,能够更好地处理较大规模的点云数据。 15. \[1\]SPH3D-GCN: SPH3D-GCN将点云数据表示为稀疏差分图,以实现高效的点云分割。 16. \[1\]SphereNet: SphereNet是一种基于球面卷积神经网络的点云分割模型,能够处理球面点云数据。 17. \[1\]GACNet: GACNet使用旋转不变的球形卷积神经网络进行点云分割,能够处理复杂的三维场景。 18. \[1\]3DMPPE: 3DMPPE是一种基于动作估计的点云分割方法,可以对动态点云进行分割。 19. \[1\]PointRSS: PointRSS利用注意力机制在点云中提取重要的特征,并进行点云分割任务。 20. \[1\]FPSNet: FPSNet使用最远点采样的方法对点云数据进行分割,能够处理大规模点云数据。 以上是20个比较流行的点云 3D 分割模型的推荐,可以根据具体任务需求选择适合的模型进行使用。 ### 回答3: 以下为20个比较流行的点云3D分割模型的推荐: 1. PointNet:一种基于点云的深度学习架构,用于点云的分类和分割任务。 2. PointNet++:PointNet的改进版本,通过层级结构从全局和局部角度对点云进行分割。 3. PointCNN:使用卷积神经网络在点云中学习局部特征,并进行分割任务。 4. KPConv:基于卷积神经网络的点云分割模型,利用可自适应的卷积操作对点云进行处理。 5. PointSetGen:利用生成对抗网络 (GAN) 的方法,从噪声中生成3D点云,并进行分割任务。 6. PointWeb:一种使用WebGL进行点云分割的方法,具有高效的渲染和交互能力。 7. PointSIFT:利用可学习的特征权重对点云进行密集采样,并进行分割任务。 8. PointGrid:将点云转换为网格表示,在网格上进行分割任务。 9. PointCapsNet:基于胶囊网络的点云分割模型,利用胶囊结构对点云进行多尺度分析。 10. DGCNN:基于图卷积神经网络的点云分割模型,将点云转换为图结构进行分割任务。 11. MVCNN:将多视角的点云数据输入多个卷积神经网络进行分割任务。 12. MLPNet:一种使用多层感知器 (MLP) 的点云分割模型,通过多层神经网络对点云进行分析和分类。 13. PUNet:基于Unet架构的点云分割模型,通过编码和解码的过程对点云进行分割。 14. DensePoint:利用密集的点云采样策略进行分割任务,具有高分辨率的分割结果。 15. CGNet:一种使用全局和局部信息进行卷积操作的点云分割模型。 16. PointAttentionNet:通过学习点云中的注意力权重,对点云进行细粒度的分割任务。 17. EdgeConv:通过边缘卷积操作对点云进行分割任务,具有高效的计算效果。 18. PointTransformer:利用Transformer结构对点云进行特征学习和分割任务。 19. KPConv-UNet:将KPConv和UNet结构相结合,实现高效的点云分割模型。 20. RandLA-Net:一种利用自适应采样和局部特征学习的点云分割模型,具有快速和高准确度的特点。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值