点击上方“3D视觉工坊”,选择“星标”

干货第一时间送达

作者丨千百度@知乎

来源丨https://zhuanlan.zhihu.com/p/289620126

编辑丨3D视觉工坊

1. 概要

最近几年,基于深度学习的点云配准算法不断被提出,包括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

章节2介绍模型的Dataloader部分,就是怎么组织数据的; 章节3介绍模型的网络部分; 章节4介绍损失函数; 章节5介绍评估指标; 章节6介绍模型的实现及实现过程中遇到的一些坑; 章节7介绍本库的一实验结果; 章节8介绍一些补充信息,如四元数、旋转矩阵和欧拉角之间的关系等。

2. 数据

实验的数据为不带有normal信息的ModelNet40,下载地址:https://shapenet.cs.stanford.edu/media/modelnet40_ply_hdf5_2048.zip。训练集中包括9840个样本,测试集中包括2468个样本,每个样本均包括2048个数据点。

训练
对训练集中的每个样本template,随机选择1024个点,并随机产生一个旋转矩阵R和平移向量t,其中R是绕z轴旋转  ,绕y轴旋转  ,绕z轴旋转  随机生成,t是从[-1, 1]均匀采样生成。把R, t作用于template点云,生成source点云,这样就得到待配准的点云对。
在训练时,需要做噪声数据增强,对source点云和template点云中的每个点(x, y, z)加上随机高斯噪声。

测试
对测试集中的每个样本template,选择全部的2048个点,同时产生一个旋转矩阵R和平移向量t(产生方式同训练),把R, t作用于template点云,生成source点云,这样就得到了待配准的点云对。
为了公平的对比不同的方法,需要设置随机种子,保证每次测试随机产生的R,t都一样。

相关代码在 ./data/ModelNet40.py.

3. 网络

Benchmark

Benchmark网络架构如上图所示,它的输入包括source点云和template点云,输出是一个7维向量,表示平移向量  和单位四元数  (q是单位向量)。

Benchmark把点云配准当做回归问题,它包括提取特征层和回归层。提取特征层是一个PointNet类的网络,对点云  和  中的每一个点进行1D卷积Conv1d(3, 64, 64, 128, 1024),这样对每个点生成了1024维的特征,接下来进行MaxPooling操作,source点云  和template点云  分别得到了1024维的特征  和  。  和  经过的特征提取层是参数共享的。

为了预测source点云和template点云之间的变换,需要在两者之间建立联系,这里采用了Concat操作。两个点云的特征通过Concat操作变成了2048维的特征。接下来的回归层就是全连接层FC(2048, 1024, 1024, 512, 512, 256, 7)。

网络的输出就是平移向量和四元数,四元数进一步可以转化成旋转矩阵(变换公式参考章节8中的补充信息)。

Iterative Benchmark
Benchmark网络结构比较简单,相信很多人可以设计出这样的网络,但经过试验发现,这样的网络效果较差,在ModelNet40上仍旧不能很好的配准。因此在Benchmark的基础上,提出了下面的Iterative Benchmark。

Iterative Benchmark包括n个Benchmark(PCRNet),要注意的是这n个Benchmark的权重是共享的,因此网络的容量是没有增加的,和Benchmark的参数一样。Iterative Benchmark是如何工作的呢?
在第一次迭代中,source点云和template点云被送入到Benchmark(PCRNet),得到初始的变换T(1)。在下一次迭代中,T(1)作用于source点云得到transformed点云,和原始的template点云一块送入到Benchmark(PCRNet)。经过n次迭代,原始的source点云和template点云之间的变换为每一次迭代变换的组合:

相关代码在 ./models/benchmark.py

4. 损失函数

应用于点云配准中的Loss比较多,关于R, t的MSE Loss,关于欧拉角的Loss,关于点云的CD(Chamfer Distance) Loss和EMD(Earth Mover) Loss。

本模型中采用的EMD Loss(最先实验了CD Loss,效果不理想),实现的代码是借鉴于网上的开源库https://github.com/meder411/PyTorch-EMDLoss。

