Kd-Networks是一款将点云数据用于pytorch深度学习框架以实现模型识别的神经网络。他将点云转换成kdtree,继而可以作为一种结构性数据输入到设计好的神将网络。
论文链接
Github源码链接
kdtree介绍-CSDN
首先是数据集
程序设计者提供了一个点云数据集,包含15990个点云数据,分为16个类型。
16个类型包括:
{'Table': 1, 'Knife': 2, 'Car': 3, 'Chair': 4, 'Motorbike': 0, 'Pistol': 7, 'Laptop': 14, 'Mug': 8, 'Lamp': 9, 'Rocket': 5, 'Cap': 11, 'Guitar': 12, 'Airplane': 10, 'Bag': 13, 'Earphone': 6, 'Skateboard': 15}
每个点云由2048个点组成,可以建立12层的kdtree:
注意,一定注意这里是二阶张量
每个点云也有自己的标签,是一个tensor数据:
如果某个点云的点数不到2048,那用0来补全
if point_set.size(0) < num_points:
point_set = torch.cat([point_set, point_set[0:num_points - point_set.size(0)]], 0)
建立KDtree
cutdim, tree = make_cKDTree(point_set.numpy(), depth=levels)
上述方法得到cutdim, tree两个变量。
cutdim可以理解为在kdtree建立过程中每个节点切割空间的维度。
tree是三阶张量。可以理解为分为12层的一个树状结构。
根节点是tree[-12],为未分层的结构:
叶子节点是tree[-1],是完全分好的结构:
得到建立好的2048个点的kdtree排列还没结束。需要把他转化成tensor变量,在进行转置
points = torch.FloatTensor(tree[-1])
points_v = Variable(torch.unsqueeze(torch.squeeze(points), 0)).transpose(2, 1)
points_v是points的转置,points_v到points的转换如图所示
cutdim同样也是一个12层的张量,cutdim[-1]是对叶子节点上每一个叶子的维度表示。
将points_v, cutdim_v喂到神经网络中,得到一组估算概率。
上图中tensor([1])就是预测结果,也就是pred.data.max(1)[1]
然后通过下面语句可以得到预测值和真实值是否相等,correct的值为0(不等)或1(等)
correct = pred_choice.eq(target.data).cpu().sum()
corrects.append(correct)