Pointnet++包含pointnet源代码,所以看pointnet++
以debug的形式看源码,分析网络中电力数据的变化过程,以及如何提取特征
以batch size u003d 2为例
输入数据:2、1024、3
->频道_first 2, 3, 1024
一、改回21024、3
那么味精有三种不同的半径
使用 query_ball_point() 进行分组
最远点采样
选取512个点[2512,3],然后以512个点为圆心对给定的r进行分组,
团体
三个半径的运算分别进行,最后合并在一起
以第一个为例
通过第一个半径分组得到的数据是[2512,16,3]
然后改为[2,3,16512]
mlp特征提取后,结果为
[2,64,16,512]
说明:2-batchsize 64 通道 16 是一组中的点数
再次求最大值(即每组求最大值,与pointnet中的maxpool相同)
最终结果是 [2,64512]
这是第一组 mlp 的结果
其他两个半径的结果是[]和[] 然后concat三个结果
最后是[]
第二SA
into SA 由两部分组成,
一个是最远点采样后的点[2,3512],MLP后的结果是[]
MLP之后的结果作为特征的一部分放入网络,
提取后的结果是
[2,3128] 最远点采样结果
[] 在 MLP 之后
第三SA
[2,3,1]
[21024, 1] 在 MLP 之后
最终分类
根据[21024,1]的特点进行分类,MLP就完成了,比较简单。
FPS最远点采样,每一行都有注释,其他代码比较简单
首先将质心和距离定义为后续存储中心点和距离
随机选择一个点作为最远点的起点,
然后求所有点到该点的距离
得到一个新的距离矩阵dist
将此距离与距离进行比较。如果距离很小,替换距离结果,
然后根据距离矩阵选择最大值,即距离最大的值。获取对应的索引
计算第三个点时,计算所有点到第二个点的距离dist
比较一下距离。注意这里的距离意味着什么。表示所有点到第一个点的距离
比较两者,即所有点到第一个点的距离和到第二个点的距离。选择较小的距离并将其更新为距离。那么这个距离就变成了所有点到第一个点和第二个点的最短距离。这是关键。画一点就明白了
下一个点被确定为最近点中最大的一个,并继续迭代。
def 最远_point_sample(xyz, npoint):
"""
输入:
xyz:点云数据,[B, N, 3]
npoint:样本数
返回:
质心:采样点云索引,[B, npoint]
"""
设备 u003d xyz.device #
B、N、C u003d xyz.shape#
#首先定义中心点的矩阵和距离矩阵。中心点是我们最远的点。首次采样点数为512
质心 u003d torch.zeros(B, npoint, dtypeu003dtorch.long).to(device)#2*512
distance u003d torch.ones(B, N).to(device) * 1e10 #1024 先定义的距离矩阵有大数
#最远点,随机选择第一个最远点
#随机索引,如[],有两个值,因为batch size为2
farthest u003d torch.randint(0, N, (B,), dtypeu003dtorch.long).to(device)#批量中,每个样本随机初始化一个最远点的索引
批次_indices u003d torch.arange(B, dtypeu003dtorch.long).to(device)
for i in range(npoint): #第一个npoint为512,循环为512ci
centroids[:, i] u003d farthest #第一个采样点选择随机初始化的索引
centroid u003d xyz[batch_indices, farthest, :].view(B, 1, 3)#获取当前采样点的坐标B*3
dist u003d torch.sum((xyz - centroid) 2, -1)#计算当前采样点与其他点的距离
mask u003d dist < distance#选择最近的一个更新距离(更新并维护这张表),一个由bool组成的掩码
距离[面具] u003d 灰尘[面具]#
farthest u003d torch.max(distance, -1)[1]#重新计算最远点索引(选择更新表中距离最大的点)
返回质心


版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/160431.html