当前位置:   article > 正文

【文章阅读+代码复现】Point-GNN_pointgnn

pointgnn

Brief

在3D点云语义分割方法中,GNN已经做了很多可用的方案,但是在目标检测上依旧是采用比较传统的CNN和稀疏卷积的组合,这一篇文章是研究了图卷积在3D检测的中的用法。来自卡内基梅隆大学。已经被CVPR2020接收.
这里是 paper
这里是 code

Abstruct

  • 一个采用GNN设计的3D目标检测框架
  • 过程是先将点云场景编码成图结构,随后设计了一个叫point-GNN的网络结构,在这其间,作者设计了一个自动配准的算法来减少转变误差,同时设计了一个目标框融合的操作来结合从多个顶点的准确预测。

1. Introduction

  • 3D目标检测的应用
  • 点的稀疏性使得不能使用传统的CNN网络结构
  • 目前的几种运用目标检测的点的表示形式:
    在这里插入图片描述

(1)图一的就是目前比较流行的voxel-based的一些方法,首先将点体素化,提取体素特征
(2)图2则是建立在pointnet的基础上的网路架构表示形式,有F-pointnet和point-RCNN等网络代表
(3)值得一提的是,CVPR2020和ICCV19已经有一些文章在将上诉的voxel-point的方法结合起来了,其中有出于提高速度的voxel-pointnet和精度提升非常大的PVRCNN(强推)
(4)图三即是本文作者所采用的GNN网络结构,可以看出和pointnet最大的不同就是没有采取采样的策略,这也就会导致在程序运行中FPS很低.。作者在本文中所有的点都作为图的顶点,以一定的半径范围内的点相连成边。

  • 作者的网络结构输入的是点云的图表示,在输入前需要对点云建图。属于一阶段的方法,作者同时引入了自动配准机制,该机制可以允许点根据他们的特征配准他们的坐标。以及设计了基于多顶点预测结果的合并算法

2. Related Work

  • Point cloud in grids

这里作者主要介绍了把点规整化后再处理的一些网络结构,包括了投影到二维图像上和voxelize的方法

  • Point cloud in sets

这里主要是point-based的方法,不多过介绍

  • Point cloud in graphs

(1)GNN在点云中的应用主要也是在寻找一种可以对于图结构这种不规则的表达数据能不能把二维中的CNN运行模式引入进来。CNN通过连接的edge来更新顶点的特征,目前的边特征整合和MLP在点云中的运用类似,但是GNN能够容纳更加复杂的网络特征,但是不需要采样和group(这样做有好有坏吧,一方面这样更多的顶点,不采用sample的方式可以有更多的细节特征,但实际上也增大了计算量<\font>)。
(2)作者只建图一次,剩下的GNN优化过程都是在同一张图上进行优化工作的

3. Point-GNN for 3D Object Detection in a Point Cloud

over-all structure:
在这里插入图片描述

上图很清晰的表达了作者做的三部分结构(1)图构建(2)PointGCN网络结构(3)bbox融合

3.1. Graph Construction

一个点集作者采用 P = { p 1 , … , p N } P=\left\{p_{1}, \dots, p_{N}\right\} P={p1,,pN}表示,其中每一个元素 p i = ( x i , s i ) p_{i}=\left(x_{i}, s_{i}\right) pi=(xi,si)中的 x i x_i xi表示的是3D坐标中的坐标, s i s_i si表示的是该点的属性,可以是KITTI中的点的反射强度等等,作者构建的图结构则是以点P为顶点,一个固定半径中的顶连接起来得到一个局部图。表示如下:
E = { ( p i , p j ) ∣ ∥ x i − x j ∥ 2 < r } E=\left\{\left(p_{i}, p_{j}\right) |\left\|x_{i}-x_{j}\right\|_{2}<r\right\} E={(pi,pj)xixj2<r}

作者在这里指出可以采用方法使得建图的时间复杂度降低到 O ( c N ) , 这 里 的 c 表 示 在 这 个 固 定 半 径 内 的 点 的 最 大 个 数 O(cN),这里的c表示在这个固定半径内的点的最大个数 O(cN)c,作者的表述为:

The construction of such a graph is the well-known fixed radius near-neighbors search problem. By using a cell list to find point pairs that are within a given cut-off distance, we can efficiently solve the problem with a runtime complexity of O(cN) where c is the max number of neighbors withinthe radius.

但是在实际上,1w多个点也是很大的计算负担,因此作者采用了voxel采样,作者表明他采用的voxel仅仅是用于采样,不会用于点云表示,作者还是采用的graph的方式表示点云。

作者为了使得之前的信息不丢失,采用了把voxel编码的信息存放在上式中的 s i s_i si作者并将这些特征作为GNN的初始特征,迭代过程可以下图所示:
在这里插入图片描述

3.2. Graph Neural Network with Auto-Registration

GNN迭代过程中,会根据边更新顶点的特征,可以表达为:
v i t + 1 = g t ( ρ ( { e i j t ∣ ( i , j ) ∈ E } ) , v i t ) e i j t = f t ( v i t , v j t )

