发布时间:2023-04-03 文章分类:电脑基础 投稿人:樱花 字号: 默认 | | 超大 打印

这篇文章是点云神经网络的鼻祖,它提出了一种网络结构,可以直接从点云中学习特征。如何设计出符合点云特点的网络是一个难点。在了解这个神经网络之前,容本小白先了解一下3D点云的基本知识。

首先要说清楚,PointNet所作的事情就是对点云做特征学习,并将学习到的特征去做不同的应用:分类(shape-wise feature)、分割(point-wise feature)等。

PointNet之所以影响力巨大,就是因为它为点云处理提供了一个简单、高效、强大的特征提取器(encoder),几乎可以应用到点云处理的各个应用中,其地位类似于图像领域的AlexNet。

目录

0x01 3D点云的基本知识

(一)点云概述

(二)点云的获取

(三)点云的内容

(四)点云的属性

(五)点云的存储格式

(六)相应基础算法库对不同格式的支持

(七)点云分割

(八)点云补全

(九)点云生成

(十)点云物体检测

(十一)点云配准

0x02 PointNet:3D点集分类与分割深度学习模型

(一)点云数据的特点

(二)PointNet基本出发点

(三)PointNet算法网络架构解读


0x01 3D点云的基本知识

点云数据现在已经在自动驾驶、医学、建筑建图、工业应用等方面都应用起来了,现在发展可以说是比较成熟了。那么在开始了解PointNet模型时,我们先来了解3D点云这个东西。

PointNet:基于深度学习的3D点云分类和分割模型

所谓的三维图像,可以理解为是在二维彩色图像的基础上又多了一个维度,即深度(Depth,D),那么用一个很直观的公式可以表示为:三维图像 = 普通的RGB三通道彩色图像+Depth Map。也就是我们平时所了解到的RGB-D。RGB-D是广泛使用的3D格式,其图像每个像素都有四个属性:即红(R)、绿(G)、蓝(B)和深度(D)。在一般的基于像素的图像中,我们可以通过(x,y)坐标定位任何像素,分别获得三种颜色属性(R,G,B)。而在RGB-D图像中,每个(x,y)坐标将对应于四个属性(深度D,R,G,B)。

(一)点云概述

回到点云,在做3D视觉的时候,处理的主要是点云,点云就是一些点的集合。相对于图像,点云有其不可替代的优势——深度,也就是说三维点云直接提供了三维空间的数据,而图像则需要通过透视几何来反推三维数据,这个透视几何可能推出来的数据并不符合要求,会有一些偏差。点云其实就是某个坐标系下的点的数据集,点包含了丰富的信息,包括三维坐标X,Y,Z、颜色、分类值、强度值、时间等等。点云在组成特点上分为两种,一种是有序点云,一种是无序点云:

点云的表示优点:点云表示保留了三维空间中原始的几何信息,不进行离散化。

点云当前面临的挑战:

(二)点云的获取

点云不可以通过普通摄像机获取,一般是通过三维成像传感器获得,比如双目相机、三维扫描仪、RGB-D相机等。目前主流的 RGB-D 相机有微软的 Kinect 系列、Intel 的 realsense 系列、structure sensor(需结合 iPad 使用)等。点云可通过扫描的RGB-D图像,以及扫描相机的内在参数创建点云,方法是通过相机校准,使用相机内在参数计算真实世界的点(x,y)。因此,RGB-D图像是网格对齐的图像,而点云则是更稀疏的结构。此外,获得点云的较好方法还包括LiDAR激光探测与测量,主要是通过星载、机载和地面三种方式获取。

(三)点云的内容

根据激光测量原理得到的点云,包括三维坐标(XYZ)和激光反射强度(Intensity),强度信息与目标的表面材质、粗糙度、入射角方向以及仪器的发射能量、激光波长有关。

根据摄影测量原理得到的点云,包括三维坐标(XYZ)和颜色信息(RGB)。

结合激光测量摄影测量原理得到点云,包括三维坐标(XYZ)、激光反射强度(Intensity)和颜色信息(RGB)。

(四)点云的属性

(五)点云的存储格式

点云目前的主要存储格式包括:pts、LAS、PCD、.xyz 和. pcap 等。

(六)相应基础算法库对不同格式的支持

(七)点云分割

PointNet:基于深度学习的3D点云分类和分割模型

点云分割是根据空间、几何和纹理等特征对点云进行划分,使得同一划分内的点云拥有相似的特征。

(八)点云补全

整体来说类似GAN和Unet那种感觉(编码解码网络)

PointNet:基于深度学习的3D点云分类和分割模型

 点云补全(Point Cloud Completion)用于修补有所缺失的点云(Point Cloud),从缺失点云出发估计完整点云,从而获得更高质量的点云。

PointNet:基于深度学习的3D点云分类和分割模型

(九)点云生成

