☁️
PointCloudWork
  • 相关资料
  • 点云配准
    • 基于ICP算法
    • 基于PointNet网络
    • 基于PointNet的迭代方法
  • 点云补全
    • 三维点云补全处理与分析的综述
    • 三维点云分类和补全的结构化学习
  • 点云相关深度学习模型
    • PointNet
    • PointNet++
    • Upright-Net
    • PCN: Point Completion Network
  • 点云指标
    • 倒角距离 Chamfer Distance
    • 推土距离 The Earth Mover's Distance
    • 密度感知倒角距离 Density-aware Chamfer Distance (Editing)
    • F-Score
    • 均匀性 Uniformity
  • 其他工作
    • 基于Bert的微博评论情感分析
    • 超分辨率SR(Todo)
  • PCR
Powered by GitBook
On this page
  • 原文链接
  • 简介
  • 源码解析
  • STN3d、STNkd
  • PointNetfeat
  • PointNetDenseCls
  • PointNetCls
  1. 点云相关深度学习模型

PointNet

这篇论文是关于计算机视觉和模式识别方面的,是点云深度学习的开山之作,发表在2017年的CVPR会议上,论文编号是arXiv:1612.00593 [cs.CV]

Previous点云相关深度学习模型NextPointNet++

Last updated 2 years ago

原文链接

论文原文链接:

Github 基于Pytorch实现链接:

参考视频:

简介

点云是一种很重要的几何数据结构。因为它的格式很不规则,所以很多研究者会把这种数据转成规则的3D方格或者一堆图片集合。但这样做有时候会导致数据变得不必要的庞大,而且还会有些问题。这篇论文提出了一种新型的神经网络,能够直接使用点云数据,并且可以很好地处理输入中点的位置变化。这个网络叫PointNet,可以用于对象分类、部分分割、场景语义分析等多个领域。尽管它很简单,但非常高效而且有效。实际测试中表现很强,能够达到甚至超过当前技术水平。从理论上讲,我们也分析了这个网络学到了什么以及为什么它对输入扰动和破坏很鲁棒。

源码解析

STN3d、STNkd

Spatial Transformer Network (STN) 模型中的 3D 版本,用于学习输入点云的旋转、缩放和平移变换,使输入点云更加规范化和可比较。

STNkd也是类似的结构,只是输出的矩阵变成了k * k

前向传播结构

N
步骤
源码
尺寸
1

输入,点云数组,点数为n,每个点三个维度

(n, 3)

2

进行一维卷积,3升维到64,进行归一化,然后进入relu

x = F.relu(self.bn1(self.conv1(x)))

(n, 64)

3

进行一维卷积,64升维到128,进行归一化,然后进入relu

x = F.relu(self.bn2(self.conv2(x)))

(n, 128)

4

进行一维卷积,128升维到1024,进行归一化,然后进入relu

x = F.relu(self.bn3(self.conv3(x)))

(n, 1024)

5

在第2个维度上取最大值 (纵轴,1个batch中每一个向量的同一个下标)

x = torch.max(x, 2, keepdim=True)[0] x = x.view(-1, 1024)

(1, 1024)

6

全连接 1024 到 512 后 归一化 relu

x = F.relu(self.bn4(self.fc1(x)))

(1, 512)

7

全连接 512 到 256 后 归一化 relu

x = F.relu(self.bn5(self.fc2(x)))

(1, 256)

8

全连接 256 到 9

x = self.fc3(x)

(1, 9)

9

保证结果是正交矩阵

iden = [1,0,0,0,1,0,0,0,1] x = x + iden

(1, 9)

10

得到旋转矩阵

x = x.view(-1, 3, 3)

(1, 3, 3)

PointNetfeat

PointNet的特征提取模块,得到的结果能用于提取点云的全局(进行点云分类)或局部特征(进行点云分割),以便进行分类或分割任务。

前向传播结构

步骤
源码
尺寸
1

输入一组点云

n_pts = x.size()[2]

(batch_size, 3, n) 以下忽略batchsize

2

用STN3d,学习旋转矩阵 trans

trans = self.stn(x)

3

将x进行1与2维度转换 将x进行矩阵的旋转 再将维度换回来

x = x.transpose(2, 1) x = torch.bmm(x, trans) x = x.transpose(2, 1)

(3, n) (n, 3) (3, n)

4

1D卷积层 3->64 、归一化、relu

x = F.relu(s

elf.bn1(self.conv1(x)))

(64, n)

5

判断是否进行STN64

若是 学习矩阵、转维度、应用旋转、再转回来

trans_feat = self.fstn(x) x = x.transpose(2,1) x = torch.bmm(x, trans_feat) x = x.transpose(2,1)

(64, n)

(n, 64)

(64, n)

6

至此,得到了点云里每个点的特征 升到了64维,记录为pointfeat

pointfeat = x

(64, n)

7

将x进行连续升维 64->128->1024

x = F.relu(self.bn2(self.conv2(x))) x = self.bn3(self.conv3(x))

(128, n) (1024, n)

8

最大池化,将全局特征变为1024

x = torch.max(x, 2, keepdim=True)[0]

(1024, 1)

9

如果输出全局特征,则直接返回x

if self.global_feat: # 是否输出旋转矩阵特征 return x, trans, trans_feat

10

否则进行每个点与全局特征的拼接 ,将全局特征数据复制npt次拼上每个点

x = x.view(-1, 1024, 1).repeat(1, 1, n_pts) return torch.cat([x, pointfeat], 1), trans, trans_feat

[64+1024=1088,num_points]

PointNetDenseCls

用于对输入点云进行密集分类任务,即对每个点都预测其所属的类别。

PointNetCls

PointNet 的分类模块,用于对输入点云(整个模型)进行分类任务。

https://arxiv.org/abs/1612.00593
https://github.com/yanx27/Pointnet_Pointnet2_pytorch
https://www.bilibili.com/video/BV12e4y147xP
9MB
PointNet_Deep Learning on Point Sets for 3D Classification and Segmentation.pdf
pdf
点击下载论文原文
原文中的图,左边是学习3x3矩阵(STN3d),右边是学习kxk的矩阵
源码此类实现了图中的位置的网络
源码此类实现了图中的位置的网络
源码此类实现了图中的位置的网络