一、综述
3D检测背景
二维目标检测算法能识别物体的类别、平面坐标以及边长,是计算机视觉中的一个基本问题。但是对于自动驾驶来说,二维信息还不足以让汽车充分感知三维立体的真实世界,当一辆智能汽车需要在道路上平稳、安全地行驶时,它必须能感知到周围物体精确的3D信息,才能做出安全的决策。因此,3D检测在智能驾驶领域中变得越来越重要。智能驾驶的发展能促进3D检测的研究,3D检测又能推动智能驾驶技术的进步。


相比于2D目标检测判断物体的类别、坐标、边长等信息,3D目标检测要回归更多的位置信息,回归的方案主要有三种:
①8角点,即3D框8个顶点的三维坐标;
②4角点+2高,即3D框底面4个点的三维坐标以及底面和顶面到地平面的距离;
③7参数,回归3D框的几何中心坐标、长宽高以及朝向角。
目前主流算法多采用回归7参数的方案。

数据集


KITTI是最早的智能驾驶3D检测数据集,在2012年推出,车身装了2个灰度相机,2个彩色相机,1个激光雷达。覆盖了22个场景,训练集和验证集共计约15000张,点云数据15000帧,但是视角有限,只有车辆前方90度的数据,且环境大多只有阳光充足的白天。

2019年,NuScenes数据集推出,相较于KITTI有了全面的进化,车身一圈装了6个相机,车顶有1个激光雷达。覆盖了上千个场景,有140万张图像,40万帧点云数据,相机视角达到车周围360度,包括了夜晚和雨天等场景,环境丰富程度远超KITTI。

上图为NuScenes数据集的可视化标注图,展示了6个环绕相机和BEV视角下的标注情况。
其他的3D检测数据集还有很多,比如百度的阿波罗数据集,主要采集了中国城市的各个场景,就不再一一介绍了。

传感器及相关算法
概述
智能汽车需要通过传感器来感知周围环境,主要使用的传感器有相机、激光雷达以及毫米波雷达,这些设备的特点如表格所示。

使用的车载传感器不同,相应的算法也会不同。通常来说,3D目标检测分为使用摄像头的纯视觉算法,使用雷达的点云算法,以及摄像头与雷达结合的视觉加点云多模态算法。
视觉算法包括使用单个摄像头的单目方案以及使用两个以上摄像头的多目方案,常用的算法有模板匹配、几何约束、深度估计等。模板匹配是考虑到人和车有固定的尺寸,因此可以建立模板数据库解决目标存在遮挡或者截断的问题;几何约束主要是用2D框的几何属性去估计3D框;结合深度估计是为了弥补单目视觉的不足,因为只靠单个摄像头很难获得充足的深度信息。
激光雷达和毫米波雷达会生成点云数据。点云算法又主要分为两类,一类是直接处理点云数据的Point-based算法,一类是将点云数据体素化之后再处理的Voxel-based算法。点云就是三维空间中一个个点的集合,体素就相当于是三维空间中的一个个小方块,类似二维平面的像素。
多模态算法同时使用摄像头和雷达。理论上来说,基于图像的处理方法只提供纹理信息,不提供深度信息,而基于点云的处理方法提供深度信息,但缺乏纹理信息,因此将两者融合互补可以获得更好的检测效果。视觉和点云有三种融合方式:
①数据层融合:对原始或预处理的传感器数据做融合;
②特征层融合:在网络的特征层做信息交互;
③决策层融合:在后处理阶段做融合。

纯视觉方案
介绍三种只使用摄像头的纯视觉算法,分别是结合模板匹配的3DOP,结合几何约束的M3D-RPN,以及结合深度估计的D4LCN。
3DOP

3DOP结合了模板匹配法。该算法调用了双目摄像头,两幅成对图像作为输入,生成深度图并转化为点云数据辅助检测,网络结构类似Fast-RCNN,在生成候选框的时候引入了先验知识,包括对象大小、地平面上下文信息以及深度信息,最后将检测框映射到2D图像上。
M3D-RPN

M3D-RPN算法结合了几何约束信息。算法的特点是使用了深度感知卷积层提取全局和局部特征,即网络结构中右侧蓝色部分,将特征图分为多行,每行都单独使用一个卷积学习特征,之后将左右两个分支按照一定权重进行结合,采用位姿优化算法进行方位估计,同时预测 2D 和 3D 检测框。
D4LCN

D4LCN算法首先从单张RGB图像中估计出深度图,对RGB图进行特征提取,在深度图中生成特定的卷积核(不同图片生成的卷积核不同),之后将卷积核与RGB图像的特征图做计算,最后回归2D与3D的检测信息。

