激光点云3D目标检测算法之CenterPoint

news/2024/7/10 3:18:44 标签: 目标检测, 深度学习, 自动驾驶

激光点云3D目标检测算法之CenterPoint

本文首发于公众号【DeepDriving】,欢迎关注。

前言

CenterPointCVPR 2021的论文《Center-based 3D Object Detection and Tracking》中提出的一个激光点云3D目标检测与跟踪算法框架,与以往算法不同的是,该算法不用边界框而是提出用关键点来表示、检测和跟踪3D目标:在检测流程中,第一阶段先用一个关键点检测器去检测目标的中心点,然后再用中心点特征回归出目标的3D尺寸、朝向和速度等属性,第二阶段再基于该目标额外的点特征去对这些属性进行优化;目标跟踪则被简化为一个简单的最近点匹配过程。CenterPoint提出的3D目标检测与跟踪算法非常简单而高效,在nuScenesWaymo数据集上都取得了SOTA的性能表现。

论文链接:https://arxiv.org/pdf/2006.11275.pdf

代码链接:https://github.com/tianweiy/CenterPoint

本文将对CenterPoint算法进行简要的解读。

预备知识

3D目标检测

假设用 P = { ( x , y , z , r ) i } \mathcal{P} =\left \{ (x,y,z,r)_{i} \right \} P={(x,y,z,r)i}来表示一帧无序的点云,其中 ( x , y , z ) (x,y,z) (x,y,z)表示3D位置, r r r表示反射强度。3D目标检测的目的是从点云中预测一系列在鸟瞰图视角下用于表示3D目标的边界框 B = { b k } \mathcal{B}=\left \{b_{k}\right \} B={bk},每个边界框可以表示为 b = ( u , v , d , w , l , h , α ) b=(u,v,d,w,l,h,\alpha) b=(u,v,d,w,l,h,α),其中 ( u , v , d ) (u,v,d) (u,v,d)表示目标相对于地平面的中心点位置, ( w , l , h ) (w,l,h) (w,l,h)表示目标的3D尺寸, α \alpha α表示目标的朝向角。

目前主流的3D目标检测算法一般都是先通过一个3D特征编码器将无序的点云划分为规则的单元格(VoxelPillar),然后用基于点的网络(PointNet/PointNet++)去提取每个单元格中所有点的特征,再通过池化操作保留最主要的特征。接下来这些特征被送入一个骨干网络(VoxelNetPointPillars)用于生成特征图 M ∈ R W × L × F \mathbf{M} \in \mathbb{R} ^{W\times L\times F} MRW×L×F,其中 W , L , F W,L,F W,L,F分别表示宽、长和通道数,基于这个特征图,一个单阶段或者二阶段的检测头就可以从中生成目标检测结果了。之前anchor-based3D目标检测算法(比如PointPillars)都需要基于预定义的anchor去回归目标的位置,但是3D物体通常具有各种各样的尺寸和朝向,这就导致需要定义数量众多的anchor用于模型的训练和推理,从而增加大量的计算负担。另外,基于anchor的方法也不能很精确地回归出3D目标的尺寸和朝向。

如果对3D目标检测流程不了解的可以先看一下PointPillars,算法的结构如下图所示:

pointpillars_overview

算法解读可以参考我之前写的这篇文章:

激光点云3D目标检测算法之PointPillars

基于中心点的2D目标检测算法CenterNet

CenterPoint延续了CenterNet基于中心点做目标检测的思想。CenterNet2D目标检测当做一个标准的关键点估计问题,将目标表示为一个在其边界框中心位置的单独点,其他的一些属性比如目标尺寸、维度、朝向和姿态等则直接从这个中心点位置的图像特征中进行回归。该模型将图像输入到一个全卷积网络中用来生成热力图,热力图的峰值位置即为目标的中心,每个峰值位置的图像特征用来预测目标边界框的宽度和高度。

如果对CenterNet目标检测算法还不了解可以先看一看我之前写的这篇文章,这里就不做过多介绍了。

经典的目标检测算法:CenterNet

CenterPoint模型

下图是CenterPoint算法的框架,首先通过VoxelNetPointPillars等标准的3D骨干网络从点云中提取鸟瞰图下的特征图,然后用基于2D卷积神经网络实现的检测头去找到目标的中心并用中心特征回归出3D边界框的属性。

centerpoint_model

中心点热力图