例如像模型PointFlow,即可通过将3D点云建模为分布的分布来生成3D点云。

(十)点云物体检测

 PointNet:基于深度学习的3D点云分类和分割模型

点云物体检测流程主要由三个部分组成:(1)数据表示(2)特征提取和(3)基于模型的检测。

(十一)点云配准

PointNet:基于深度学习的3D点云分类和分割模型

点云配准分为粗配准(Coarse Registration)和精配准(Fine Registration)两个阶段。

精配准的目的是在粗配准的基础上让点云之间的空间位置差别最小化。应用最为广泛的精配准算法应该是ICP以及ICP的各种变种(稳健ICP、point to plane ICP、Point to line ICP、MBICP、GICP、NICP)。

粗配准是指在点云相对位姿完全未知的情况下对点云进行配准,可以为精配准提供良好的初始值。当前较为普遍的点云自动粗配准算法包括基于穷举搜索的配准算法和基于特征匹配的配准算法。

0x02 PointNet:3D点集分类与分割深度学习模型

在上面所提及到的点云的各种操作,其实都可以使用PointNet来解决。

打开点云数据可以使用软件:CloudCompare

PointNet:基于深度学习的3D点云分类和分割模型

论文地址:https://arxiv.org/pdf/1612.00593.pdf

GitHub:GitHub - charlesq34/pointnet: PointNet: Deep Learning on Point Sets for 3D Classification and Segmentation

PointNet:基于深度学习的3D点云分类和分割模型

那么这个网络架构可以做什么:

PointNet:基于深度学习的3D点云分类和分割模型

最后实现的效果是如下的:

场景分割任务(左)、部件分割任务(右):

PointNet:基于深度学习的3D点云分类和分割模型

 如何处理3D数据?其实方式有很多种:

PointNet:基于深度学习的3D点云分类和分割模型

可以用很多张照片通过很多个CNN,然后把它合并拼接,这样效率可谓是非常低,所以才需要有PointNet这样的存在。

(一)点云数据的特点

所以要解决的任务就是如何对点云数据进行特征提取

要站在网络的角度理解点云的特点,其实转换下来也是非常好理解:

(二)PointNet基本出发点

PointNet:基于深度学习的3D点云分类和分割模型

 那么可以使用这些公式来体现:

PointNet:基于深度学习的3D点云分类和分割模型

 求max值与位置没有关系,使用加法也是与位置无关。那么我们就直接使用Max函数叭,简单粗暴:

PointNet:基于深度学习的3D点云分类和分割模型

 但是这样会导致我们的特征太少,损失太多。那么如何解决?论文中的思想是:先升维然后再做Max操作(其实就是神经网络的隐层)

PointNet:基于深度学习的3D点云分类和分割模型

 上面提及到了升维这个东西,神经网络本质就是一个特征提取器,下面的MLP可以理解为一个感知机,可以为全连接层、卷积等等,把它上升为一个高维特征,再经过max函数得到全局再进行输出。

PointNet:基于深度学习的3D点云分类和分割模型

(三)PointNet算法网络架构解读

分类就是得到整体特征再输出;分割就是各个点特征输出结果。

PointNet:基于深度学习的3D点云分类和分割模型

上面蓝色的部分即为分类任务,而下面黄色那块,则为分割任务

其实这个网络它并不复杂,分类网络对于输入的点云进行输入变换(input transform)和特征变换(feature transform),随后通过最大池化将特征整合在一起。分割网络则是分类网络的延伸,其将整体和局部特征连接在一起出入每个点的分数。

分类的时候基本思想跟刚刚上面所说的使用max操作是一样的,可以看见他输入的是 n 个三维坐标(实际上可以更多维度),预测了一个变换矩阵做了变换,然后使用 MLP 对每个点做一个 embedding,之后再在 feature 空间中预测了变换矩阵做变换,然后又做了 embedding,最后 maxpooling 得到全局特征。用全局特征过一个 MLP 来做 label prediction。其中,mlp是通过共享权重的卷积实现的,第一层卷积核大小是1x3(因为每个点的维度是xyz),之后的每一层卷积核大小都是1x1。即特征提取层只是把每个点连接起来而已。经过两个空间变换网络和两个mlp之后,对每一个点提取1024维特征,经过maxpool变成1x1024的全局特征。再经过一个mlp(代码中运用全连接)得到k个score。分类网络最后接的loss是softmax。

分割的时候,相比于分类,分割需要每个点捕捉全局信息后才能知道自己是哪一类,于是把每个点的 feature 和全局 feature 做一个 concat,过 MLP,之后对每个点做 label prediction。

简言意骇来说:

PointNet因为是只使用了MLPmax pooling,没有能力捕获局部结构,因此在细节处理和泛化到复杂场景上能力很有限。

所以这个代码就不详细去看了,详细的看下一篇PointNet++叭!