EMD(Earth Mover Distance) Loss

CD(Chamfer Distance) Loss

本库的loss代码在 ./loss/earth_mover_distance.py.

5. 评估指标

评估指标主要4个: mse_R, mse_t, mse_degree, time。前面3个和精度有关系,time是和效率有关。

mse_R

N表示待配准点云对的数量。

mse_t

mse_degree

 表示欧拉角。

time
每个点云对配准的平均时间。

相关代码在 ./metrics/metrics.py

6. 实现

网络结构虽然简单,但使其能有效work还是很困难的,先说一下在实现过程中走过的坑:

网络结构: 加bn层会使网络的结果变差。

迭代: 基于Benchmark训练的网络效果远不如Iterative Benchmark的结果。

损失函数: CD Loss训练的结果不如EMD Loss。

优化器很: EMD Loss在SGD优化器下出现nan,一种有效的策略是采用Adam优化器训练EMD Loss。

初始学习率: 初始学习率设置为1e-2,出现梯度爆炸,最终收敛的值较大; 初始学习率设置为1e-5,收敛时的权重在评估指标上仍然不好。

在训练和预测时,减点云的均值是不合理的(原作者的代码是这么实现的),因为会使得点云的平移尺度接近于0.

因此,最终在实现时,采用了Iterative Benchmark模型、EMD Loss、Adam优化器。batchsize设置为16,训练400 epoches,初始学习率设置为1e-4,学习率下降采用MultiStepLR[50, 250]。在训练和预测时均不减点云的均值。

另外,要注意的是,一个batchsize中不同的组织数据会带来网络训练的不稳定性,比如相同的代码,不改任何配置,由于shuffle的存在,训练结果差别挺大的;因此在训练时设置了随机种子,保证训练结果的可复现性。

7. 实验结果

7.1 实验结果

实验比较了Iterative Benchmark和ICP在ModelNet40测试集上的精度和时间,实验结果如下表:

从表中可以看到,Iterative Benchmark在ModelNet40测试集上的配准结果,从精度(mse_t, mse_R, mse_degree)和速度(time)上是优于ICP的。

7.2 实验结果可视化

ICP与Iterative Benchmark的对比

左图是ICP的配准结果,右图是Iterative Benchmark的配准结果。图中的绿色点云表示source点云,红色点云表示template点云,另外一个颜色的点云表示transformed source点云,即把source点云与template点云配准得到R,t,然后R,t作用于source点云后的结果。括号内表示是平移t的误差,旋转矩阵R的MSE误差和旋转角度degree的误差。
从可视化结果可以看到,当待配准点云的初始位置不好时,Iterative Benchmark的配准结果优于ICP的配准结果。

Iterative Benchmark的bad cases

上图是一个bad case,当具有重复性结构时,Iterative Benchmark的结果是不理想的,其结果弱于ICP算法。

7.3 训练过程可视化

测试集的loss和训练集的loss

学习率

测试集的mse_R误差和训练集的mse_R误差

测试集的mse_t误差和训练集的mse_t误差

测试集的角度误差和训练集的角度误差

7.4 思考

Iterative Benchmark在ModelNet40数据集的大部分cases的配准结果比较好的,但以下问题还需要解决:

重复性结构或者复杂结构点云的配准

真实数据点云的配准

部分-部分点云的配准

8. 补充

本章节介绍一些三维旋转的内容,参考了https://link.zhihu.com/?target=https%3A//en.wikipedia.org/wiki/Rotation_matrix%23Axis_of_a_rotation和https://zhuanlan.zhihu.com/p/45404840.

四元数转旋转矩阵
设单位四元数  ,其旋转矩阵为:

旋转矩阵转四元数



旋转矩阵转欧拉角

 表示矩阵的迹

绕x轴旋转矩阵

绕y轴旋转矩阵

绕z轴旋转矩阵

相关代码在./utils/process.py

参考资料

[1]. PointNetLK: Point Cloud Registration using PointNet [CVPR 2019]

