Deep Hough Voting for 3D Object Detection in Point Clouds

2 minute read

Published:

Paper Reading Note

URL: http://arxiv.org/abs/1904.09664

TL;DR

(Takeaway message for readers) 本文是 Frustum PointNet 的作者后续的工作;作者指出现在的 3D 检测方法很多都是从 2D 检测中迁移过来的(又夸了一下 PointNet)。但是在 3D 检测中,由于数据比较稀疏,在检测物体的 3D bounding box 时,物体的质心处可能并没有点,因此影响了回归的准确性。因此本文利用 PointNet++ 和 hough voting,提出了 end-to-end 的 votenet,在 ScanNet 和 SUN RGB-D 上实现了 SOTA 的目标检测性能。


Methods

示意图: 07%20PM|690x432 霍夫变换把在点云中检测 patterns 的问题转换成了在参数空间中求 peaks(峰值) 的问题,General Hough Transform 则把这一方法扩展了图像的目标检测中, 利用图像空间和Hough 参数空间的点-线对偶性性,把图像空间中的检测问题转换到参数空间。 Hough变换的实质是将图像空间内具有一定关系的像元,寻找能把这些像元用某一解析形式联系起来的参数空间累积对应点。在参数空间不超过二维的情况下, 这种变换有着理想的效果。但是,一旦参数空间增大,计算量便会急剧上升,同时耗费巨大的存储空间,耗时也随之猛增。

关于使用 Hough Voting 做物体检测的论文可以看这个: http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.172.4723&rep=rep1&type=pdf 20%20PM|690x239

由于深度传感器仅捕获物体的表面,因此 3D 物体的中心很可能在远离任何点的空白空间中。因此,基于点的网络很难在目标中心点附近学习特征,而且简单地增加感受野并不能解决这个问题,因为当网络捕获更大的上下文时,也会导致包含更多的附近的对象和杂物。本文提出将一种类似于经典霍夫投票 (Hough voting) 的投票机制加入到 pointnet++ 中。通过投票可以生成靠近对象中心的新的点,这些点可以进行分组和聚合,以及生成 box proposals。

Deep Hough Voting

使用 hough voting 做 2D 检测时分文 offline 和 online 两步,首先构造 image patches 和 patch 中的点到 center 的 offset 的映射(codebook),在 inference 阶段,从图像中提取出 interested points 并提取周围的 patch,然后将这些 patch 跟 codebook 中的 patch 进行比较,用来检索偏移量和计算投票。考虑到 object patches 倾向于生成一致的投票,因此会在物体中心位置周围形成 cluster,最后,可以通过回溯 votes 到它们各自的 patch,从而得到物体的边界。

Voting 是针对稀疏集合设计的,很适合用于点云,而且它是 bottom-up 的,很契合 pointnet++ 提取特征的过程。在将其迁移到点云时:

  • interest points 通过 pointnet++ 生成
  • vote 通过网络来学习得到,而不是使用 codebook;一方面可以通过利用更大的感受野来减少 vote 歧义的问题,此外,还可以使用特征向量对投票位置进行增强,从而实现更好的聚合。
  • vote aggregation 通过一个可学习的 process layer 完成,充分利用 vote feature
  • 3d box 直接通过 vote aggregation 的结果得出,因此就不需要再根据 vote 回溯寻找物体边界了。

VoteNet Architecture

56%20PM|690x346 通过 pointnet++ 对点进行采样和特征提取,然后利用采样得到的点作为 seed points,每个 seed 通过 vote-module 独立生成一个投票,后面接一个 vote cluster 分组聚合模块分成不同的 group,最后接一个 proposal layer 生成物体的 3d proposal。

网络可以被分为 2 部分

  1. processes existing points to generate votes;
  2. operates on virtual points – the votes – to propose and classify objects.

这就跟 PointRCNN 有点类似了。 PointNet++ 通过 set-abstration layer 和 feature-propagation layer 从 N 个点中选取 M 个关键点生成对应的 point feature,然后把他们作为 seed,生成 M 个 vote。通过一个共享权重的 vote module(MLP+ReLU+BN),该层在 00%20PM|690x107 的监督下生成 3 + C 维的 offset,利用这个 offset,可以得到 vote:y_i = x_i + delta_x, y_g 同理。 Vote 跟 seed 的表示方式相同,不过 seed 要求在物体表面,而且,vote 的位置要比 seed 挨得更近,这就使得它比 seed 更易用分辨不同的物体,也就是说具有了空间的语义信息。接下来就可以 agregrate 这些 vote feature 来生成 proposal。

The votes create canonical “meeting points” for context aggregation from different parts of the objects. After clus- tering these votes we aggregate their features to generate object proposals and classify them.

vote clustering through sampling and grouping

通过在 3D 空间中使用最远点采样采样 k 个点,然后基于这 k 个点生成 k 个 cluster(根据周围点到该点的距离),这种方式比较简单,而且易于集成到 end-to-end 训练过程中。

proposal and classification from vote clusters

最后得到的 vote clustering 是一系列高维空间中的点,本文使用了一个 point set learning network(a shared pointnet) 来 aggregate feature 进而生成 proposal。 给定一个 cluster W,它的 center w_j,每个 w_i 由 3 维的 vote location 和 C 维的 vote feature 组成,为了利用 local geometry,本文采用了类似于 PointRCNN 的做法,将特征 transform 到 local 坐标系,并 normalize。接下来要做的就是把这个 cluster 的 point set 通过 MLP1 得到 single feature,在通过 MLP2 得到 combine multiple features。 12%20PM|690x109

Loss Function

The loss functions in the proposal and clas- sification stage consist of objectness 前景背景分类, bounding box estimation, and semantic classification 如果是 foreground 的话 losses.

Results

35%20PM|690x202 57%20PM|677x500 15%20PM|690x367

Thoughts

本文是 PointNet 系列的作者在 kaiming he 那做 post doc 做的工作,感觉文章包装的很高大上,仔细想想其实跟 PointRCNN 有很多类似的地方,RPN 阶段,PointRCNN 对所有 point 都预测 proposals,VoteNet 只对 SA 采样点进行预测 offset; RCNN 阶段,对 RPN 阶段提取的 point feature 的利用方式不同。PointRCNN是进行简单的特征融合,而VoteNet 是通过预测 feature offset 来融合 RPN 阶段提取的特征。相同点是都将点 transform 到 canonical 坐标系。 不过既然这么有效为啥没给 KITTI 上的结果?