vit+1=gt(ρ({eijt|(i,j)E}),vit)eijt=ft(vit,vjt)
vit+1eijt=gt(ρ({eijt(i,j)E}),vit)=ft(vit,vjt)
这里的 e t e^t et表示的是边的第t次迭代的特征, v t v^t vt是顶点的特征。 f t ( . ) f^{t}(.) ft(.)表示根据顶点更新边的特征; ρ ( . ) \rho(.) ρ(.)表示对多条边特征的整合; π − 1 \pi^{-1} π1表示将整合的边特征更新为新的顶点特征。

在本文中,作者的顶点特征可以表示为:
s i t + 1 = g t ( ρ ( { f t ( x j − x i , s j t ) ∣ ( i , j ) ∈ E } ) , s i t ) s_{i}^{t+1}=g^{t}\left(\rho\left(\left\{f^{t}\left(x_{j}-x_{i}, s_{j}^{t}\right) |(i, j) \in E\right\}\right), s_{i}^{t}\right) sit+1=gt(ρ({ft(xjxi,sjt)(i,j)E}),sit)

(1)这里的输入采用的是顶点间的相对坐标作为输入,因为相对坐标对点云的整体平移具有不变性,但是对邻近区域的变换很敏感。但是假如一个平移被添加到一个顶点时,他们的局部结构还是相似的,但是相对坐标是发生变化的,这会导致增加输入方差。
(2)为了减少平移方差,作者根据邻居的结构特征来调整他们的坐标,而不是使用中心顶点坐标

所以作者提出的 auto-registration表示为:

Δ x i t = h t ( s i t ) s i t + 1 = g t ( ρ ( { f ( x j − x i + Δ x i t , s j t ) } , s i t )

Δxit=ht(sit)sit+1=gt(ρ({f(xjxi+Δxit,sjt)},sit)
Δxitsit+1=ht(sit)=gt(ρ({f(xjxi+Δxit,sjt)},sit)

这里的 Δ x i t \Delta x_{i}^{t} Δxit表示的是坐标点的偏移值(顶点坐标和配准值之间), h t ( . ) h^{t}(.) ht(.)根据之前迭代得到的顶点属性值计算偏移值。
作者将上诉的函数设置为MLP和max,具体表示为:
Δ x i t = M L P h t ( s i t ) e i j t = M L P f t ( [ x j − x i + Δ x i t , s j t ] ) s i t + 1 = M L P g t ( Max ⁡ ( { e i j ∣ ( i , j ) ∈ E } ) ) + s i t

Δxit=MLPht(sit)eijt=MLPft([xjxi+Δxit,sjt])sit+1=MLPgt(Max({eij|(i,j)E}))+sit
Δxiteijtsit+1=MLPht(sit)=MLPft([xjxi+Δxit,sjt])=MLPgt(Max({eij(i,j)E}))+sit

可以看出边的特征和顶点的属性都是采用的MLP去学习的。(点云中的GNN)

3.3. Loss

  • cls loss
    采用的是交叉熵Loss :

l c l s = − 1 N ∑ i = 1 N ∑ j = 1 M y c j i log ⁡ ( p c j i ) l_{c l s}=-\frac{1}{N} \sum_{i=1}^{N} \sum_{j=1}^{M} y_{c_{j}}^{i} \log \left(p_{c_{j}}^{i}\right) lcls=N1i=1Nj=1Mycjilog(pcji)

  • loc loss
    首选先将原始坐标的信息转化为GNN顶点的坐标信息:

δ x = x − x v l m , δ y = y − y v h m , δ z = z − z v w m δ l = log ⁡ ( l l m ) , δ h = log ⁡ ( h h m ) , δ w = log ⁡ ( w w m ) δ θ = θ − θ 0 θ m

δx=xxvlm,δy=yyvhm,δz=zzvwmδl=log(llm),δh=log(hhm),δw=log(wwm)δθ=θθ0θm
δxδlδθ=lmxxv,δy=hmyyv,δz=wmzzv=log(lml),δh=log(hmh),δw=log(wmw)=θmθθ0

如果一个顶点在Box中,那么采用huber loss,最后将所有的loc loss求一个平均.
l l o c = 1 N ∑ i = 1 N 1 ( v i ∈ b i n t e r e s t ) ∑ δ ∈ δ b i l h u b e r ( δ − δ g t ) l_{l o c}=\frac{1}{N} \sum_{i=1}^{N} \mathbb{1}\left(v_{i} \in b_{i n t e r e s t}\right) \sum_{\delta \in \delta_{b_{i}}} l_{h u b e r}\left(\delta-\delta^{g t}\right) lloc=N1i=1N1(vibinterest)δδbilhuber(δδgt)

为了防止过拟合,作者加入了L1正则化,有:
l total = α l cls + β l loc + γ l reg l_{\text {total}}=\alpha l_{\text {cls}}+\beta l_{\text {loc}}+\gamma l_{\text {reg}} ltotal=αlcls+βlloc+γlreg
这里的reg loss应该就是以往的SMooth L1

3.4. Box Merging and Scoring

NMS在作者认为如果仅仅靠最大分数选择最终的Box的话,并不能一直得到最好的结果。为了提高定位的准确率,作者的mergerd的方法,细节一点的是,作者考虑了重叠边界框的中位数位置和大小,具体算法如下:
在这里插入图片描述

也就是不仅仅以分数决定最终的box,和soft nms的想法一样。

4. Experiments

在这里插入图片描述
对比之前的一些采用点云输入的方法,的确有一些提升。

本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
  

闽ICP备14008679号