白话点云dgcnn中的pairwise_distance

article/2025/10/20 16:50:07

点云DGCNN中对于代码中pairwise_distance的分析与理解

2021年5月7日:已经勘误,请各位大佬不惜赐教。

一点一点读,相信我,我能讲清楚。

这个是本篇文章所要讨论的代码段
总体上把握,这个代码计算出了输入点云每对点之间的欧式距离。我把距离公式敲在前面:
(x1-x2)2+(y1-y2)2+(z1-z2)2
=x12+y12+z12+x22+y22+z22-2(x1x2+y1y2+z1z2)

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)   # 部分1if og_batch_size == 1:point_cloud = tf.expand_dims(point_cloud, 0)point_cloud_transpose = tf.transpose(point_cloud, perm=[0, 2, 1])   # 部分2point_cloud_inner = tf.matmul(point_cloud, point_cloud_transpose)   # 部分2point_cloud_inner = -2*point_cloud_inner   # 部分2point_cloud_square = tf.reduce_sum(tf.square(point_cloud), axis=-1, keep_dims=True)  # 部分3point_cloud_square_tranpose = tf.transpose(point_cloud_square, perm=[0, 2, 1])  # 部分3return point_cloud_square + point_cloud_inner + point_cloud_square_tranpose  # 部分4

一共分为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个点之间的欧式距离。倘若输入点云除了坐标还有属性,则这个向量是一个高维空间(特征空间)的向量。
预知后事详情且听下回分解。


http://chatgpt.dhexx.cn/article/0JDaf5dN.shtml

相关文章

推荐系统[四]:精排-详解排序算法LTR (Learning to Rank): poitwise, pairwise, listwise相关评价指标,超详细知识指南。

搜索推荐系统专栏简介:搜索推荐全流程讲解(召回粗排精排重排混排)、系统架构、常见问题、算法项目实战总结、技术细节以及项目实战(含码源) 专栏详细介绍:搜索推荐系统专栏简介:搜索推荐全流程讲解(召回粗排精排重排混排)、系统架构、常见问题、算法项目实战总结、技术…

【torch】torch.pairwise_distance分析

every blog every motto: You can do more than you think. https://blog.csdn.net/weixin_39190382?typeblog 0. 前言 记录torch.pairwise_distance 1. 一维 1.1 元素个数相同 1.1.1 元素个数为1 生成代码: t torch.randn(1) f torch.randn(1)计算代码,下…

pairwise损失_triplet损失_提升精排模型的trick

01标签 import torch import torch.nn as nn# 输入x是一个二维张量,每一行表示一个样本的分数,每一列表示一个特征或维度 x torch.tensor([[0.5, 0.7], [0.9, 0.8], [0.6, 0.4], [0.3, 0.6], [0.8, 0.7], [0.4, 0.5]])# 标签y是一个一维张量&#xff0c…

LTR (Learning to Rank): 排序算法 poitwise, pairwise, listwise常见方案总结

目录 1 Learing to Rank介绍2 The Pointwise Approach3 The Pairwise Approach3.1 RankNet 4 The Listwise Approach4.1 直接优化评测指标4.1.1 LambdaRank4.1.2 LambdaMART 4.2 定义Listwise损失函数4.2.1 ListNet4.2.2 ListMLE 5 排序评估指标5.1 Mean Reciprocal Rank (MRR)…

【论文精读】Pairwise learning for medical image segmentation

Published in: Medical Image Analysis 2020 论文:https://www.sciencedirect.com/science/article/abs/pii/S1361841520302401 代码:https://github.com/renzhenwang/pairwise_segmentation 目录 Published in: Medical Image Analysis 2020 摘要 一…

pairwise相似度计算

做了一个比赛,其中为了更好的构建负样本,需要计算不同句子之间的相似性,句子大概有100w,句子向量是300维,中间踩了很多坑,记录一下。 暴力计算 最简单的idea是预分配一个100w x 100w的矩阵,一…

如何计算 Pairwise correlations

Pairwise Correlation的定义是啥?配对相关性?和pearson correlations有什么区别? Pairwise Correlation顾名思义,用来计算两个变量间的相关性,而pearson correlations只是计算相关性的一种方法罢了。 1、pearson相关系…

再谈排序算法的pairwise,pointwise,listwise