CenterPoint中心点热力图的生成方式与CenterNet基本类似,这个回归分支会生成K个通道的热力图 Y ^ \hat{Y} Y^,每个通道表示一个类别。在训练过程中,用一个2D高斯函数将标注的目标的真实3D中心映射到鸟瞰图上去,损失函数用的是Focal Loss。与图像相比,在鸟瞰图上的目标要稀疏很多而且一个目标所占的面积很小,不存在因透视变换引起的近大远小的现象(一个近处的物体可能就占了一大半的图像区域)。为了解决这个问题,作者扩大了在每个目标中心呈现的高斯峰值来增加对目标热图 Y Y Y的正向监督,设置高斯函数的半径为

δ = m a x ( f ( w l ) , τ ) \delta = max(f(wl),\tau ) δ=max(f(wl),τ)

其中 τ = 2 \tau=2 τ=2是最小允许的半径, f f f是在CornerNet中定义的半径计算函数。

目标属性回归

除了中心点,还需要3D尺寸和朝向等信息才能完整地构成一个3D边界框来表示一个目标。CenterPoint从中心特征中去回归下面的几个目标属性:

  • 位置修正值 o ∈ R 2 o \in \mathbb{R}^2 oR2,用于减少由于体素化和骨干网络中的stride引起的量化误差。
  • 离地面的高度 h g ∈ R h_{g} \in \mathbb{R} hgR,用于帮助在3D空间中定位目标和添加因为映射到鸟瞰图而丢失的高度信息。
  • 3D尺寸 s ∈ R 3 s \in \mathbb{R}^3 sR3,目标的长宽高信息,回归时用对数函数表示,因为实际的物体可能会有各种大小的尺寸。
  • 朝向角 ( s i n ( α ) , c o s ( α ) ) ∈ R 2 (sin(\alpha),cos(\alpha))\in \mathbb{R}^2 (sin(α),cos(α))R2,用朝向角的正弦和余弦值作为连续的回归目标。

速度估计与目标跟踪

为了对目标进行跟踪,CenterPoint添加了一个额外的回归分支用于预测每个检测到的物体的二维速度 v ∈ R 2 \mathbf{v} \in \mathbb{R} ^2 vR2。与其他属性不同的是,速度估计需要前一帧和当前帧的特征图作为输入,目的是预测目标在当前帧与在前一帧中的位置偏移。与回归其他目标属性一样,速度估计也使用 L 1 L_{1} L1损失函数用于监督训练。

在推理阶段,把目标在当前帧中的中心点通过负速度估计的方法映射回前一帧中,然后用最近距离匹配的方式将它们与已跟踪的目标进行匹配。与SORT目标跟踪算法一样,如果一个目标连续3帧没有匹配成功就将其删除。下图是跟踪算法的伪代码,整个流程比较简单。

SORT目标跟踪算法的原理可以参考我之前写的这篇文章:

多目标跟踪算法之SORT

二阶段CenterPoint

前面介绍的一阶段CenterPoint算法用基于中心点的方法去检测目标并回归得到目标的属性信息,这种检测头非常简单而且效果比基于anchor的检测方法效果好。但是由于目标所有的属性信息都是从目标中心的特征推断出来的,因此可能因缺少足够的特征信息对目标进行精准的定位,因此作者又设计了一个轻量级的点特征提取网络对目标的属性进行二阶段的优化。

在这个阶段中,需要从第一个阶段预测出的边界框每个面的3D中心去提取点特征。考虑到边界框的中心、顶部和顶部的中心在鸟瞰图中会被投影到同一个点,因此作者仅考虑边界框的中心和四个向外面的中心。首先从骨干网络输出的特征图 M \mathbf{M} M中通过双线性插值来提取每个点的特征,然后将提取的特征堆叠起来送入一个MLP网络中用来对前一阶段预测出的边界框进行优化。

这个阶段还会预测一个置信度分数,训练过程中的计算公式如下:

I = m i n ( 1 , m a x ( 0 , 2 × I o U t − 0.5 ) ) I=min(1,max(0,2 \times IoU_{t}-0.5)) I=min(1,max(0,2×IoUt0.5))

其中 I o U t IoU_{t} IoUt表示第 t t t个候选框与ground-truth之间的3D IoU值。损失函数采用二值交叉熵损失,公式如下:

L s c o r e = − I t l o g ( I ^ t ) − ( 1 − I t ) l o g ( 1 − I ^ t ) L_{score} = -I_{t}log(\hat{I}_{t}) - (1-I_{t})log(1-\hat{I}_{t}) Lscore=Itlog(I^t)(1It)log(1I^t)

其中 I ^ t \hat{I}_{t} I^t表示预测的置信度分数。在推理过程中,置信度分数
的计算方式如下:

Q ^ t = Y ^ t ∗ I ^ t \hat{Q}_{t}=\sqrt{\hat{Y}_{t}*\hat{I}_{t}} Q^t=Y^tI^t

其中 Y ^ t = m a x 0 ≤ k ≤ K Y ^ p , k \hat{Y}_{t}=max_{0\le k \le K}\hat{Y}_{p,k} Y^t=max0kKY^p,k I ^ t \hat{I}_{t} I^t分别表示第一阶段和第二阶段对目标 t t t预测出的置信度分数。

总结

CenterPoint可以说是CenterNet3D目标检测任务上的延续,继续沿用简单而优雅的方式来解决目标检测问题,所提出的center-based检测头可以直接替换之前VoxelNetPointPillarsanchor-based算法中的检测头,极大地简化训练和推理过程,并且检测效果更好。

参考资料

  • Center-based 3D Object Detection and Tracking

http://www.niftyadmin.cn/n/340224.html

相关文章

Windows 环境 Rust postgress dll报错

本文将主要阐述三个bug,具体如下: 报错1: LNK1181: cannot open input file “libpq.lib” 命令行中输入setx PQ_LIB_DIR "C:\Program Files\PostgreSQL\14\lib" 重新 cargo build 问题解决 报错2:Exit code: 0xc000…

软件测试项目实战经验附视频以及源码【商城项目,app项目,电商项目,银行项目,医药项目,金融项目】

前言: ​​大家好,我是凡叔。 很多初学的测试小白都在烦恼找不到合适的项目去练习,这也是难倒大部分测试小白的一个很常见的问题,项目经验确实是每一个测试非常宝贵的经验!这里凡叔给大家找了一些常用的项目合集&…

multiprocessing 模块创建进程

流程特点 【1】 将需要子进程执行的事件封装为函数 【2】 通过模块的Process类创建进程对象,关联函数 【3】 可以通过进程对象设置进程信息及属性 【4】 通过进程对象调用start启动进程 【5】 通过进程对象调用join回收进程 基本接口使用 Process() 功能 &#xf…

Vue + Springboot 文件上传项目笔记(一)

前端 使用脚手架创建项目 vue create vue_fileuploaddemo等待命令执行完毕添加 element-ui 组件 E:\java\idea_java_maven\vue_fileuploaddemo>yarn add element-ui yarn add v1.22.19 [1/4] Resolving packages... warning element-ui > async-validator > babel-…

JavaScript 上下文对象

文章目录 JavaScript 上下文对象概述规则一使用例子一例子二例子三例子四 规则二使用例子一例子二 规则三使用例子一例子二 规则四使用例子一 规则五使用例子一例子二 规则六使用 JavaScript 上下文对象 概述 函数中可以使用this关键字,表示函数的上下文。 判断上…

SpringBoot配置文件3种格式、配置文件读取方式、多环境配置、配置文件优先级分类

文章目录 1 配置文件格式1.1 环境准备1.2 不同配置文件演示1.3 三种配合文件的优先级 2 yaml格式2.1 语法规则 3 yaml配置文件数据读取3.1 环境准备3.2 读取配置数据方式1 使用 Value注解方式2 Environment对象方式3 自定义对象 4 多环境配置4.1 yaml文件4.2 properties文件4.3…

Unity之新版输入系统InputSystem如何自定义InputActions

一.前言 上一篇文章,我们介绍了如何使用新版本的InputSystem,我们知道了InputActionsAsset给我们提供了更多的灵活性,扩展性和复用性。那么这篇文章我们就来介绍一下如何创建自定义InputActionAsset 二.创建ActionAssets Input Action Asset 包含输入 Actions及其关联的B…

Vue3 整合vue-router

1.准备工作 1.1 安装 vue 3安装 vue-router4 npm install vue-router4 --S 1.2 配置 初始化路由对象 createRouter 用于初始化路由对象,接受一个选项对象作为参数 初始化路由最重要的是配置routes来确定整个项目的路由匹配规则 import { createRouter, createWebHi…