[2]. DeepICP: An End-to-End Deep Neural Network for 3D Point Cloud Registration [ICCV 2019]

[3]. Deep Closest Point: Learning Representations for Point Cloud Registration [ICCV 2019]

[4]. PRNet: Self-Supervised Learning for Partial-to-Partial Registration [NeurIPS 2019]

[5]. Iterative Distance-Aware Similarity Matrix Convolution with Mutual-Supervised Point Elimination for Efficient Point Cloud Registration [ECCV 2020]

[6]. RPM-Net: Robust Point Matching using Learned Features [CVPR 2020]

[7]. 3DRegNet: A Deep Neural Network for 3D Point Registration [CVPR 2020]

[8]. Deep Global Registration [CVPR 2020]

[9]. PCRNet: Point Cloud Registration Network using PointNet Encoding [arXiv 2019]

本文仅做学术分享,如有侵权,请联系删文。

下载1

在「3D视觉工坊」公众号后台回复:3D视觉即可下载 3D视觉相关资料干货,涉及相机标定、三维重建、立体视觉、SLAM、深度学习、点云后处理、多视图几何等方向。

下载2

在「3D视觉工坊」公众号后台回复:3D视觉github资源汇总即可下载包括结构光、标定源码、缺陷检测源码、深度估计与深度补全源码、点云处理相关源码、立体匹配源码、单目、双目3D检测、基于点云的3D检测、6D姿态估计源码汇总等。

下载3

在「3D视觉工坊」公众号后台回复:相机标定即可下载独家相机标定学习课件与视频网址;后台回复:立体匹配即可下载独家立体匹配学习课件与视频网址。

重磅!3DCVer-学术论文写作投稿 交流群已成立

扫码添加小助手微信,可申请加入3D视觉工坊-学术论文写作与投稿 微信交流群,旨在交流顶会、顶刊、SCI、EI等写作与投稿事宜。

同时也可申请加入我们的细分方向交流群,目前主要有3D视觉CV&深度学习SLAM三维重建点云后处理自动驾驶、CV入门、三维测量、VR/AR、3D人脸识别、医疗影像、缺陷检测、行人重识别、目标跟踪、视觉产品落地、视觉竞赛、车牌识别、硬件选型、学术交流、求职交流、ORB-SLAM系列源码交流、深度估计等微信群。

一定要备注:研究方向+学校/公司+昵称,例如:”3D视觉 + 上海交大 + 静静“。请按照格式备注,可快速被通过且邀请进群。原创投稿也请联系。

▲长按加微信群或投稿

▲长按关注公众号

3D视觉从入门到精通知识星球:针对3D视觉领域的知识点汇总、入门进阶学习路线、最新paper分享、疑问解答四个方面进行深耕,更有各类大厂的算法工程人员进行技术指导。与此同时,星球将联合知名企业发布3D视觉相关算法开发岗位以及项目对接信息,打造成集技术与就业为一体的铁杆粉丝聚集区,近2000星球成员为创造更好的AI世界共同进步,知识星球入口:

学习3D视觉核心技术,扫描查看介绍,3天内无条件退款

圈里有高质量教程资料、可答疑解惑、助你高效解决问题

觉得有用,麻烦给个赞和在看~  

