pointnet++源码学习

pointnet++中包含pointnet源码,因此只看pointnet++就可以了

整体流程

以debug的形式看源码,分析电源数据在网络中的变化过程,如何进行特征提取
以batch size = 2 为例

输入数据: 2, 1024, 3
->channel_first 2, 3, 1024

第一个SA

首先又给变回来了 2,1024,3
然后是MSG 三个不同的半径
利用query_ball_point()进行分组

最远点采样
选择了512个点[ 2,512,3] ,然后以这个512个点为圆心,给定的r半径进行分组,
进行分组
三个半径进行的操作分开做了,最后进行了合并在一起
以第一个为例

经过第一个半径的分组得到的数据为 [2,512,16,3],这里的16是指在当前半径范围内选择16个点;
然后调整通道顺序为[2,3,16,512]
经过mlp进行特征提取结果为
[2,64,16,512]
解释一下:2-batchsize 64-channel 16是一个组的点的数量
再求最大值(就是对每一个组求最大值,pointnet中的maxpool一样)
得到最终的结果为[2,64,512]
这就是第一个分组进行mlp之后的结果

另外两个半径的结果分别为[2,128,512]、[2,128,512].然后将三个结果concat
最终为[2,320,512]
再对着代码解释一下,下面是forward 前向传播的中的代码

 l1_xyz, l1_points = self.sa1(xyz, norm)print('l1_xyz shape ',l1_xyz.shape)print('l1_points shape ',l1_points.shape)

sa1就是第一个SA
会输出两个结果
我们看一下它们的shape形式

l1_xyz shape  torch.Size([2, 3, 512])
l1_points shape  torch.Size([2, 320, 512])

第一个l1_xyz 是我们利用最远点采用选择的512个 这里也给输出了
第二个l1_points 就是我们对每一个簇经过mlp卷积之后的结果,详见上面的分析
后续的都是类似的

第二SA

送入SA的由两部分组成,
一个是经过最远点采样之后的点[2,3,512],以及MLP之后的结果为[2,320,512]
经过MLP之后的结果作为一部分特征放入到网络中,
提取之后的结果为
[2,3,128] 最远点采样的结果
[2,640,128] MLP之后的

第三次SA

[2,1024,1]

最后分类

针对[2,1024,1]的特征进行分类,MLP完成,比较简单。

源码

我在看源码的时候最难理解的就是 FPS 最远点采样,因为记录一下思路。

首先定义了centroids和distance作为后续存储中心点和距离
随机选择一个点 作为最远点的开始,
然后求所有点到这个点的距离
得到一个新的距离矩阵dist
这个dist和distance进行比较,如果距离小,就将distance结果进行替换,
然后根据distance矩阵 选择最大值吗,也就距离最大的值。得到相应的索引
在求第三个点的时候呢,计算所有点到第二点的距离dist
和distance进行比较 注意这里的distance表示是什么意思,表示所有的点到第一个点的距离
这二者进行比较 也就说,所有的点分别到第一个点的距离 和第二点的距离,选择比较小的距离,更新到distance中。那么此时的distance就变成,所有的点到第一个点和第二点的距离中,最短的距离。这里比较关键,我一点点画图才明白
后面找距离最近的中 最大的确定为下一个点,继续这样的迭代。

def farthest_point_sample(xyz, npoint):"""Input:xyz: pointcloud data, [B, N, 3]npoint: number of samplesReturn:centroids: sampled pointcloud index, [B, npoint]"""device = xyz.device #B, N, C = xyz.shape##先定义处中心点的矩阵以及距离矩阵,中心点就是我们最远点采样的点数第一次是512centroids = torch.zeros(B, npoint, dtype=torch.long).to(device)#2*512distance = torch.ones(B, N).to(device) * 1e10 #1024 先定义出来的距离矩阵数字很大的#最远点,第一个最远点是随机选择的#随机的索引,比如[224,518],两个值是因为batch size为2farthest = torch.randint(0, N, (B,), dtype=torch.long).to(device)#batch里每个样本随机初始化一个最远点的索引# 每个batch里面的索引batch_indices = torch.arange(B, dtype=torch.long).to(device)for i in range(npoint): #第一次的npoint为512,循环512cicentroids[:, i] = farthest #第一个采样点选随机初始化的索引centroid = xyz[batch_indices, farthest, :].view(B, 1, 3)#得到当前采样点的坐标 B*3 dist = torch.sum((xyz - centroid) ** 2, -1)#计算当前采样点与其他点的距离mask = dist < distance#选择距离最近的来更新距离(更新维护这个表),一个包含bool构成的maskdistance[mask] = dist[mask]#farthest = torch.max(distance, -1)[1]#重新计算得到最远点索引(在更新的表中选择距离最大的那个点)return centroid