雷达点云方案
PointNet

PointNet是比较早期的点云算法。n表示点云数量,3表示每个点云的三维坐标。为了在特征提取的过程中能保留较多信息,会先对输入数据做升维操作。PointNet对每一个点都用一次多层感知机(mlp)做升维,将nx3一步步升维到nx64,再到nx1024,在点云数量的维度上做最大池化,得到1x1024的全局特征,最后在使用多层感知机得到k分类的结果。对于分割任务,将1x1024扩充到nx1024,与nx64做融合,得到nx1088的数据,多次使用多层感知机多1088进行降维,最后生成nxm的得分结果。

PointNet++

PointNet++使用了编解码结构,多次在小块区域上使用PointNet获取局部特征。对于分割任务,会进行插值上采样,和前面的特征图融合,类似2D语义分割的unet。对于分类任务,就在最深层特征图上使用一次PointNet压缩维度,再使用全连接层得到分类得分。
虽然PointNet和PointNet++没有做3D检测,但是这些算法为后面点云检测的发展奠定了基础。接下来介绍两种将点云体素化的3D检测算法。

VoxelNet

VoxelNet首先用小方块(体素)填满整个三维空间,然后做分组操作,每个体素里的点云数据都属于那个体素,之后对非空体素做随机采样,每个体素选取35个点,每一个体素都经过VFE层做体素特征编码,这里VFE的结构就是PointNet,之后得到四维数据,对其做3D卷积,最后经过RPN得到3D检测框。

PointPillars

PointPillars的算法核心是生成伪图像的过程,和VoxelNet不同,PointPillars算法首先用一个个柱子填充三维空间,将HxW个柱子重新排布成一行P个,P=HxW,D是每个点云包含的信息数量,比如坐标、反射强度等,N是每个柱子包含的点的数量,点云多的采样N个,点云少的就补0补齐到N个。之后使用PointNet处理,竖方向的维度就没了,D经过特征提取变成C,再把P还原成HxW重新排列,得到一个HxWxC的伪图像,使用二维卷积继续处理即可,使用SSD的在2D网格中进行目标检测,Z轴坐标和高度是通过回归的方式得到。因为主要的运算是2D卷积而不是3D卷积,所以PointPillars算法的计算速度非常快。

多模态方案
对于摄像头和雷达数据结合的多模态方案,这里介绍MV3D算法。
MV3D

MV3D算法有三个输入,分别是点云俯视图,点云前视图,以及RGB前视图。对点云俯视图采用类似Faster-RCNN的算法得到3D候选框,之后将三个视角的特征图经过ROI pooling整合成同一个维度做数据融合,这里的M表示逐点均值运算,最后得到分类结果和3D检测框。

二、FCOS系列算法
FCOS

因为FOS3D与FCOS一脉相承,联系非常紧密,因此首先介绍基础的2D目标检测FCOS算法。同一个团队先后发表了两篇文章介绍FCOS,2020年的版本针对2019的做了一定优化,因此以第二篇的表述为主。
FCOS的特点是逐像素预测,网络最后一个特征层的每个点都会回归到输入图像上做预测,虽然是Anchor-Free的方法,但是在后处理依然使用了NMS去除重叠的检测框。网络结构的特点是使用了FPN,并且检测头是FPN的所有特征层共享的。算法最大的特点是使用了标签分配策略,并且提出了center-ness参数,这两点后面会详细说明。

网络的backbone,即图中的蓝色部分,使用的是ResNet-50,蓝色和绿色共同组成了FPN结构,在FPN的基础上,还额外增加了P6和P7两个更深度的特征层,最后有一个所有绿色的特征层共享的检测头。检测头有两个分支,一个做分类,一个做边框回归,刚才提到的center-ness和边框回归在第二条分支的最后才解耦。

具体来说,FCOS的边框回归回归的是某个像素点到四条边的距离。

这张图展示了FCOS算法是如何做目标检测的。因为没有了Anchor,所以FCOS以点为单位来和目标物体进行匹配。首先上方的网格代表网络最后一层的特征图,先把特征图的每个点还原到输入图像中对应的位置。在2019的版本中,落入GT box内的点都可以算作正样本,在2020年的版本中正样本判定更加严格,必须得在靠近GT box中心的较小的矩形区域内才算作正样本,才可以回归检测框。

