Grid-GCN for Fast and Scalable Point Cloud Learning
本文介绍一篇cvpr2020里面关于点云识别的文章。
论文
代码
1. 问题
自PointNet++ 和DGCNN问世以后,基本所有的点云处理模型都要使用采样或近邻查询。
- Sampling
- Neighbor points querying
但是,上述两种操作的时间复杂度太高,这篇文章就是解决这个问题。和RandLA-Net有异曲同工之妙。
2. 思想
提出了一种基于 Voxel 的快速采样方法,并依赖 Voxel 做近似而快速的 Points Querying
其中基础模块GridConv 包含了数据的构建Coverage-aware Grid Query(CAGQ),以及图卷积Grid Context Aggregation(GCA)。
数据构建Coverage-aware Grid Query(CAGQ)
CAGQ由 Sampling和Neighbor points querying,都是十分费时的操作,如何快速的完成这两项操作也是本文的主要贡献点。
定义voxel 的大小 ( V x , V y , V z ) (V_{x},V_{y}, V_{z}) (Vx,Vy,Vz),然后将所有点云 ( x , y , z ) (x,y, z) (x,y,z)映射到voxel当中,每个voxel中的点数固定为 n v n_{v} nv, 进而可以得到每个点的voxel索引 V i d ( u , v , w ) = f l o o r ( x / V x , y / V y , z / V z ) Vid(u,v,w)=floor(x/V_{x},y/V_{y},z/ V_{z}) Vid(u,v,w)=floor(x/Vx,y/Vy,z/Vz)
假设 O v O_{v} Ov为非空 voxel 集合,需要采样 M 个 voxel O c O_{c} Oc⊆ O v O_{v} Ov。对于每个 voxel v i v_{i} vi。定义其周围的 voxel 集合为 π ( v i ) π(v_{i}) π(vi),所有该集合中的点叫做 context points。
所以问题转换为:
Sampling:采样 voxel 集合
O
c
O_{c}
Oc⊆
O
v
O_{v}
Ov;
Points Querying:从 Context Points 中选取 K 个点;
图卷积Grid Context Aggregation(GCA)
其实就是各种attention,不是很强的创新。
3. 算法
3.1 Sampling
本文提出了两种基于 voxel 的采样方法
- Random Voxel Sampling (RVS)
每个被占据的voxel等概率被抽中,这种随机采样的方式会使点云分布更均匀。 - Coverage-Aware Sampling (CAS)
CAS的目的是选取那些可以包含更多被占据空间的center voxels O c O_{c} Oc
CAS使用了一个贪心算法来求解,先随机采样 M 个 voxel,即(RVS)
3.2 Points Querying
本文在 voxel 基础上来快速寻找邻近点,提供了两种方法:
-
Cube Query
这是一种近似法,直接在 Context Points 中随机采样 K 个点作为最近邻点。 -
K-Nearest Neighbors
在 Context Points 中寻找 K-NN,相比在全点云中找 K-NN,这种方法搜索速度会更快。
时间复杂度的对比
4 实验结果
分类精度还不错,特意强调他们没有使用voting的方式!!
大量实验展示自己的速度有多快。期待开源代码!
总结
文章做的很扎实,解决的问题也是之前我注意到的。
值得学习的地方:
1 对采样问题的归纳和总结,给出各个方式。就像DGCNN将PointNet归纳成自己的特例。
2 解决问题的思路和方法很简洁高效
3 充分的实验证明,速度快,精度尚可。