Part-A2 Net(商汤,港中文,2019.7.8,KITTI)

Part-A2 Net(商汤,港中文,2019.7.8,KITTI)

3D Part-Aware and Aggregation Neural Network for Object Detection from Point Cloud

本文指出以往的3D点云检测方法都忽略了标签数据中的内部位置信息,因此提出了在一阶段利用该信息进行区域提议的模型。

论文贡献:
  1. 提出part aware 和 part-aggregation 网络,充分利用了label中的内部位置信息来训练网络。
  2. 提出了可以传递梯度的 Roi-aware point pooling 模块来辅助给局部位置特征分组
  3. KITTI最强,2019.7.9

概述:

二阶段检测网络。

  • part aware stage负责预测粗略的提议框和精确的目标局部信息,同一个提议内的目标局部信息被 ROI-aware pooling 分为同一组,得到该提议的有效特征表达。
  • part-aggregation 负责对提议框打分和优化。
    Part-A2 Net(商汤,港中文,2019.7.8,KITTI)_第1张图片

网络结构:

一、part-aware 模块:

Part-A2 Net(商汤,港中文,2019.7.8,KITTI)_第2张图片

点云特征学习

  1. 体素化原始点云,对每个非空体素内使用sparse-convolution 提特征。每个体素中心被作为新的点,得到新的点云作为backbone的输入。(提特征+降维)
  2. 设计了新的backbone,类似于UNet。

点云分割和预测局部位置信息

在backbone的后面加了两个分支分别用于分割和预测。

从点云label 得到内部位置信息 label 的方法:

归一化,旋转,平移到中心点,注意只计算前景点。
Part-A2 Net(商汤,港中文,2019.7.8,KITTI)_第3张图片
奇怪的是,这里计算回归损失时使用的是binary cross entropy. Part-A2 Net(商汤,港中文,2019.7.8,KITTI)_第4张图片
也就是说生成的局部位置标签是一个bool, 表示该点是不是局部部位?(等有代码了求证一下)

生成3D区域提议

需要使用3D区域提议将得到的属于同一个检测框的的局部位置预测 分组,这里把backbone得到的中间层(encoder的输出)作为rpn head 的输入,该输入特征图为三维点云特征向量,将其投影到BEV,位于同一位置不同高度的点云特征将被融合,这样得到了二维 的点云特征图。最后输出3D区域提议。

ROI-aware point pooling

知道了每个提议框内的局部位置信息 ,如何融合他们来使二阶段网络更好的优化网络的最终输出?

本文提出了 ROI-aware point pooling :将每一个提议体素化,每个体素内的点特征通过融合(max /average pool)作为该体素的特征。空的体素设为0

PointRCNN 中使用了 point cloud region pooling operation,直接丢弃了空的体素,这种操作丢失原本目标框的形状,带来歧义。
Part-A2 Net(商汤,港中文,2019.7.8,KITTI)_第5张图片

二、Part-Aggregation 模块

Part-A2 Net(商汤,港中文,2019.7.8,KITTI)_第6张图片

Aggregation

输入为ROI-aware point pooling 操作之后的输出。其实就是一系列sparse卷积操作,其中包括concat操作将上面pooling的两种feature合并

三、Loss函数

Part-A2 Net(商汤,港中文,2019.7.8,KITTI)_第7张图片

Ablation studies:

  1. part-aware and aggregation是否起到了作用:

    作者通过去掉part locations rediction这部分,使用coordinates进行代替,效果变差,证明了part locations prediction的作用。作者通过去掉part-aggregation stage的部分,直接在part-aware stage的输出做预测,也就是把NMS加在了proposal上,效果对比不如在A2上的提升明显。

  2. RoI-aware Pooling的作用:

    对比了PointRCNN中的Pooling方法,效果提升不错,但这很容易理解,fixed size本身就存在问题。

  3. Pooling之后的网络:

    修改了不同的网络结构,效果提升不大

  4. RoI pooling size:

    分的栅格约细,对于难的问题处理好,但对于简单的问题,可能会产生干扰。

个人思考:

本文使用局部位置信息的点子非常新颖,也很符合直觉。但是在一些地方还有很多值得探讨的地方,比如backbone中各种不同卷积层的搭配设计。

在计算局部位置信息的回归 loss 时使用二值交叉熵,看不懂

最后看到 ROI pooling 就想到 ROI Align …

注释:

Sparse Convolution

​ 这个模块主要对应CV中的步长为2的卷积层,起到pooling的作用。可以参考下面这篇引文:
SECOND: Sparsely Embedded Convolutional Detection
​ 使用Sparse Convolution的主要目的是因为体素化后对点云的表示方法是稀疏的。可以想象,位于天空中的栅格和位于障碍物后面的格子中是不包含激光点的,这种格子的特征数值为0,导致栅格整体来看是稀疏的。对于稀疏的栅格做普通的卷积,要做大量对数据为0的栅格做乘加操作,而这种乘加操作的结果仍然为0,所以直观的讲,对于空栅格做卷积,只是在进行计算,而不提取任何特征,输出与输入均为0,而且由于体素化后大量栅格是空着的,所以大量的操作是无用的。所以在sparse convolution中,只对不为0的栅格做乘加操作,可以极大的减少操作数量。在这种思想的指导下,sparse convolution重新组合卷积操作中的乘加操作,使用table记录哪些栅格不为空,从而针对性地计算,可以大大减少计算量。这种操作的输出与正常的convolution的输出是一样的,只是对于稀疏的输入来说,可以大大减少运算数量。所以步长为2的sparse convolution也好理解,就是正常convolution的理解方法,无非是计算量减小。

Submanifold Sparse Convolution

这个模块主要对应CV中CNN的卷积层,可以参考下面这篇引文:
3D Semantic Segmentation with Submanifold Sparse Convolutional Networks
引文中提到,对于上述sparse convolution有个问题是,随着经过sparse convolution的层数增多,栅格稀疏的性质变的越来越弱。这个问题很好理解,就单对一个不为空的格子而言,经过sparse convolution(其实也就是convolution)的操作,它的影响为卷积核的大小。也就是说,对于convolution的输出的某个格子而言,只要其感受野内有一个不为空的格子,这个格子就不为空。这样子,稀疏的性质是以指数的速度减弱的。
针对上述问题,Submanifold Sparse Convolution做法就是对于输出的某个格子而言,只有其在输入中的那个对应的格子不为空,这个格子才不为空。Submanifold Sparse Convolution的操作引文中只介绍了stride为1的convolution,经过padding可以做到输入和输出的tensor大小一样。经过Submanifold Sparse Convolution的操作,输出不为空的格子的位置是与输入不为空的格子的位置是一样的,数量也是一样的。这样就解决了稀疏性质减弱的问题。
这种操作就与普通的convolution不同了,而是对一些在convolution中输出中不为空的格子将其强制为空了。

参考:

https://blog.csdn.net/wqwqqwqw1231/article/details/100541138

你可能感兴趣的:(Part-A2 Net(商汤,港中文,2019.7.8,KITTI))