• pointNET学习笔记


    在这里插入图片描述

    论文讲解

    https://www.bilibili.com/video/BV1xQ4y1D7R4?spm_id_from=333.337.search-card.all.click&vd_source=e7d12c9f66ab8294c87125a95510dac9

    For the object classification task, the input point cloud is
    either directly sampled from a shape or pre-segmented from
    a scene point cloud.

    object part segmentation
    semantic scene parsing

    点云三大特征

    第三点 变换不变性 有待考证,做classification 以及 segmentation可以
    但是要做配准以及补全,需要考虑旋转变换等的性质。

    针对无序性

    这里是f范数的平方 loss reg,相当于就是逼近他所需要的正交矩阵

    T-net
    如果不做正交化,后面的特征可能退化,变为0。
    在这里插入图片描述

    整体逼近能力

    局部的扰动不会对整体造成影响

    逼近连续函数

    点集介于最小集以及最大集之间,那么结果不变。

    在这里插入图片描述

    pointnet

    任务

    分类任务, 部件分割,场景分割

    https://www.bilibili.com/video/BV1ES4y1t7Vt?p=4&vd_source=e7d12c9f66ab8294c87125a95510dac9在这里插入图片描述

    点云特征

    1 多视图将局部特征 2d 拼接 太麻烦,计算量大

    点云: 无序性 , 近密远疏,非结构化数据(直接cnn有点难),
    如何对点云进行特征提取

    2 模型具有置换不变性
    在这里插入图片描述
    max 和加法可以体现点云特性

    一个样本许多点,n个点最后浓缩出来一个点,只有三个特征,损失太大
    每个点先去升维
    在这里插入图片描述
    在这里插入图片描述

    1 每一个点都做升维度 n3 经过mlp变成 n64
    2 自身点特征+ 全局特征1024维度的 = 1088维度的

    基础知识

    https://www.bilibili.com/video/BV1nF411q7LW?spm_id_from=333.337.search-card.all.click&vd_source=e7d12c9f66ab8294c87125a95510dac9
    在这里插入图片描述
    点云优势

    常用的 sum和 max 都是对称函数

    在这里插入图片描述

    pointnet ++

    对点云局部特征提取

    分类任务

    1 N 点的个数, d 数据存储维度,c 特征值存储的维度
    2 经过sampling以及grouping后,点的个数缩小,变成N1
    3 经过pointnet后,学习局部的全局特征,特征维度变为c1

    分割任务

    上采样过程主要通过
    1 反向插值
    2 skip link concatenation
    通过上一层的 几个点来算本层某点的 特征, 权重主要参考上层点与本层点的距离。 加权

    将之前对应的层的维度特征直接拼到本层, 可以看到图中c1+c2,这里的c2和前面的c2不是一个概念,但是c1和前面的是一个概念。这里的c2是由上一层的加权求出的。
    在这里插入图片描述

    主要依据:

    https://blog.csdn.net/weixin_39373480/article/details/88878629
    https://blog.csdn.net/sinat_17456165/article/details/106596332

    论文阅读

    https://www.bilibili.com/video/BV1Hf4y1g7Az/?spm_id_from=333.337.search-card.all.click&vd_source=e7d12c9f66ab8294c87125a95510dac9

    maxpooling 对局部的信息缺失影响
    局部变换不变性从而整体的不变性

    采样层

    最远距离采样层

    pointnet 代码

    https://www.bilibili.com/video/BV1bb4y1Y72w?spm_id_from=333.337.search-card.all.click&vd_source=e7d12c9f66ab8294c87125a95510dac9

    T-net

    用矩阵对输入点或者特征空间进行空间变换,保证变换不变性。
    将输入空间或特征空间对齐到基准空间。
    第一次输出3 x 3 矩阵
    第二次输出 64 x 64 矩阵

    个人理解: 他的效果相当于 3 x 3 的矩阵。最后输出就是3 x 3 的矩阵。
    在这里插入图片描述
    左右代码其实差不多,区别在于输入,一个是3维度的,一个是64维度的

    1 : n x 3 两种实现风格
    n 相当于channel层
    batchsize * n* 3 作为线性层,全连接层。3变成后续的维度。
    或者3*n ,3看作channel 然后后面跟1维卷积, 对n进行卷积,局部以及全局共享,相当于对所有channel的线性层
    2 maxpooling
    无序集合
    置换不变性:标量函数调换任意两个变量结果不变,
    如果输入输出维度一样,输入顺序调换,输出的结果也要调换。
    如果说是标量函数,如何满足置换不变性。涉及到如何做pooling。论文中只是全局pooling还是比较粗糙的。
    全部加起来或者乘起来都是一样了,可以取一个log。或者取最大值。涉及到两种策略:

    maxpooling 以及 averagepooling 后者可能更好
    最后两个都挂实验跑一下看哪个好。
    3 k可以看作one hot 向量 ,可以去和label做cross entpy,做classification
    4 segmentation必须要global全局的feature,不然点云之间没有联系
    5 每个点的m维向量又是一个one hot 向量,之后做分类任务。
    6 batchnorm 要注意 不是适合每个任务的。

    一维卷积!

    在这里插入图片描述
    输入通道3, 过滤器 1 * 3(卷积核),64个卷积核. 一个卷积核: 31 x 13 = 1个结果,64个就是64个结果。

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    三个卷积层升维到1024 后面跟三个全连接层降维到9
    旋转矩阵3x3 最后一个全连接层的输出为9

    batchnormal 是为了防止模型的过拟合 ,并 归一化,对应每一层的卷积和全连接层。

    39行;卷积升维后归一化操作,再relu
    取最大值,2表示在第三个维度上取最大值。 0表示取最大值的值而不是索引
    通过view改变形状,-1表示系统自动判断。
    50行 相当于单位矩阵 3x3矩阵输出
    在这里插入图片描述

    第二个t-net

    最后一个全连接层输出 k x k 是因为 对64维度的特征进行变换

    最后返回kxk 的变换矩阵
    在这里插入图片描述
    global feat默认为true 设置为区分分割还是分类,分类默认为true
    https://blog.csdn.net/yuanmiyu6522/article/details/121435650

    Hausdorff空间

    假设X是拓扑空间。设x和y是X中的点。如果存在x的邻域U和y的邻域 V 使得 U 和 V 是不相交的(U∩V=∅),我们称x和y可以“由邻域分离”。X是豪斯多夫空间如果任何两个X的不同的点可以由邻域分离。这是豪斯多夫空间也叫做T2空间和分离空间的原因。
    X是预正则空间,如果任何两个拓扑可区分的点可以由邻域分离。预正则空间也叫做R1空间。
    在这些条件之间的联系如下。拓扑空间是豪斯多夫空间,当且仅当它是预正则空间和柯尔莫果洛夫空间的二者(就是说独特的点是拓扑可区分的)。拓扑空间是预正则空间,当且仅当它的柯尔莫果洛夫商空间是豪斯多夫空间。

    卷积关系

    一维卷积
    二维卷积
    三维
    https://blog.csdn.net/perfect_csdn1/article/details/116862691
    https://www.cnblogs.com/szxspark/p/8445406.html
    https://zhuanlan.zhihu.com/p/418092190

    激活之前归一化

    激活之前归一化是因为 经过线性变换后数值可能会有偏差,数字的分布经过该处理后会强行成为正态分布的过程,之后再使用激活函数效果更好,不会受到数据偏差的影响。 数据刷整齐一点。

    最大池

    去掉一些特征,选择最大的一些特征。
    不会受到变换的影响,最大值是不变的

    区别

    tensflow和 pythorch区别
    view以及resize
    一维卷积的区别,tensflow中二维卷积的形式达成一维卷积功能

    代码补充

    64维度特征流程
    在这里插入图片描述

    整个代码流程

    在这里插入图片描述
    global feat默认为true 设置为区分分割还是分类,分类默认为true
    在这里插入图片描述
    计算两个tensor的矩阵乘法,torch.bmm(a,b)

    Python view()和repeat()

    1.2 Tensor.view(-1)或Tensor.view(-1, 1)
    含义:当参数中存在-1时,表示该位置的数值需要经过计算
    view中一个参数定为-1,代表动态调整这个维度上的元素个数,以保证元素的总数不变
    https://blog.csdn.net/weixin_34280060/article/details/123840788

    https://blog.csdn.net/MLH7M/article/details/122043033
    当size参数有三个时,Tensor.repeat(num_channel, num_row, num_col),第一个num_channel表示通道数的复制倍数,num_row表示行方向的复制倍数,第二个num_col表示列方向的复制倍数。

    重构为 1024行 1列
    之后行不变,列复制n_pts倍
    n x 1024 maxpool 后,每一个维度取最大值, 成了1 x 1024,n个点浓缩成1个点,总的特征再去处理。

    拼接是 n x 64 拼接 n x 1024 ,所以1x 1024 扩展成 n x 1024
    1024行 1列 沿着 列的维度 扩展n倍。

    torch.nn.MaxPool1d

    torch.nn.MaxPool1d是在某一维度上用滑动窗口以某种跳步取最大池化,确实窗口长度=列表长度、其他参数默认的情况下池化计算的结果与torch.max相同,但是未免太大材小用,杀鸡牛刀。

  • 相关阅读:
    3分钟带你了解前端缓存-HTTP缓存
    Spring 事务原理总结五
    Flink学习15:Flink自定义数据源
    提示词优化的自动化探索:Automated Prompt Engineering
    Java面试:全面掌握Java知识的捷径!
    C#值类型设置为null
    Hexagon_V65_Programmers_Reference_Manual(6)
    如何合理的导出help link 成HTML
    Wireshark抓包分析TCP协议:三次握手和四次挥手
    Java、前端、Python 现在应该如何选择,学习哪个更好?
  • 原文地址:https://blog.csdn.net/MakeYouClimax/article/details/126926738