Abstract
这篇论文是采用一个Encoder 的模式来编码点云使之适应下游的检查任务。
现有的文献中提供了两种类型的Encoder。一种是固定的编码器,这种encoder往往速度快,但牺牲了准确性;另一种是从数据中学习的编码器,这种编码更准确,但速度较慢。
PointPillars 一个使用PointNets 来学习垂直列组织(pillars)的点云表达的算法。
目前该模型在多个任务中达到了state of art 的程度。
Introduction
第一段介绍了雷达传感器在部署自动驾驶上的应用,指出了对于物体检测任务中包括了一系列的任务,比如背景检测、时空聚类和分类等。
第二段介绍了computer vision 中的深度学习算法可以用在3D点云领域,但是二者还是存在一些不同。其中包括图像是密集的表达,但是点云往往是稀疏的表达;点云是3D的,但是图像是2D的等。因此2D上的算法不能很简单的被用在object detection任务当中
第三段介绍了运用鸟瞰图进行计算的优点。
第四段说了鸟瞰图过于稀疏所以运用在计算的时候非常的不高效且不切实际。常见的解决方法是将点云划分成格子然后每个格子人工设置标记,但是这种方法的特征获取方法在新的配置下可能不适用,需要大量的工程上的努力。
VoxelNet 是第一个在这个领域上运用真正意义上的端到端的算法,但是其存在的问题是计算速度较慢。
第五段提出了PointPillars,这是一个只用2D convolutional layers 的端到端的算法。这个算法有两个好处,首先不用通过固定的encoders来学习,其次通过pillars进行学习不需要通过手工调整垂直方向的分选;最后因为piilars使用的是2D convolution ,所以通过GPU可以快速进行运算。一个额外的好处就是PointPillar 在使用不同的点云配置的时候不要手动的tuning
Related Work
object detection using CNNs
Object detection in lidar point clouds
Contribution
- 提出了一个全新的点云编码网络,允许3D物体detection network 的端到端的训练
- 我们证明了在pillars 上的计算可以利用密集的2D 卷积来进行运算。
PointPillars Network

