DGCNN代码

pairwise_distance():计算输入点云每对点之间的欧式距离

(x1-x2)2+(y1-y2)2+(z1-z2)2
=x12+y12+z12+x22+y22+z22-2(x1x2+y1y2+z1z2)

pairwise_distance的返回值是一个形状为(B,N,N)的张量,也就是有B个batch,每个batch有N个点,而每个点又对应了全部点的pairwise_distance。

def pairwise_distance(point_cloud):
  """Compute pairwise distance of a point cloud.

  Args:
    point_cloud: tensor (batch_size, num_points, num_dims)

  Returns:
    pairwise distance: (batch_size, num_points, num_points)
  """
  og_batch_size = point_cloud.get_shape().as_list()[0]
  point_cloud = tf.squeeze(point_cloud)   # 部分1
  if og_batch_size == 1:
    point_cloud = tf.expand_dims(point_cloud, 0)
    
  point_cloud_transpose = tf.transpose(point_cloud, perm=[0, 2, 1])   # 部分2
  point_cloud_inner = tf.matmul(point_cloud, point_cloud_transpose)   # 部分2
  point_cloud_inner = -2*point_cloud_inner   # 部分2
  point_cloud_square = tf.reduce_sum(tf.square(point_cloud), axis=-1, keep_dims=True)  # 部分3
  point_cloud_square_tranpose = tf.transpose(point_cloud_square, perm=[0, 2, 1])  # 部分3
  return point_cloud_square + point_cloud_inner + point_cloud_square_tranpose  # 部分4

部分1:输入点云

我们可以将输入的点云理解为一个瘦高灰度图像,即竖着的长条矩阵。矩阵的每一个行代表一个空间点,这一行里的值有坐标值(现在仅仅讨论这个最简单的情况)。

在这里插入图片描述

部分2:矩阵转置与矩阵乘法

现在,把这个矩阵copy一份,并且给它放躺下,作矩阵乘法(如下图)。形状为(B,N,3)转置为(B,3,N),然后二者矩阵乘法得到形状为(B,N,N)的张量,叫它point_cloud_inner。现在我们来看看这个结果到底是什么。

point_cloud_inner的几何意义就是,开头公式中的(x1x2+y1y2+z1z2)
现在要把这个point_cloud_inner的每个元素乘以-2
也就变成了开头公式中的-2(x1x2+y1y2+z1z2),现在还差啥?接着凑x12+y12+z12+x22+y22+z22

在这里插入图片描述

部分3:输入点云各自平方再求和

对输入点云的每一行元素各自求取平方,然后再加起来,得到形状为(B,N,1)的张量。这里每个点看作一个空间向量,求自身的模的平方,也就是自己长度的平方,叫这个张量为point_cloud_square。这个就是x2+y2+z^2,但是,这个是将点坐标平方和竖着放的,也就是一行对应一个点,也就是这个点的坐标平方和。

之后,point_cloud_square经过转置变为形状为(B,1,N),叫这个结果为point_cloud_square_tranpose。这个就有意思了,这个是横着放的,一个列对应一个点,也就是一个列放着不同的点坐标平方和。

在这里插入图片描述

部分4:矩阵元素求和

这一部分是最后一部分,求取point_cloud_square、 point_cloud_inner 、point_cloud_square_tranpose的代数和,也是最终的返回值。这里面用到了广播机制,下面图里面的先复制,再相加。也就是说当形状为(B,N,N)与(B,N,1)相加时,后者沿着为1的维度复制为(B,N,N),然后在于前者相加。point_cloud_square与point_cloud_square_tranpose都会被广播为(B,N,N)然后在与 point_cloud_inner进行相加。

在这里插入图片描述

 point_cloud_square是竖着放点坐标和,所以横着广播,变成了
a a a …
b b b…

i i i…

point_cloud_square是横着放,所以竖着广播,变成了
a b c … i …
a b c … i …

a b c … i …

然后point_cloud_square+point_cloud_square不就实现了x12+y12+z12+x22+y22+z22吗?
point_cloud_square+point_cloud_inner+point_cloud_square不就为每个点凑齐了x12+y12+z12+x22+y22+z22-2(x1x2+y1y2+z1z2)吗?
这个就是点间的距离。
最后的返回张量形状为(B,N,N),取其中(b,i,j),那么其具体含义就是,第b个batch中,第i个点与第j个点之间的欧式距离。倘若输入点云除了坐标还有属性,则这个向量是一个高维空间(特征空间)的向量。


(4条消息) tf.nn.top_k()用法_太空的旅行者的博客-CSDN博客


KNN

如果两个点的距离越远,那么这个pairwise_distance张量的对应位置所存储的值就越大,反之亦然。同时,knn是找点的最近的k个点。

def knn(adj_matrix, k=20):
  """Get KNN based on the pairwise distance.
  Args:
    pairwise distance: (batch_size, num_points, num_points)
    k: int

  Returns:
    nearest neighbors: (batch_size, num_points, k)
  """
  neg_adj = -adj_matrix
  _, nn_idx = tf.nn.top_k(neg_adj, k=k)
  return nn_idx

主要利用tf.nn.top_k()来查找最近的点。因为tf.nn.top_k()只能查找最大的元素,所以把输入的adj_matrix也就是pairwise_distance的返回值乘以-1,这样在通过tf.nn.top_k()返回的就是最小值了。
tf.nn.top_k()沿着最后一个维度搜索,先返回值,再返回值的索引。这里索引是我们需要的。


get_edge_feature()——边特征的学习和理解
(4条消息) 点云dgcnn边特征理解_太空的旅行者的博客-CSDN博客


  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
DGCNN(Dynamic Graph Convolutional Neural Network)是一种用于图像分类和分割任务的深度学习模型。它是由Maximilian Nickel等人于2018年提出的。 DGCNN使用图卷积神经网络(GCN)来处理图形数据。传统的卷积神经网络(CNN)主要适用于处理规则结构的图像数据,无法直接处理非规则结构的图数据。而GCN具有处理图数据的能力,可以利用图的邻域信息进行特征提取和图结构处理。 DGCNN的主要特点是使用动态图来建模非规则的图形数据。它通过构建一个动态的k最近邻图来捕捉图像的空间特征。然后,通过一系列的图卷积层和max-pooling层对图像的特征进行提取和汇总。最后,通过全连接和softmax层进行分类或分割任务。 在使用Python实现DGCNN时,我们可以使用深度学习框架,如TensorFlow或PyTorch。首先,我们需要定义模型的网络结构,包括图卷积层、max-pooling层和全连接层等。然后,我们可以使用训练数据进行模型的训练和优化。训练过程中,我们可以使用反向传播算法来更新模型的参数,使得模型能够更好地拟合训练数据。最后,我们可以使用测试数据对模型进行评估,并计算准确率或其他评价指标。 总之,DGCNN是一种用于图像分类和分割任务的深度学习模型。它通过动态图建模非规则图像数据,并使用图卷积神经网络对图像特征进行提取和汇总。使用Python实现DGCNN时,我们可以使用深度学习框架来定义网络结构、训练模型和评估模型。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值