SO-Net中分类器(classifier)的实现过程

本文详细介绍了SO-Net模型中分类器的实现过程,包括数据准备、编码网络和分类网络的各个组件,如SOM层、first_pointnet、knnlayer和final_pointnet。在数据准备阶段,对点云数据进行增强处理。编码网络由SOM层开始,通过first_pointnet、knnlayer和final_pointnet逐步提取特征。分类器部分是一个三层全连接网络,用于预测点云的类别并使用交叉熵损失进行训练。最后,文章还涵盖了模型的测试、保存和学习率更新。
摘要由CSDN通过智能技术生成

一、数据准备

  该部分代码位于./data/modelnet_shrec_loader.py中。读取的数据为pc_np(点的坐标),surface_normal_np(法向量),som_node_np(som节点坐标)和class_id(类别)。然后对数据增强,包括旋转、微扰、尺度变换和位移。返回点的坐标、法向量、类别、som节点和每个som节点在som节点中的k个近邻点的索引。

二、模型

  该部分代码位于./models/classifier.py。主要包括两个部分:编码网络和分类网络。
在这里插入图片描述

2.1编码网络

  编码器如上图蓝色底色的部分所示。具体的定义在./models/networks.py中。在Encoder类forward中可以看到,其输入为点的坐标、法向量、节点坐标和节点到节点的knn索引。

2.1.1 SOM层

  如上图所示,第一部分为SOM层。通过./util/som.pyBatchSOM类中的query_topk()函数实现映射,返回mask,mask_row_max和min_idx。
(1)mask:其大小为[B,kN,M],第i个N*M行表示节点是否为N个点的第i近邻节点。
在这里插入图片描述

上图中红色的1表示第2个节点是第一个点的第一近邻点。蓝色的1表示第3个节点是第四个点的第一近邻点,而最下方的1表示第5个节点是第三个点的第二近邻点。
(2)mask_row_max:其大小为[B,M],表示每个节点是否存在近邻的点
在这里插入图片描述

其中1表示第i个节点是某个点的近邻点。
(3)min_idx:其大小为[B,kN],第i个N*1行表示N个点的第i近邻节点的索引。
在这里插入图片描述

与mask对应,表示最近邻索引值。
  然后获取以每个节点为近邻的所有点的中心。

		self.mask, mask_row_max, min_idx = self.som_builder.query_topk(x.data, k=self.opt.k)  # BxkNxnode_num, Bxnode_num
        mask_row_sum = torch.sum(self.mask, dim=1)  # BxM
        mask = self.mask.unsqueeze(1)  # Bx1xkNxM

        #将x和sn堆叠
        x_list, sn_list = [], []
        for i in range(self.opt.k):
            x_list.append(x)
            sn_list.append(sn)
        x_stack = torch.cat(tuple(x_list), dim=2)  # B x C x kN
        sn_stack =
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值