pointpillars 使用点云作为输入,输出估计到的3D检测框。它又三个主要的阶段组成:
- 一个特征encoder network将点云转换到一个稀疏的伪图像(pseudo image)中。
- 一个2D卷积的backbone 将pseudo-image 转换到高维度的表达
一般目前来讲一个目标检测网络分为三个部分:detector=backbone+neck+head
为了实现从图像中检测目标的位置和类别,我们会先从图像中提取出些必要的特征信息。而在深度学习领域,backbone部分的网络就是负责从图像中提取特征。
后续连接的网络层中用于detection任务的,就被称为detection head
FPN结构,在不同的尺度(实际上就是不同大小的feature map)上去提取不同尺度的信息,并进行融合,充分利用好backbone提取的所有的特征信息,从而让网络能够更好地检测物体。有了FPN,backbone提取出的信息可以被利用的更加充分。而这个因为其存在的特殊位置和作用被称作neck
- 用一个detection head 来预测3D box
Point cloud to Pseudo-Image
我们使用 l = ( x , y , z ) l=(x,y,z) l=(x,y,z)来表示点云中的点
第一步将点云离散化到一个X-Y平面上的均匀的网格(在X、Y轴上划分网格,划分的大小由自己决定),创建一系列pillars P P P, ∣ P ∣ = B |P|=B ∣P∣=B。注意pillar是一个在 z z z轴方向上没有限制的空间的体素,因此不需要通过超参数来控制 z z z轴方向上的binning
之后在每一个pillar上的点在原本3个维度的基础上添加了六个维度 r , x c , y c , z c , x p , y p r,x_c,y_c,z_c,x_p,y_p r,xc,yc,zc,xp,yp,其中 r r r表示反射率, c c c下标表示一个pillar中所有点的算术均值, p p p下标表示该点到中心点 ( x c , y c ) (x_c,y_c) (xc,yc)的偏移量。此时每个点 l ‘ l^` l‘就由 D = 9 D=9 D=9维度组成。
这其中会存在很多没有点的pillars,因此我们用 P P P来记录每一个样本中有多少个非空的pillars,然后用 N N N表示每个pillar中有多少个点,最后创建一个tensor ( D , P , N ) (D,P,N) (D,P,N)。其中如果一个样本中的pillar和点数多于 N N N,就会进行随机采样使点数刚好等于 N N N;如果一个样本中点数少于 N N N,就会用0进行填充。
然后我们用一个简单的PointNet来处理这个数据。这个PointNet包含一个线性层+BatchNorm+ReLU。通过这个生成一个维度为 ( C , P , N ) (C,P,N) (C,P,N)的tensor,然后通过maxpooling将其转变为 ( C , P ) (C,P) (C,P)维度的output。线性层使用1×1的卷积核进行积,从而提高计算效率。
在Encoded之后,特征被分散回原来的pillar来创建一个伪图像(pseudo-image),这个图像的size= ( C , H , W ) (C,H,W) (C,H,W)。其中 H H H和 W W W被认为是伪图像的长和宽。因为我们使用的是pillars而非voxel,所以我们可以跳过计算成本很高的Conv3D。相比于VoxelNet的最大的进步之处
Backbone
这里采用了和VoxelNet一样的backbone(VoxelNet中的表达是RPN)。backbone由两个子网络组成:一个是从上而下的通过降低channels数来达到特征的聚合,一个是上采样和拼接自上而下产生的聚合特征。
论文中的Conv2D 采用了两部分网络(左侧从上到下和向右进行Deconv 两部分)。其中第一部分网络不断缩小特征图的分辨率,同时提升特征图的维度,因此获得了三个不同分辨率的特征图。
另一个网络对三个特征图进行上采样至相同大小,然后进行concatenation。
之所以选择这样架构,是因为不同分辨率的特征图负责不同大小物体的检测。比如分辨率大的特征图往往感受器较小,适合捕捉小物体(在KITTI中就是行人)。
Detection Head
论文中对于3D object detection任务采用的是Single Shot Detector(SSD) 模型,如果想完成其他的任务,也可以更改不容的detection head 来达到相应的目的。
Implementation Details
Loss
ground truth box 和 anchors被定义为 ( x , y , z , w , l , h , θ ) (x,y,z,w,l,h,\theta) (x,y,z,w,l,h,θ),局部的在真实box和锚点之间的回归残差被定义成:

其中
x
g
t
x^{gt}
xgt和
x
a
x^a
xa分别是真实的和anchor box的坐标。
d
a
=
(
w
a
)
2
+
(
l
a
)
2
d^a=\sqrt{(w^a)^2+(l^a)^2}
da=(wa)2+(la)2因此整体的loss为
L
l
o
c
=
∑
b
∈
(
x
,
y
,
z
,
w
,
l
,
h
,
θ
)
S
m
o
o
t
h
L
1
(
Δ
b
)
L_{loc}=\sum_{b\in(x,y,z,w,l,h,\theta)}SmoothL1(\Delta b)
Lloc=b∈(x,y,z,w,l,h,θ)∑SmoothL1(Δb)
因为局部角度的损失不能区分翻转的box,也就是不能区别box的方向,因此heading部分离散化的方向上使用的是softmax 分类损失
L
d
i
r
L_{dir}
Ldir
softmax loss 是softmax分类函数加上交叉熵
在物体分类损失中焦点损失。
L
c
l
s
=
−
α
a
(
1
−
p
a
)
γ
log
p
a
L_{cls}=-\alpha_a(1-p^a)^{\gamma}\log p^a
Lcls=−αa(1−pa)γlogpa
其中
p
a
p^a
pa表示anchor 所属类别的可能性。因此整体的损失为
L
=
1
N
p
o
s
(
β
l
o
c
L
l
o
c
+
β
c
l
s
L
c
l
s
+
β
d
i
r
L
d
i
r
)
L=\frac{1}{N_{pos}}(\beta_{loc}L_{loc}+\beta_{cls}L_{cls}+\beta_{dir}L_{dir})
L=Npos1(βlocLloc+βclsLcls+βdirLdir)
其中
N
p
o
s
N_{pos}
Npos表示positive anchors 的数量
1974

被折叠的 条评论
为什么被折叠?



