一、点云介绍与获取方式
1.什么是点云
点云是某个坐标系下的点的数据集。点包含了丰富的信息,包括三维坐标X,Y,Z、颜色、分类值、强度值、时间等等。点云是在同一空间参考系下表达目标空间分布和目标表面特性的海量点集合。在获取物体表面每个采样点的空间坐标后,得到的是一个点的集合,称之为“点云”(Point Cloud)。
2.点云数据如何采集
主要是通过三维激光扫描仪进行数据采集获取点云数据,其次通过二维影像进行三维重建,在重建过程中获取点云数据,另外还有一些,通过三维模型来计算获取点云。
- 根据激光测量原理得到的点云,包括三维坐标(XYZ)和激光反射强度(Intensity)。
- 根据摄影测量原理得到的点云,包括三维坐标(XYZ)和颜色信息(RGB)。
- 结合激光测量和摄影测量原理得到点云,包括三维坐标(XYZ)、激光反射强度(Intensity)和颜色信息(RGB)。
- 逆向工程获取。就是先有了一个三维模型,然后在该模型的表面进行采点。得到相应的点云。可以分为稠密点云和稀疏点云。
二、点云任务
点云深度学习的任务主要集中在以下几个方面:分类(Classification)、分割(Segmentation)、目标检测(Object Detection)、实例分割(Panoptic Segmentation)、配准(Registration)、点云重构(Reconstruction)。
总体来说,根据数据输入和网络结构,目前点云深度学习方法主要分为多视图(Mutli-View based)、基于点(Point-based)、基于体素(Volumetric-based)以及混合方法(Hybrid Methods,比如混合point-based和Volumetrin-based方法)。
2.1 point-based
2.1.1 pointwise-mlp
基于点的代表方法有pointnet、pointnet++、pointnext方法等。其中pointnet在点云深度学习算是开创性的工作,直接输入点云进行卷积操作,解决了点云的无序性等问题。
(1)Pointnet
具体详解可以参考知骤:细嚼慢咽读论文:PointNet论文及代码详细解析,讲解的比较清晰,此处仅做简介。
PointNet网络结构的灵感来自于点云的特点。对于一个欧式空间里的点云,有三个主要特征:
• 无序性:虽然输入的点云是有顺序的,但是显然这个顺序不应当影响结果。
• 点之间的交互:每个点不是独立的,而是与其周围的一些点共同蕴含了一些信息,因而模型应当能够抓住局部的 结构和局部之间的交互。
• 变换不变性:比如点云整体的旋转和平移不应该影响它的分类或者分割。
pointnet结构图
网络分成2个分支,cls和seg,分类时取全局特征,分割时将全局和局部特征进行融合。
为了解决点云刚性变换(旋转或平移)不变性,此处设计了一个T-net,预测一个DxD(pointnetD采用3和64)的矩阵,其作用相当于一个无论什么角度输入的点云数据,经过变换之后都能保证点云角度是固定的,保证了旋转不变性。pointnet进行了两次T-net变换,第一次是对点云进行调整,可以理解成将点云旋转出一个更有利于分类或分割的角度;第二次是对64维的特征进行变换。
T-Net,点云变换
聚合点特征如下图所示,先把每个点映射到高维空间,在高维空间中做对称性的操作,提取全局特征,保证与点顺序无关(一般都翻译成置换不变性,个人理解应该是点顺序,解决了点无序性的问题)。
点云特征聚合,max pooling操作
(2)PointNet++
PointNet++是在pointnet基础上进行改进,由于pointnet是逐点进行特征提取,无法学习到点与点之间的关系,对局部信息的整合能力较差;PointNet++结合2d CNN感受野的思想,对pointnet进行了改进。
详细解析可参考月明星稀风萧萧:论文笔记:PointNet++论文代码讨论
pointnet++网络结构图
Pointnet++提出来SA模块(set abstraction),首先进行sampling,利用FPS(最远点采样算法),选取一定数量的点,再根据这些点选取周围半径R的球形区域内的点作为一个Grouping,然后将这个Grouping的点输入到PointNet提取点feature。此时的点feature包含了邻域内点的特征。
分割时对点特征进行了上采样,采用反距离加权进行插值(距离的导数作为w)。
(3)PointNext
虽然pointnet++的性能被许多模型超过,但发现大部分的性能提升主要是因为训练策略的改进,因此pointnet++还有提升的空间。
(1)训练策略
训练策略优化
不改变模型结构,仅改变训练策略,就可以有明显的提升。
(2)网络结构优化
由于pointnet++网络结构比较小,发现增加sa模块和提高channel size都不会明显提高准确性,主要是梯度消失和过拟合造成的。
pointnext网络结构
主要是提出了InvResMLP(Inverted Residual MLP)对模型进行缩放。
InvResMLP结构
- 输入输出之间添加残差连接,缓解梯度消失
- 可分离的mlp,在Grouping和Reduction之间,一个mlp进行邻域特征计算;另2个mlp提取点特征;
- 增大第二层的mlp的channel,从256到1024,增加了4倍,丰富提取的特征;
最终实验,在s3dis数据集上,分割效果比pointnet++有了接近20个点的提升。
2.1.2 卷积方法(Convolution-based)
提出了一种将2d cnn扩展到3d点云中的方法。
图像网格vs点云
参考2d图像的概念,一般常用3 * 3 或5* 5 等卷积,提取的特征就是每个位置的权重之和。
对于局部区域的点云,由于位置不是固定的,权重也是不确定的,pointconv提出了学习一个W(δx, δy, δz) 。
S(δx, δy, δz)是一个反向密度表示,密度越大,值越小。意思密度越大,点的权重越小,点密度越大,取点时取哪个影响不大,如果点密度较小,只有1-2个点,这个时候点的权重大一些。密度计算利用KDE算法估计。输入是点相对坐标,点密度,点特征(法向量等)。
pointconv局部卷积网络图
整个网络结构如下图
由于pointconv卷积比较占用显存,提出efficient pointconv,结构如下,只用了原始pointconv 1/64的显存,具体可以看论文。
也是提出了一个点卷积,其中x是点,xi是x的半径R范围的点,fi是xi的特征向量,g是核函数。
左边是图像卷积,右侧是kpconv卷积
Kernel Point卷积的大概思路:以点 x 为球心,半径r确定一个球体;在球体内确定若干个核心点,每个kernel点带一个权重矩阵;对于落在球体范围内的点,用核函数计算出该点的权重矩阵w,用w对这个点的feature进行变换;对于落在球体内的每个点,都用上一步的方法,得出一个新的feature,最后将feature累加起来,作为点 x 的feature。
详细解析可以参考不知道叫什么好:KPConv:点云核心点卷积 (ICCV 2019),了解一下kernel point的取点过程。
由于transformer的attention机制,其对数据的排列和数量是不敏感的,这和点云的特性是相符合的。
点云的point transformer layer结构如下,对局部数据做注意力计算。
point transformer layer结构
其中X (i) ⊆ X是数据集x的子集,由xi的k邻近点集组成。φ, ψ, and α 是pointwise feature transformations,δ is a position encoding 函数, ρ 是归一化函数softmax,γ是一个2个线程层加relu激活。
分割和分类网络结构如下:
2.1.3 图方法(Graph-based)
由于点云是离散的,缺乏拓扑关系,通过建立点与点之间的联系,可以增强点云的表达能力,因此设计了EdgeConv。
EdgeConv在网络每层都动态构建图结构,点云中的点作为顶点,选其k邻近,构建边,计算edge feature,然后聚合edge feature,得到点的新feature。
EdgeConv 图层
分类和分割网络结构图:
上边分支表示分类,下边分支表示分割
2.2 体素法(volumetric-based)
Voxel,就是将三维空间按照一定尺度划分多个网格。
(1) VoxelNet
将点云先划分网格,对网格内的点云提取特征,然后利用3维卷积操作,进行目标检测。
① 网格划分:点云用一个长方体进行切割,沿XYZ轴的尺寸分别是W*H*D。
② Grouping: 将点云数据放到Voxel中。
③ Random Sampling:对Voxel中的点进行采样,如果点数量过大,只取T个。
④ Stacked Voxel Feature Encoding(VFE):voxel中的点提取特征。以下图为例,先对每个点全连接取特征,此时点之间没有联系,为了建立联系,用maxpooling得到点之间的局部关系,再connat这2个特征,作为下一次输入。
VEF layer
经过多个VEF操作,得到4D的sparse tensor,由于点云大部分情况下voxel是空的,使用sparse tensor,可以节省显存空间。
详解可参考 花椒壳壳:3D目标检测 | VoTr | 室外 | 纯点云|CVPR2021,关于SubManifold voxel和voxel模块的区别。
将transformer应用到点云voxel检测方法中。
2.3 多视图
将点云从不同“视角”投影得到二维渲染图,作为训练数据,然后用图像的卷积算法进行训练,得到最后结果,再反投影到3d中。
mvcnn网络结构
根据虚拟相机生成多个视图图像,然后分别提取特征,再用pooling提取聚合多个视图的特征,再讲过cnn,最红输出类别信息。
2.4 融合法
综合多种方法进行融合学习。
提出了 Point-Voxel 的方式来实现高效又轻量化的点云深度学习。
PVCNN由低分辨率的基于体素的分支和高分辨率的基于点的分支组成。
基于体素的分支提取粗粒度的邻域信息,基于点的分支中对单个点的特征进行细粒度的补充。
体素分支将点转成了低分辨的体素分支,提取粗粒度的邻域信息,低分辨率卷积降低了显存;点分支对点提取特征,由于不需要再计算邻域信息(如knn,非常耗计算时间的操作),补充了细粒度的特征,综合2者的特点,相比于一般的体素法节省了10倍的GPU,相比于point-based方法速度提升了7倍。
三.相关任务sota项目
3.1 分类
(1)数据集
- ModelNet40:用于点云分类的数据集,包含40个对象类别,如飞机、汽车、植物等,9843个样本用于训练,2468用于测试。
- scanobjectnn:包含15000个数据现在场景的数据,共分成15类。
(2)sota模型
- PointGPT:将gpt概念扩展到点云上,在modelnet40数据集精度达到95.9%,ScanObjectNN达到93.4%。
具体可以参考PointGPT 论文解读,点云的自回归生成预训练。
- Point2vec: 点云自监督学习,利用data2vec的框架,扩展到3d点云中。
- ULIP-2: 利用多模态模型,结合LMM(大语言模型),图像和点云进行预训练,对齐到统一的特征空间,为点云生成描述信息。
- pointmlp: 提出了一个点云残差模块,利用残差模块不断提取局部特征,重复多次逐渐扩大感受野,获取完整的几何信息。详细解析参考【文献笔记】PointMLP_Gisleung的博客-CSDN博客
3.2 点云语义分割
(1)数据集
- ShapeNetPart:ShapeNet Part是从ShapeNetCore数据集选择了16类并进行语义信息标注的数据集, 用于点云的语义分割任务。
- S3DIS:3D室内场景的数据集, 主要用于点云的语义分割任务。下载需要申请,可以查找一些国内源。
- SemanticKITTI:是自动驾驶的点云数据集。采用Velodyne激光器进行采集,包括了城市道路、高速、乡村道路数据。
- ScribbleKITTI: 基于kitti的一个数据集,只对点云做了粗略标注,验证利用弱监督实现点云3d分割的数据集。论文代码采用Cylinder3D模型,在只使用8%标注的情况下,可达到95.7%的全监督性能。
- nuscenes: 也是一个自动驾驶数据集,数据场景覆盖了城市、住宅区、郊区、工业区各个场景,也涵盖了白天、黑夜、晴天、雨天、多云等不同时段不同天气状况,包括点云、影像、地图等数据。
- STPLS3D: 一个通过航空拍摄,三维重建生成的点云数据集,用于点云语义分割。
- SensatUrban: 一个城市级规模的摄影测量点云数据集,包含了30亿个点,覆盖了6平方公里的城市场景,支持13个类别,如地面、植被、汽车等。
- ScanNetV2:RGB-D数据集,数据集较大,约1.2T,一共1513个采集场景数据,共21个类别的对象,其中,1201个场景用于训练,312个场景用于测试,有四个评测任务:3D语义分割、3D实例分割、2D语义分割和2D实例分割。
- npm3d:包括了巴黎城市的道路点云数据。
(2) sota模型
- Window-Normalization:考虑到不同区域点云的密度不同,利用window-norm替换knn提取特征。
整体网络结构如下:
- superpoint_transformer:提出一种高效的点云分块方法,最终模型参数只有212K,在s3dis达到76% mIoU。
- Stratified-Transformer:第一个用point-based方法超越了voxel-based的方法。
类似swin,局部atten,分别用一个大window和小windows,然后将2个windows融合
先进行position Embeding,有助于聚合点的局部信息
- RepSurf: 将点集构成三角形,将三角形的特征传入网络。
- Point Transformer V2: 在ptv1的基础上提出了(GVA)group vector attention,改进pooling策略。具体可以参考文章【yeyan:【点云深度学习】ptv2:point transformer v2】
- PointNext: 前文已有介绍。
- contrastboundary:对于点云,一般最难分割的地方在于边界,该论文主要研究提升边界分割的效果,很有借鉴意义。详细请参考【yeyan:【点云深度学习】cbl:点云分割边界的对比学习】
3.3 目标检测
一般用于无人驾驶,数据集常用是kitti,nuscenes,apollo(百度无人驾驶数据集)数据。目标检测的模型也特别多,可以参考mmdetection3d和openpcdet。
- CAGroup3D:提出了基于类感知的三维目标检测算法。
- 3D-Dual-Fusion:融合点云和image,提出了双重融合算法。基础模型基于Voxel R-CNN,CenterPoint。
- CenterPoint:先对点云3d特征提取,backbone一般用voxel或pointpillars,然后第一阶段预测box的中心,然后再去回归box。
- bev-fusion:主要用于自动驾驶,融合点云和影像,支持单独使用点云或影像。详细解析参考【bev感知算法】-bevfusion
3.4 实例分割(Panoptic Segmentation)
- ISBNet:a 3D Point Cloud Instance Segmentation Network with Instance-aware Sampling and Box-aware Dynamic Convolution
isbnet网络
- p3former: Position-Guided Point Cloud Panoptic Segmentation Transformer
p3former网络
3.5 配准(Registration)
(1) 数据集
- 3DMatch:包含了关键点、点云配准、rgb-d重建数据。
(2) sota模型
- gedi:学习一种对于尺度、旋转都不变的特征,点云按patch提取特征,相对于其局部参考系进行规范化,并通过对输入点的排列不变的深度神经网络,将其编码为尺度和旋转不变的紧凑描述算子。
- RegTR:利用多个 transformer 注意力层直接预测每个下采样点在另一个点云中的对应位置。与典型的基于对一致性的匹配算法不同,该预测不需要额外的 RANSAC ,因此它能做既快速又准确。
3.6 点云重构(Reconstruction)
现有的3D传感器由于物体自遮挡等问题,采集到的点云数据存在缺失且稀疏,所以如何将这样缺失且稀疏的点云进行补全以得到高品质的点云,具有重大意义。
数据集使用shapenetcore等,ShapeNet-55和ShapeNet-34 包含各种各样不完整的点云。
- AdaPoinTr: 将点云补全问题变成一个集合到集合的翻译问题,即通过已知的点云的信息翻译得到缺失部分的点云。其核心在于通过Transformer-Encoder充分建模已知点云的结构信息与点间关系,再通过Transformer-Decoder学习缺失部分与存在部分的相互关系,并以此重建缺失的点云。
- pcn(Point Completion Network): 输入一个点云X,预测完整的点云Y,第一阶段预测一个稀疏y,第二阶段生成一个具有细节的y。该模型使用自监督方法进行训练。
3.7 变化检测
对于多期点云数据,进行变化检测,传统方法主要是基于dsm的方法和基于点云距离的方法。
基于dsm的方法主要是利用高差或者距离计算。如下图所示,将多期点云转换成dsm,然后计算dsm上的高差或者距离差,以此统计变化情况,该方法实现简单,但由于构建dsm,在高程上会损失信息,导致很多误检。
基于点云的方法就是计算多期点云之间的距离,如下图所示,分为点云到点云(c2c),点云到三角网(c2m),多尺度三角网到点云等方法(m3c2),其中点云到点云的计算方法如图(a)中所示,是对变形检测最简单和最有效的方法。点云到三角网像C2C方法一样,如图(b),也是计算距离,C2M方法主要使用源点云和目标三角网最近的面(或边缘,如果点的正交投影不落在任何三角面上)的最近的欧氏距离。它的主要问题是是需要对目标点云进行网格化,这可能会产生带有孔洞和伪影的三角形表面,从而导致错误的位移和变化检测。
M3C2是一种稳健的计算点云距离的方法,如图(c)。步骤包括选取核心点云、计算三维曲面法线、点云距离计算、确定空间变量置信区间等,该算法可以直接在点云上检测复杂地形的变化,无需网格划分;且进行变化计算时,受空间点密度、表面粗糙度及不同采样位置的影响较小。但M3C2对于在不同方向上发生的变化,检测效果不佳。
由于深度学习发展,用深度学习进行点云变化检测也成了一个新方向。
Siamese KPConv网络也是类似图像神经网络,是一个encoder和decoder的结构。对于不同时刻的点云,如T0时刻的点云和T1的点云,分别经过网络进行特征提取,采用的是kpconv的方法。然后对不同时刻点云特征,计算其最邻近特征的差异,同时采用了多尺度特征,进行融合,最后输出得到变化结果。
3.8 slam
最近基于nerf和3D Gaussian Splatting开始应用到slam领域,此处介绍看的几篇论文,目前这块更新较快。
利用nerf进行lidar的slam,主要基于体素化和sdf回归,训练过程中不断进行tracking和map操作。
类似nerf-loam,但是做的工作更全,还包含了回环检测,论文写的也比较细,实测效果比nerf-loam稍微好一些,论文和代码可以细看下。
- LIV-GaussMap,基于3D Gaussian Splatting,将点云融合到gs重建中。
4.开源项目
- [mmdetection3d]:MMDetection3D 是一个基于 PyTorch 的目标检测开源工具箱,下一代面向 3D 检测的平台。支持多模态/单模态检测器,支持室内/室外数据集。目前已在 SemanticKITTI 上构建了一个全面的点云语义分割基准,包括 Cylinder3D 、 MinkUNet 和 SPVCNN 方法。其中,改进后的 MinkUNetv2 在验证集上可以达到 70.3 mIoU 。也支持了 BEVFusion 的训练和全新的 3D 占有网格预测网络 TPVFormer。
- [Paddle3D]: 基于百度paddle,聚合主流3D感知算法及精度调优策略,覆盖单目、点云等多种模态及检测、分割等多种任务类型。支持KITTI、nuScenes、Waymo等主流3D数据集,提供从数据处理、模型搭建、训练调优到部署落地的全流程能力,极致优化模型性能,适配多种自动驾驶主流芯片,支持计算图优化/TensorRT/OpenVINO等加速库,并提供了开箱即用的部署教程。
- [OpenPCDet]: 也是openmmlab开发的一个3d检测库,主要基于lidar做3d目标检测。
- [Pointcept]:点云感知算法研究的一个库,实现了point transformerV2等算法。
- [learning3d]:实现了一些点云sota算法的库,比如pointconv,pcn等算法。
- [torch-points3d]:实现了常见的点云算法,包含分类、分割、配准、目标检测等,不过目前已经不怎么更新了。
- [MinkowskiEngine]:3d稀疏卷积,在点云卷积中用的还是比较多的,该代码库中还包含了分割/分类/重构/检测等应用的demo。还有一个torchsparse,和mink用法基本一致,稍微修改几行代码就可以替换使用,卷积速度比mink稍慢一点,目前torchsparse更新到2.1版本,速度有明显提升,不过2.1结构有变化,batchid改到了第一列,如果是基于旧版本的模型,建议使用最新的2.0版本。
- [open3d]: 支持点云处理的一些算法,支持点云可视化。其中open3d-ml支持randla,kpconv,PointTransformer,SparseConvUnet模型。同时,open3d还支持远程调试(open3d.visualization --external-vis),由于一般训练都在服务器上,没法直接看点云,可以通过open3d的remote模式显示。
- [cloudcompare]:点云预处理软件,支持点云查看编辑等功能,可以进行二次开发,有什么问题作者回复也很快,目前最新版已经支持分类交互的插件,可用于点云标注。
- [xtreme1]:开源web端点云标注工具,支持3d box和图像标注;支持数据、任务管理等;