一.introduction
目前的计算机视觉算法任务,基于输出结果是否与输入图像在同一个参考系下,可以分为两类:
• 预测结果与输入不在同一个参考系:分类
• 预测结果与输入在同一个参考系:目标检测、语义分割、全景分割
从这个角度来看,基于BEV的自动驾驶感知算法,属于前一个类别,即预测结果与输入不在同一个参考系,这个最终得到的BEV结果属于本体车辆参考系。一般的做法是,通过算法模型,把属于多个参考系下的多模态数据,进行融合预测,形成在BEV参考系下的预测结果,如下图所示。
![](https://i-blog.csdnimg.cn/blog_migrate/16b23eab8cfeddd0a6e92ce2a177935a.png)
针对多参考系转换问题,又引出了很多研究方法。例如,可以扩展传统单视图的范式,把它扩展到多视图模式上。具体来说,针对来自n个相机的图像数据,我们使用一个单视图检测器,针对每个相机的每张图像数据进行检测,然后将检测结果根据对应相机的内外参数,转换到车辆本体参考下,这样就完成了多视图的检测。
但是这样的简单后处理方法是有问题,比如,我们可能想要通过训练结果反馈,进行反向传播,并进一步调整对应相机的输入,这一步是无法完成,因为上面的转换是单向的,也就是说,我们无法反向区分不同特征的坐标系来源,因此我们无法轻易的使用一个端到端的模式来训练改善我们的自动感知系统。
二.创新点
那么,本文的做法就是通过,将二维图像特征生成3D特征(这一步对应论文中的Lift操作),然后把3D特征“拍扁”得到BEV特征图(这一步对应论文中的Splat),最终在BEV特征图上进行相关任务操作(这一步对应于Shooting)。
单目目标探测器的定义是通过它们如何从图像平面到给定的三维参考系的转换建模。一种标准的技术是在图像平面中应用成熟的2D物体检测器,然后训练第二个网络将2D盒子回归为3D盒子。nuScenes基准上目前最先进的3D对象检测器使用了一种体系结构,该体系结构训练了一个标准的2d检测器,该检测器还使用一种损失来预测深度,该损失试图将由于不正确的深度引起的错误与由于不正确的边界框引起的错误分开。这些方法在3D目标检测基准上取得了出色的性能,因为图像平面中的检测排除了笼罩单目深度预测的基本模糊云。
最近取得经验成功的一种方法是分别训练一个网络进行单目深度预测,另一个网络分别进行鸟瞰检测,这些方法被称为“伪雷达”。伪雷达取得经验成功的直观原因是,伪雷达能够训练一个鸟瞰网络,该网络运行在检测最终评估的坐标框架中,相对于图像平面,欧几里得距离更有意义,如下图所示。
从2D的图像特征获取其3D特征的表示形式,从而将各个相机从各自独立的2D图像坐标系转换到共享的3D坐标系。
![](https://i-blog.csdnimg.cn/blog_migrate/38537af5e885ee73d8af4878bbeaff77.png)
就是预测了一个深度值分布,提取的特征c,然后将两种进行外积操作,实现了增维。Splat操作则是使用了一种特殊的“求和池化”操作,实现降维。最后的Shooting,则是将预测的一组轨迹投射出来,选取最好的轨迹作为预测结果。
三.细节
![](https://i-blog.csdnimg.cn/blog_migrate/4fa3770fa296640a23d2a1520ee6c620.png)
Lift:潜在深度分布
对相机图片单独处理,将对每一个图像提取的feature map 从的2D的图像坐标系统转换成以车辆中心为原点的3D坐标系中,这个转换参数在相机之间是共享的;单目传感器融合的难点在于需要将深度信息转换为参考帧坐标,但与每个像素的depth是未知的。 本论文提出的解决方案是为每个像素生成所有可能深度的表示。(为每一个模型生成离散的深度值,模型训练阶段像素自行选择合适的深度值)。
注:怎么为每个像素定义一堆离散的深度值?因为2D图像中的每个像素点可以理解成一条世界中某点到相机中心的一条射线,现在不知道的是该像素具体在射线上位置(也就是不知道该像素的深度值)。官方代码中是这么做的:在距离相机5m到45m的视锥内,每隔1m有一个模型可选的深度值(这样每个像素有41个可选的离散深度值)。
![](https://i-blog.csdnimg.cn/blog_migrate/f3230efce242b4df5908f2e5c39bdb02.png)
图像的2D特征是维度的,也就是每一个像素点的特征都是c维的,然后每一个像素点具有d维的深度分布,点的特征就由这c维图像特征和d维深度特征联合表示,也就是每一个点的特征是一个d,c,h,w的四维向量。图像中每一个像素点对应着世界坐标中的一条射线,那么这个像素点对应的深度应该是多少呢,按照1米的距离划分格子,用概率值表示该像素的深度值处于这个1米的格子内部的概率,用一个D维的向量经过softmax来表示,D表示4-45米范围内以1米为间隔的距离,也就是 D=41,这样的话D上每个位置的值就代表了该像素处于这个深度范围的概率值。最后,得到的是一个视锥点云,这个视锥是以相机光心为中心,长为w/16,宽为h/16,高从4-45的一个立方体,然后通过相机外参将这个立方体转换到BEV视图下;之后从视锥中提取图像的feature map。
Splat: Pillar Pooling(支柱池)
目前已经得到了像素的2D像素坐标以及深度值,再加上相机的内参以及外参,即可计算得出像素对应的在车身坐标系中的3D坐标。将多个相机中的像素点投影在同一张俯视图中,先过滤掉感兴趣域(以车身为中心200*200范围)外的点。但是在俯视图中同一个坐标可能存在多个特征,这里有两个原因:
是单张2D图像不同的像素点可能投影在俯视图中的同一个位置,
是不同相机图像中的不同像素点投影在俯视图中的同一个位置,例如不同相机画面中的同一个目标。对于同一个位置的多个特征,作者使用了sum-pooling的方法计算新的特征,最后得到了200x200xC的feature,源码中C取64。
视锥点云转换到bev下后,每个点都会被分配到bev的柱子里面,这个柱子就是bev空间每个grid都对应一个[dx,dy,无限高]的立方体,这样每一个grid的特征就是在里面所有点对应的图像特征求和。
![](https://i-blog.csdnimg.cn/blog_migrate/6d1aa9d9e0c1fcb9dea9936b3d7e9a02.png)
视锥体池化累积求和技巧
该模型使用的是Pillar的累积求和池化,“累积求和”是通过bin id 对所有点进行排序,对所有特征执行累积求和,然后减去 bin 部分边界处的累积求和值来执行求和池化。无需依赖 autograd 通过所有三个步骤进行反向传播,而是可以导出整个模块的分析梯度,从而将训练速度提高 2 倍。 该层被称为“Frustum Pooling”,因为它处理将 n 个图像产生的截锥体转换为与摄像机数量 n 无关的固定维度 C × H × W 张量。
![](https://i-blog.csdnimg.cn/blog_migrate/4e5245ea7e3590c9dd39cd72c8a5b7aa.png)
Shoot: Motion Planning
Lift-Splat模型的关键是可以仅从图像角度实现端到端的运动规划,在测试时,使用推断的成本图进行规划,可以通过“拍摄”不同的轨迹。
四.测试
![](https://i-blog.csdnimg.cn/blog_migrate/4926c37e1c05fd4e5a0c5209eb0ede46.jpeg)
![](https://i-blog.csdnimg.cn/blog_migrate/f68c0431bbadba7c170cdd5e0bacdbae.jpeg)
![](https://i-blog.csdnimg.cn/blog_migrate/51dc5d330cf8536561e730cf577d738f.jpeg)
![](https://i-blog.csdnimg.cn/blog_migrate/bcbca893eb758f54f6cd3a1256729555.jpeg)
![](https://i-blog.csdnimg.cn/blog_migrate/f225cff413720a840b381fc7044371f6.jpeg)