但同时,这个方法也带来了一个问题,如果有一个像素点同时落在了两个GT box内,那么这个点负责回归哪个物体呢?标签分配策略负责解决这个问题。
首先,尺度差异较大的GT box,交由FPN的不同深度的特征层负责,比如图中的黄色方框较大,会由较深的特征层的像素点预测,蓝色小方框由较浅的特征层的像素点预测。
那么,如果两个GT box的面积也差不多,都交给FPN同一个深度的特征层负责,又该怎么处理呢?作者提出按照GT box的面积判断,当前像素点只负责预测面积最小的GT box。
现在,标签分配的解决了一个像素点在多个GT box里的情况,那么所有像素点循环一遍之后,一个GT box里有多个像素点对其做预测,应该怎么做筛选呢?
正常来说是使用NMS给重叠的框打分,做排序,保留得分最高的预测框。FCOS算法提出了一个参数center-ness,center-ness希望解决的问题是,有一些框分类得分高,但是位置偏移量大。为了降低位置偏移量大的框的排名,会给较低的center-ness值,这样每个框的分类得分会乘上各自的center-ness,之后再做排序,有效降低了位置偏移量大的框的排名。

具体来说,center-ness预测的是当前像素点是否靠近GT box的中心,从公式中可以看出,像素点距离边框左右的距离约接近,距离边框上下的距离越接近,center-ness就越接近1。
到这里,FCOS算法的主要思想就介绍完了,这些想法很大程度上也启发了后续FCOS3D的工作。

FCOS3D


FCOS3D是基于FCOS做了调整和优化的3D目标检测算法,有几个特点:
①检测头解耦了2D和3D的特征;
②在对像素点做标签分配到时候,FPN同级特征层中尺度差异小的GT box改用三维中心的距离判断;
③使用二维高斯分布重新定义center-ness参数。


在网络结构方面,FCOS3D的backbone换成了ResNet101,同时使用了可变形卷积,但出于计算量的考虑,第一个卷积块使用的是固定的卷积。FPN依然延伸出了P6和P7两个更深的特征层。检测头依然是共享的,但解耦了2D和3D特征。△x和△y是3D边框2D投影的中心点在平面图上和当前负责预测的像素点的偏移量,d是对深度的预测,WHL是3D框的边长,θ是角度,这里用Cθ去判断车子的行驶方向,能提高对方向角的预测准确度。
FCOS3D与FCOS的联系非常紧密。首先,FCOS3D虽然最终目标是预测3D检测框,但在做标签分配的时候,依然是使用2D检测框来将尺度差异大的目标分配给FPN不同级别的特征层,这里的2D框使用的是3D框2D投影的外接矩形。但是对于尺度差异小的目标,FCOS3D算法根据3D中心距离来分配,离当前像素点最近的3D中心点代表的那个3D框,交给这个像素点去做预测,而FCOS算法是直接分配面积最小的。实验表明,FCOS3D的策略有效提升了大型车辆的召回率。

对于一个3D GT box有多个像素点预测的情况,FCOS3D用二维高斯分布重新定义了center-ness参数。公式中,α是一个常数。△x和△y越小,c越接近1,△x和△y越大,c越接近0,c和分类得分相乘,再在NMS中排序,可以有效降低分类得分高,但是位置偏移量大的检测框的排名。

ATE:平均平移误差,二维的欧式中心距离;
ASE:平均刻度误差,1−IoU(3Dbox的IoU);
AOE:平均朝向误差,预测和标记之间的最小偏航角差(弧度);
AVE:平均速度误差,维绝对速度误差的L2-Norm (m/s);
AAE:平均属性误差,1−acc(acc为属性分类精度)。
NDS是结合了前面6个指标的综合指标。
可以看到FCOS3D在同类算法中是最优秀的。

FCOS3D++


FCOS3D是FCOS算法的延伸,FCOS3D++又是FCOS3D算法的延伸。作者在深度上做文章,认为单目3D检测可以简化为一个实例深度估计问题。作者考虑到现有的方法大都直接基于孤立的实例或像素来估计深度,而忽略了不同物体之间的几何关系,因此提出了两个方法去研究深度。图a表示实例概率深度的计算, 深度值本身在一定范围内是连续的,这里将深度区间均匀量化为一组离散值,用分布的期望表示预测;图b表示几何深度传播图, 利用车辆之间的透视关系、相对位置关系分析深度。

DR:直接深度回归;
DP:概率输出映射(a),将深度离散化并softmax解码;
DL:每个孤立实例的局部深度估计,DR和DP的结合;
DG:几何深度图(b),DL经过一系列几何变换得到;
α:位置感知权重映射;
Depth estimation:深度估计。
经过以上步骤,就完成了深度分支的所有操作。

利用深度传播图,通过透视关系,可以根据其他物体的线索来估计任何物体的深度。

通过实验结果可以看出,FCOS3D++的mAP和NDS都超越了前辈FCOS3D。