NewBeeNLP干货 作者:DOTA 大家好,这里是 NewBeeNLP。 最近因为工作上的一些调整,好久更新文章和个人的一些经验总结了,下午恰好有时间,看了看各渠道的一些问题和讨论,看到一个熟悉的问题,在这…

【推荐】pairwise、pointwise 、 listwise算法是什么?怎么理解?主要区别是什么?

写在前面:写博客当成了学习笔记,容易找到去完善,不用于商业用途。通过各种途径网罗到知识汇总与此,如有侵权,请联系我,我下掉该内容~~ 排序学习的模型通常分为单点法(Pointwise Approach&#…

软件测试用例设计之Pairwise算法

Pairwise算法简介 Pairwise是L. L. Thurstone(29 May1887 – 30 September 1955)在1927年首先提出来的。他是美国的一位心理统计学家。Pairwise也正是基于数学统计和对传统的正交分析法进行优化后得到的产物。 测试过程中,对于多参数参数多值的情况进行测试用例组…

磁盘配额中quotacheck不能创建aquota.user和aquota.group文件的问题

在centos6.5学习中有关磁盘配额的内容中,发现quotacheck -augv 命令无法创建aquota.group 和aquota.user文件, 操作系统挂载在/home下,经排查发现是SELinux的问题,使用setenforce 0命令将其关闭后,重新执行quotacheck…

Linux从入门到精通(八)——Linux磁盘管理

文章篇幅较长,建议先收藏,防止迷路 文章跳转Linux从入门到精通(八)——Linux磁盘管理goLinux从入门到精通(九)——Linux编程goLinux从入门到精通(十)——进程管理goLinux从入门到精…

Linux:Quota 的基本命令​​​​​​​

在开始进行 quota 的实作之前,我们得来了解一下 quota 要使用的指令啰! 基本上分为两种,一种是查询功能(quota, quotacheck, quotastats, warnquota, repquota),另一种则是编辑 quota 的内容( …

01_Linux系统管理_基础知识_高级文件系统管理_磁盘配额(quota)

环境 虚拟机:VMware-10.0.7 build-2844087Linux系统:CentOS 6.8远程工具:Xshell 6 (Build 0197) 01_Linux系统管理_基础知识_高级文件系统管理_磁盘配额 一、什么是磁盘配额(quota) 磁盘配额概念 对用户和用户组使用磁…

linux 系统配额管理功能,磁盘配额管理_Linux教程_Linux公社-Linux系统门户网站

在多用户系统中,如果没有对用户使用的磁盘空间做出限制,用户无限制地存放数据和文件,可能会导致系统磁盘空间告警。如果存放的是无用数据,就会导致磁盘空间白白浪费。磁盘配额可以限制用户或组在磁盘上存放文件的空间,…

Linux复习笔记

Linux复习笔记 常识说明 目录结构 Linux以树型结构管理文件,其最上层文件夹为 / ,也就是根目录。 如图所示,图中展示了一部分文件夹的结构: 所有的文件夹都属于根目录的子文件夹。 安装好系统后,根目录会挂载到一…

linux对目录空间使用限制,Linux quotacheck命令使用详解:检查磁盘的使用空间和限制...

quotacheck命令通过扫描指定的文件系统,获取磁盘的使用情况,创建、检查和修复磁盘配额(quota)文件。执行quotacheck指令,扫描挂入系统的分区,并在各分区的文件系统根目录下产生quota.user和quota.group文件,设置用户和…

Linux常用命令——quotacheck命令

在线Linux命令查询工具(http://www.lzltool.com/LinuxCommand) quotacheck 检查磁盘的使用空间与限制 补充说明 quotacheck命令通过扫描指定的文件系统,获取磁盘的使用情况,创建、检查和修复磁盘配额(quota)文件。执行quotach…

Linux quotacheck失败

我找了多少个帖子才发现解决这个问题的啊...最终还是靠FQ找的这位大佬的文章 http://www.2daygeek.com/quotacheck-error/# 当我在执行quotacheck -avug的时候出现如下的错误: quotacheck: 无法从 /dev/sdb1 上的文件名猜测其格式,请在命令行中指定一个…

Linux系统输入quotacheck -ugcv /dev/sdb1报错

quotacheck -ugcv /dev/sdb1 报错处理 报错大多因为selinux没有关闭 [rootlocalhost fanhuilin]# quotacheck -ugcv /dev/sdb1 quotacheck: Your kernel probably supports journaled quota but you are not using it. Consider switching to journaled quota to avoid runni…