点云3D目标检测学习(2):pointnet++源码相关推荐

  1. 点云3D目标检测学习(1):pointnet、pointnet++模型

    3D目标检测学习笔记 开始正式进入3D目标检测的学习!!! 1.点云数据 无序性:只是点而已,排列顺序不影响 近密远疏 非结构化数据,直接CNN有点难 2.PointNet CVPR2017 Poin ...

  2. 点云3D目标检测学习(3):Complex YOLO

    Complex YOLO CVPR 2018的一篇文章 因为对YOLO相对熟悉一些,因此以Complex YOLO 做为第一个学习的3D目标检测模型 主要贡献 1.检测速度快的3D检测网络 2.使用E ...

  3. AAAI 2020 Oral论文--TANet:提升点云3D目标检测的稳健性

    点击上方"深度学习技术前沿",选择"星标"公众号 资源干货,第一时间送达 来自华中科技大学白翔教授组的刘哲的 AAAI Oral 论文<TANet: Ro ...

  4. 点云 3D 目标检测 - PointPillars(CVPR 2019)

    点云 3D 目标检测 - PointPillars(CVPR 2019) 摘要 1. 导言 1.1 相关工作 1.1.1 使用CNNs进行目标检测 1.1.2 激光雷达点云中的目标检测 1.2 贡献 ...

  5. 点云 3D 目标检测 - VoxelNet(CVPR 2018)

    点云 3D 目标检测 - VoxelNet(CVPR 2018) 摘要 1. 引言 1.1 相关工作 1.2 贡献 2. VoxelNet 2.1 VoxelNet架构 2.1.1 特征学习网络 2. ...

  6. 激光点云3D目标检测算法之PointPillars

    前言 <PointPillars: Fast Encoders for Object Detection from Point Clouds>是一篇发表在CVPR 2019上关于激光点云3 ...

  7. 点云 3D 目标检测 - SECOND(Sensors 2018)

    点云 3D 目标检测 - SECOND: Sparsely Embedded Convolutional Detection - 稀疏嵌入卷积检测(Sensors 2018) 摘要 1. 引言 2. ...

  8. 点云 3D 目标检测 - RangeDet(ICCV 2021)

    点云 3D 目标检测 - RangeDet: In Defense of Range View for LiDAR-based 3D Object Detection - 基于LiDAR的3D目标检测 ...

  9. 点云 3D 目标检测 - CenterPoint:Center-based 3D Object Detection and Tracking(CVPR 2021)

    点云 3D 目标检测 - CenterPoint: Center-based 3D Object Detection and Tracking - 基于中心的3D目标检测与跟踪(CVPR 2021) ...

  10. AAAI 2020 Oral | 华科提出TANet:提升点云3D目标检测的稳健性

    点击我爱计算机视觉标星,更快获取CVML新技术 本文转自机器之心. 机器之心发布 机器之心编辑部 2020 年 2 月 7 日-2 月 12 日,AAAI 2020 将于美国纽约举办.不久之前,大会官 ...

最新文章

  1. sql 精读(一)标准 SQL 中的分析函数概念
  2. 5.5 关于数据的问题
  3. P3293-[SCOI2016]美味【主席树】
  4. 七月算法--12月机器学习在线班-第五次课笔记—回归
  5. Mac电脑「空格键」的使用技巧
  6. ubuntu下u盘变成只读文件
  7. Sauce Labs将分析和扩展调试添加到其持续测试云中
  8. mysql外部关联视图_MySQL数据库 : 自关联,视图,事物,索引
  9. 如何保持连接_酒店厨房设备如何保养清洗?
  10. 【免费领取】石杉架构班Kafka消息中间件内核源码课程
  11. python爬楼梯问题_python解决上楼梯问题
  12. 路线指示箭头的生成——两个Vector3计算Distance,Rotation
  13. 2021-10-22 今日总结
  14. Python爬虫进阶--js逆向-某天下与某某二手房密码加密分析
  15. cad用键盘放大缩小_CAD放大缩小快捷键 _ 2D3D网
  16. 联通链:5G时代的信任链
  17. 快给你的对象做一个微信公众号播报吧-java版
  18. Java 中j+=i 和 j=+i 的区别
  19. python绘图篮球_用Python把NBA球员投篮数据可视化
  20. windows下缩短cmd路径的方式

热门文章

  1. i7-10750H和i7-8750H 对比哪个好
  2. armbian 斐讯n1_斐讯N1刷Armbian Linux做服务器
  3. MySQL多表联查常用函数数据库设计规范
  4. 《Renewable and Sustainable Energy Reviews》期刊介绍(SCI 1区)
  5. 自己动手来做一寸或两寸照片(使用工具)
  6. html5在线画板菱形怎么画,HTML5 Canvas 制作一个“在线画板”
  7. 双眼融合训练一个月_视觉融合功能的四种训练方法
  8. ZEMAX Samples Sequential
  9. ZEMAX | 绘图分辨率结果对光线追迹的影响
  10. 计算机主机电源功率查,电脑电源功率怎么测试?查看电脑功耗的操作方法