首先我们来分析一下文章题目:PU-GAN: a Point Cloud Upsampling Adversarial Network
PU即Point Upsampling,也就是本文要做的任务是点云上采样。关于点云上采样的介绍,我在介绍PU-Net的这篇文章中介绍过,可参考:
刘昕宸:细嚼慢咽读论文:点云上采样网络开天辟地PU-Netzhuanlan.zhihu.com
GAN即现在大名鼎鼎的GAN(生成对抗网络),也就是本文使用的网络是GAN,依赖GAN来实现点云的上采样。上采样任务其实也是一种生成式任务,因此很自然地想到可以使用GAN来尝试一下。关于GAN的基本原理介绍,可参考:
上采样的意义我在PU-Net那篇文章中详细介绍过:
点云处理任务存在极大挑战,很重要的一点是点云这种数据形式的稀疏性和不规则性。
而本文要做的上采样任务,正是为了解决点云数据稀疏性这一问题,为下游各种特征学习任务提供更“高质”的数据。
点云上采样任务,简单来说就是输入某一点云,生成保持基本形状的“更稠密”点云。
单就上采样效果而言,之前基于深度学习的方法如PU-Net、MPU在现实场景扫描点云上取得的效果均非常有限。我们来看看PU-GAN论文在开头放的图(Kitti数据集上测试):
点云上采样本质也是一种生成式任务,在视觉领域做生成任务,自然而然地就会想到:不妨试试GAN??
- 针对点云上采样任务,提出了GAN框架的解决方案,并且取得了非常好的效果。(原文指出:the difficulty to balance between the generator and discriminator and to avoid the tendency of poor convergence.)
- 局部网络结构设计非常有新意:比如up-down-up unit用来expand point features,self-attention unit用来feature integration quality等
- 设计了compound loss,特别是设计了用来约束上采样点云均匀分布的uniform loss,让人眼前一亮。
- PU-GAN不仅在一般点云模型上做了实验,还在KITTI这样真实扫描的场景点云上做了上采样实验,依然取得了非常好的效果,这也进一步验证了PU-GAN强大的泛化能力。
本文的目标就是上采样,也就是给定有N个点的稀疏点集 ,我们期望生成有 rN 个点的稠密点集 .
Q 并不需要是 P 的超集,但是需要满足以下2个条件:
- Q 应该能够和 P 表达一样的underlying geometry of latent target object.
- Q 内的点应该是在target object surface上均匀分布的,即使甚至输入 P 都是非均匀的。
PU-GAN的网络结构图如下所示:
因为是GAN,所以网络分成了Generator和Discriminator两部分。
Generator用于从稀疏点云 P 生成稠密点云 Q .
Discriminator用于区分真实稠密点云和generator生成的点云。
看出来了嘛,其实generator的整体框架还是PU-Net那一套:patch --> feature extraction --> feature expansion --> coordinate reconstruction ;-)
Generator全局代码:
Ⅰ Patch Extraction
对每个3D mesh,在表面随机选择200个种子点,对每个种子点根据测地线距离生成patch,并将每个patch normalize到一个unit sphere中。
对每个patch,使用Poisson Disk Sampling生成 ,作为有 rN 个点的目标点云
我们动态地对 随机采样 N 个点,生成输入点云 P .
Ⅱ Feature Extraction
本模块旨在提取point-wise feature:
输入点云 N*d ( d 包括点云的原始数据,坐标、颜色、法向量等, d 一般为 3 ),输出point-wise feature N*C
本模块直接借鉴了论文Patch-based progressive 3D point set upsampling的特征提取方法,使用了dense connection来集成不同层的特征。
网络结构如下,处理过程非常明晰了:
我们再来看看代码加深理解:
核心dense_conv的实现:
Ⅲ Feature Expansion
和PU-Net一样,PU-GAN也设计了自己的feature expansion模块,这也应该是上采样算法的核心了吧
PU-Net的做法是 直接复制点的特征,然后使用不同的 MLP来分别独立处理各自的点特征备份。
即使PU-Net使用了诸如 repulsion loss这样的约束,但这种上采样方式仍然会导致 扩展的点特征过于接近彼此,影响上采样质量。
输入point-wise feature N*C ,输出
PU-GAN还设计了up-down-up expansion unit来增强特征扩展的效果,以实现enabling the generator to produce more diverse point distributions.
网络结构图如下所示,还包括了Up-feature operator和Down-feature operator的结构:
看代码是比较明晰的,点特征输入到Up-feature operator生成 ,再输入Down-feature operator将其降采样回.
计算降采样点特征与原输入之间的difference .
输入 到Up-feature operator生成 ,将 作为 的偏移量,得 .
Up-feature operator:
不像PU-Net直接复制,PU-GAN在复制点特征时使用了grid结构(可参考FoldingNet: Point Cloud Auto-encoder via Deep Grid Deformation),这等价于在输入点附近增加一些新的点.
整合复制点特征使用了self attention机制
1)grid机制
为每个feature-map copy生成一个唯一的2D vector,然后将该2D vector拼接给其对应feature-map copy内的每一个点。
因为该2D vector的存在,因此复制的点特征还是有些细微差别的。
2)attention机制
Down-feature operator:
Down结构比较简单:
对expanded features降采样,对特征reshape,然后使用一系列MLPs来拟合原特征
Ⅳ Coordinate Reconstruction
最后是坐标重建:
Discriminator的目标是分辨上采样点云是否是Generator生成的
首先使用一个轻量的网络结构整合local和global信息,提取global feature
另外Discriminator还使用了self-attention unit来enhance the feature integration and improve the subsequent feature extraction capability
最后使用MLP和pooling得到了最后的confidence value,可以理解成是Discriminator判断输入上采样点云是真实上采样点云的可能性。
因为GAN的原因,PU-GAN的loss设计得比较多,主要分为了Generator loss和Discriminator loss:
Ⅰdiscriminator loss
discriminator_loss只包括了adversarial loss.
discriminator_loss设计的adversarial loss很简单:
是真实点云, Q 是generator生成的fake点云, D(Q) 表示判别器输出的confidence value.
Ⅱ generator loss
generator loss包括了reconstruction loss,repulsion loss,uniform loss和adversarial loss.
1)adversarial loss
与上面Discriminator的adversarial loss基本类似:
2)reconstruction loss
PU-GAN默认使用的是EMD loss,EMD的详细理解见这篇文章:
3)repulsion loss
repulsion loss设计来自PU-Net,想详细了解可参考这篇文章:
4)uniform loss
PU-GAN这一工作的一大贡献就是设计了uniform loss来控制生成点云分布的均匀性。
首先PU-Net设计了NUC这一评价指标来衡量生成点云的均匀性,但是这一评价忽视了local clutter of points,因此不宜再被采纳。
什么叫“忽视了local clutter of points”呢?
下面三个disk包含了相同数量的点(因此NUC都是一样的),但是它们的均匀程度显然是不同的。造成NUC衡量失效的原因,很大可能是局部点分布均匀程度NUC是无法刻画的。
而这里uniform loss的设计就是同时考虑了global和local!!!
第一项:
对于有 rN 个点的点集 Q (在实验中实际就是1个patch):
step 1. 使用最远点采样(FPS)采样 M 个seed points
step 2. 以每个seed point为球心,使用半径为 的ball query得到point subset .
分析:
严格坐落在 Q 表面面积为 的local disk上。
还记得上面介绍的Ⅰ Patch Extraction嘛?我们通过测地线距离+正则化提取patch,因此patch就已经被我们normalize到一个unit sphere中了,patch的表面积是
并且 内expected number of points 就应该是 rNp 了
自然而然地,遵循chi-square model设计了uniform loss的第一项,用来衡量 与 的偏差:
第二项:
考虑local point clutter,对 中的每个点,找到其最近邻并计算距离 ( k 表示第 中的第 k 个点)
想象一下,如果 是均匀分布的,那么点与点之间的距离分布应该是这样的:
此时expected point-to-neighbor distance
因此最终我们可得uniform loss:
程序实现:
从PU-Net和MPU的数据集以及Visionair repository中挑选了147个模型,尽可能多地覆盖不同的类型。其中120个模型用于训练,27个用于测试。
训练数据的准备:因为PU-GAN是基于patch的,因此需要先对各个模型提取patch。在每个训练模型上提取200个patch,120个模型就一共能提取24000个patch用于训练,其中每个patch就是一个(input patch, groundtruth patch)的pair,input patch有256个点,groundtruth patch有1024个点。
评价指标包括了4类:
- point-to-surface (P2F) distance
- Chamfer distance (CD)
- Hausdorff distance (HD)
- uniform metrics: 评估方法类同上面的uniform loss
- 定量比较
2. 定性比较
3. 真实扫描场景的上采样
针对KITTI数据集:
4. 消融实验
PU-GAN基本延续了PU-Net的思路,但是在诸多细节上均做了非常明显的改进(gridding, self-attention, dense connection, up-down-up, uniform loss等),也确实取得了更加强大的效果。