目录
pointdsc网络 听同事说这个网络不错。
依赖项目
MinkowskiEngine v0.5.0
不支持Windows系统,
if you also want to use FCGF as the 3d local descriptor, please install MinkowskiEngine v0.5.0
linux安装:
# install system requirements
sudo apt install build-essential python3-dev libopenblas-dev
# Skip if you already have pip installed on your python3
curl https://bootstrap.pypa.io/get-pip.py | python3
# Get pip and install python requirements
python3 -m pip install torch numpy ninja
git clone https://github.com/NVIDIA/MinkowskiEngine.git
cd MinkowskiEngine
python setup.py install
# To specify blas, CXX, CUDA_HOME and force CUDA installation, use the following command
# export CXX=c++; export CUDA_HOME=/usr/local/cuda-11.1; python setup.py install --blas=openblas --force_cuda
点云配准 PointNet + Concat + FC
原文:
基于深度学习的点云配准Benchmark_3D视觉工坊的博客-CSDN博客
这个推荐有几个:
最近几年,基于深度学习的点云配准算法不断被提出,包括PointNetLK[1],Deep ICP[2],DCP[3],PRNet[4],IDAM[5],RPM-Net[6],3DRegNet[7],DGR[8]等。这些网络在ModelNet40,Kitti,或3DMatch数据集上进行试验,其性能与速度均超过了传统的ICP算法。这些算法或者网络结构较为复杂,或者结果难以复现,对于把深度学习应用到点云配准的初学者而言,不是很友好。这里结合自己的感触和最近阅读的PCRNet[9] (两者不谋而合),介绍一种非常简单的点云配准网络,或许它的结果不如前面提到的DCP, 3DRegNet等效果好,但其简洁易懂,且效果在ModelNet40上仍优于ICP,速度快于ICP。
本文将要介绍的网络是基于PointNet + Concat + FC的,它没有其它复杂的结构,易于复现。因其简洁性,这里暂且把其称作点云配准的Benchmark。因作者源码中复杂的(四元数, 旋转矩阵, 欧拉角之间)的变换操作和冗余性,且其PyTorch版本的不完整性(缺少评估模型等,最近又更新了
),于是根据自己的理解,从头撸了一遍整个模型: 数据,网络,评估,训练,测试,可视化等操作,代码已开源:
https://github.com/zhulf0804/PCReg.PyTorch
实验的数据为不带有normal信息的ModelNet40,下载地址:https://shapenet.cs.stanford.edu/media/modelnet40_ply_hdf5_2048.zip。训练集中包括9840个样本,测试集中包括2468个样本,每个样本均包括2048个数据点。
效果图
PointNet++改进点
PointNet因为是只使用了MLP和max pooling,没有能力捕获局部结构,因此在细节处理和泛化到复杂场景上能力很有限。
我总结的PointNet的几个问题:
- point-wise MLP,仅仅是对每个点表征,对局部结构信息整合能力太弱 --> PointNet++的改进:sampling和grouping整合局部邻域
- global feature直接由max pooling获得,无论是对分类还是对分割任务,都会造成巨大的信息损失 --> PointNet++的改进:hierarchical feature learning framework,通过多个set abstraction逐级降采样,获得不同规模不同层次的local-global feature
- 分割任务的全局特征global feature是直接复制与local feature拼接,生成discriminative feature能力有限 --> PointNet++的改进:分割任务设计了encoder-decoder结构,先降采样再上采样,使用skip connection将对应层的local-global feature拼接
更详细的,参考博客:
PointNet++的网络大体是encoder-decoder结构
encoder为降采样过程,通过多个set abstraction结构实现多层次的降采样,得到不同规模的point-wise feature,最后一个set abstraction输出可以认为是global feature。其中set abstraction由sampling,grouping,pointnet三个模块构成。
decoder根据分类和分割应用,又有所不同。分类任务decoder比较简单,不介绍了。分割任务decoder为上采样过程,通过反向插值和skip connection实现在上采样的同时,还能够获得local+global的point-wise feature,使得最终的表征能够discriminative
因此在往下看之前,我们最好带着2个问题:
- PointNet++降采样过程是怎么实现的?/PointNet++是如何表征global feature的?(关注set abstraction, sampling layer, grouping layer, pointnet layer)
- PointNet++用于分割任务的上采样过程是怎么实现的?/PointNet++是如何表征用于分割任务的point-wise feature的?(关注反向插值,skip connection)