基于深度学习的点云配准Benchmark相关推荐

  1. 【配准】2020年“基于深度学习的医学影像配准”期刊论文速览(PR,TMI,MIA)

    针对基于深度学习的医学影像配准,检索了最新的(2020年)期刊论文,包含PR.TMI.MIA3个期刊,下面是浏览论文中的一些记录. 其中有两篇论文提供了代码. 一.PR Deep morphologi ...

  2. 基于深度学习的点云分割网络及点云分割数据集

    作者丨泡椒味的泡泡糖 来源丨深蓝AI 引言 点云分割是根据空间.几何和纹理等特征对点云进行划分,使得同一划分内的点云拥有相似的特征.点云的有效分割是许多应用的前提,例如在三维重建领域,需要对场景内的物 ...

  3. 前沿丨基于深度学习的点云分割网络及点云分割数据集

    众所周知,点云的有效分割是许多应用的前提,例如在三维重建领域,需要对场景内的物体首先进行分类处理,然后才能进行后期的识别和重建.传统的点云分割主要依赖聚类算法和基于随机采样一致性的分割算法,在很多技术 ...

  4. 大盘点 | 基于深度学习的点云分割网络及点云分割数据集

    编辑 | 深蓝前沿 点击下方卡片,关注"自动驾驶之心"公众号 ADAS巨卷干货,即可获取 后台回复[数据集下载]获取计算机视觉近30种数据集! 引言 点云分割是根据空间.几何和纹理 ...

  5. 基于深度学习的单模医学图像配准综述(附VoxelMorph配准实例)

    本文是基于深度学习的单模态医学图像配准的综述,除了介绍配准任务.配准过程之外,还会从实际操作出发,以经典的VoxelMorph为例做详细介绍.如果有什么讲的不清楚的地方欢迎大家留言讨论,如果有什么错误 ...

  6. 计算机视觉与深度学习 | 激光雷达点云配准与拼接(基于ICP算法):附matlab源代码

    ================================================ 博主github:https://github.com/MichaelBeechan 博主CSDN:h ...

  7. 基于深度学习的点云分类--PointNet(代码结构+环境Ubuntu16.04+CUDA9+tensorflow1.9.0)

    希望跟大家共同讨论.进步. 我的公众号: https://mp.weixin.qq.com/s?__biz=MzU2MzcxMjE3MQ==&mid=2247483897&idx=1& ...

  8. PF-Net基于深度学习的点云补全网络

    目录 1. 论文和代码 2. 论文阅读笔记 2.1 目的和框架 2.2 IFPS 下采样 3. 源码解读 3.1 载入数据 3.1.1 归一化操作 3.2 数据前处理 3.3 网络输入输出 3.3.1 ...

  9. 重磅直播 | PointDSC:基于特征匹配的点云配准方法(CVPR2021)

    大家好,本公众号现已开启线上视频公开课,主讲人通过B站直播间,对3D视觉领域相关知识点进行讲解,并在微信群内完成答疑. 本期由香港科技大学计算机系白旭阳博士分享,分享的主题为<基于特征匹配的鲁棒 ...

最新文章

  1. pcb结构链表_第2章 2-1进程与PCB
  2. Linux System Programming --Chapter Two
  3. UIUC同学Jia-Bin Huang收集的计算机视觉代码合集
  4. Python爬取京东商品信息以及评论存进MySQL
  5. php 进制 小数,小数进制转换
  6. 表单中的只读和禁用属性
  7. 下列支持mysql中文字符_MySQL中文支持问题
  8. 了解Entity Framework中事务处理
  9. 计蒜客挑战难题:字符串长度
  10. mock教程 java_自动生成 java 测试 mock 对象框架 DataFactory-01-入门使用教程
  11. Linux拷贝分区内容,dd复制分区后目标分区的大小变成原分区了
  12. java多线程优秀开源项目_github比较热门的Java开源项目
  13. Xshell注册激活教程
  14. Js获取CheckBook被选中的值
  15. 计算机无法传输文件,qq无法传输文件_电脑文件无法通过QQ发送怎么办
  16. 学习html的心得总结
  17. 移动硬盘只读属性不能改
  18. 中序和后序(前序和中序)序列确定一颗二叉树
  19. camera中的VSYNC,HSYNC作用?时序关系?
  20. 小菜鸡刷CTF(二)

热门文章

  1. (七)STM32的RTC简单操作
  2. 快速找出两个列表差异部分
  3. jquery animate函数实现
  4. HDOJ-1062 Text Reverse
  5. 开源软件与商业软件的选择
  6. 关于form标题提交的应用技巧(-)
  7. tomcat自启动问题 jsvc的 使用
  8. 想要彻底搞懂“异地多活”,看完这篇就够了
  9. 灵活运用分布式锁解决数据重复插入问题
  10. 拼多多,一面,i++ 是线程安全的吗?一脸蒙逼