3D目标检测算法调研FCOS/FCOS3D/FCOS3D++算法介绍相关推荐

  1. 【单目3D目标检测】FCOS3D + PGD论文解析与代码复现

    文章目录 前言 FCOS3D 概述 主要创新点 主要框架结构 回归目标 损失函数 推理过程 2D引导的多层3D预测 2D高斯分布的3D中心度 实验设置 源码复现 PGD 概述 主要创新点 深度估计 主 ...

  2. 史上最全综述:3D目标检测算法汇总!

    来源:自动驾驶之心 本文约16000字,建议阅读10+分钟 本文将演示如何通过阈值调优来提高模型的性能.本文的结构安排如下:首先,第2节中介绍了3D目标检测问题的定义.数据集和评价指标.然后,我们回顾 ...

  3. 一文尽览 | 基于点云、多模态的3D目标检测算法综述!(Point/Voxel/Point-Voxel)

    点击下方卡片,关注"自动驾驶之心"公众号 ADAS巨卷干货,即可获取 点击进入→自动驾驶之心技术交流群 后台回复[ECCV2022]获取ECCV2022所有自动驾驶方向论文! 目前 ...

  4. 室内环境下的3D 目标检测调研

    任务: 调研室内场景下基于单帧图像的3D目标检测的研究情况. 思路: 首先了解相关数据集,benchmark,在数据集的基础上比较不同算法. 1. 室内场景的3D数据集 sunrgbd:室内场景,3D ...

  5. 3D单目(mono 3D)目标检测算法综述

    layout: post title: 3D单目(mono 3D)目标检测算法综述 date: 2021-01-22 22:08:39.000000000 +09:00 categories: [算法 ...

  6. CVPR2020论文介绍: 3D 目标检测高效算法

    CVPR2020论文介绍: 3D 目标检测高效算法 CVPR 2020: Structure Aware Single-Stage 3D Object Detection from Point Clo ...

  7. 基于激光雷达点云的3D目标检测算法—端到端多视图融合

    点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 作者丨Rubicon007@知乎 来源丨https://zhuanlan.zhihu.com/p/44 ...

  8. 地平线机器人提出Anchor free、NMS free的3D目标检测算法 | CVPR2020 Workshop

    点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 这是一篇由地平线机器人发表在CVPR2020 Workshop的文章,主要是将Anchor Free的 ...

  9. 从零实现一个3D目标检测算法(3):PointPillars主干网实现(持续更新中)

    在上一篇文章<从零实现一个3D目标检测算法(2):点云数据预处理>我们完成了对点云数据的预处理. 从本篇文章,我们开始正式实现PointPillars网络,我们将按照本系列第一篇文章介绍的 ...

最新文章

  1. Linux和Windows的遍历目录下所有文件的方法对比
  2. 世界之窗浏览器怎么隐藏收藏栏?
  3. 为什么只能sudo进mysql_解决项目中MySQL数据库执行删除语句时间太长的问题
  4. 解决VMware Tools installation cannot be started manually while Easy Install is in progress.
  5. C++函数返回值的规则
  6. 【ACM2020】少样本学习综述
  7. 安卓开发中Theme.AppCompat.Light的解决方法
  8. 基于MATLAB的汽车出入库计时系统 _matlab课程设计
  9. Android 获取毫秒时间戳
  10. 科学电子计算机百分数怎么弄,计算器上的百分比怎么用
  11. 你要问我应用层?我就和你扯扯扯
  12. The OpenGL® Shading Language, Version 4.60.7 翻译第一章
  13. win10 who owns this pc? My organization I own it
  14. BZOJ - 3687
  15. python while遍历字符串_零基础学Python:while循环和for遍历
  16. 看我如何偷取别人的云储币(Siacoin)
  17. 基于51单片机定时器计数+74HC595移位寄存器+8位数码管时钟
  18. php八进制十六进制,php 实现进制转换(二进制、八进制、十六进制)互相转换实现代码...
  19. 最新中国地图GeoJson数据(含十段线)
  20. F429/439 SDRAM is42s16-8Mbyte

热门文章

  1. Qt编写控件属性设计器11-导入xml
  2. 基于Yolov5的玻璃瓶盖缺陷检测
  3. 【游戏开发】Lua Love2d | Love2d基础知识
  4. url传参 中文出现乱码问题 解决方案
  5. Java(HTML01)
  6. 企业危机公关处理基本原则是什么?
  7. 时尚杂志女装搭配很好看 学好这几招不用愁
  8. 实战篇之实现 OutLook 中以 EDM 形式发送通知邮件
  9. vuex mapState的使用
  10. Windows服务器配置证书