点击上方蓝字谈思实验室
获取更多汽车网络安全资讯
01
为什么要在bev视角下做感知
对于纯视觉的感知来说,准确地测距是最关键也是最难的问题。对单目测距来说,这是一个病态问题,对于图像中的物体,难以判断它是一个远处的大目标,还是一个近处的小目标。例如下图的场景,以我们的经验(对于车、人和建筑物尺度的大致判断)来说,镜头离道路上的车大概有几米到十几米的距离,但细看会发现这是一个仿真场景,假如人和车都是玩具的仿真,只有十几厘米高,那这个距离也就只有几十厘米而已了。
解决这个问题的一个方法是使用双目测距。传统方法是对双目进行严格的标定,利用特征点匹配+对极几何进行计算,但这种方法计算量很大,且严重依赖于标定质量,同时基线的长度限制了测距的范围,所以实际应用有较大的局限性。目前常用的视觉3D检测主要有以下两种方法:
02
基于视觉几何的方法
这种方法依赖很多假设和先验知识:
假设1:地面平坦,没有起伏和坑洞
假设2:目标接地,且可以看到接地点
先验1:目标的实际高度(或宽度,可以通过分类的方式与经验平均值回归得到),或照相机高度
先验2:相机的焦距
满足了以上假设并且已知相关先验,即可通过2D检测的结果,经过相似三角形关系,估算目标大致深度(如下图,深度Z=H *f / h),再通过内参转换,估算出3D box的位置。
视觉几何深度估计
显而易见,这种方法局限性很多,首先两个假设和先验知识就很难获取,其次对于多视角目标检测来说,同一个目标可能同时出现在两个视角中,且都不完整,对其做拼接也非常困难。再次这种方法还依赖于2D检测的结果,即使检测框很准,由于目标角度的千变万化,也难以表征目标在2D空间中的实际高度,所以还需要大量的后处理工程进行优化。
03
基于深度估计的方法
即本文开头提到的方法:先得到伪激光雷达点云,再使用点云3D检测的方法,这类方法最大问题就是严重依赖于深度估计的结果,不能进行端到端的调优。由于深度估计方法的潜能目前并未挖掘充分,所以也对结果产生了局限性。
基于以上问题,具有上帝视角的鸟瞰图bird-eye-view(bev)是一个很好的解决方案。关于如何获取bev,传统方法是进行逆透视变换(IPM),即通过多相机的内外参标定,求得相机平面到地平面的单应性矩阵,实现平面到平面的转换,再进行多视角图像的拼接。效果如下:
IPM示例
IPM相关的技术已比较成熟,并广泛运用在自动泊车等场景中,但也有不小的局限性,比如同样依赖于标定的准确性且内外参必须固定,而且从原理上说,IPM只能表征地平面的信息,有一定高度的目标都会在图片上产生畸变,所以同样需要假设地面平坦、目标接地,这就意味着难以应用在较远距离的感知任务中。
所以目前对bev大量的研究都是基于深度学习的方法。而且随着近年来transformer的横空出世,深度学习网络对于全局特征的学习和多特征融合都有了相比CNN的显著提升,所以bev是transformer非常合适的应用场景。下面介绍的一系列模型几乎都以transformer作为基础架构。
04
自底向上BEV特征建模的最初尝试:LSS(Nvidia, 2020)[1]
[1]Lift, Splat, Shoot: Encoding Images from Arbitrary Camera Rigs by Implicitly Unprojecting to 3D[1]
代码:GitHub - nv-tlabs/lift-splat-shoot: Lift, Splat, Shoot: Encoding Images from Arbitrary Camera Rigs by Implicitly Unprojecting to 3D (ECCV 2020)[2]
LSS是早期的比较直接的尝试,即先估计每个像素的深度,再通过内外参投影到bev空间。只是因为不存在深度标签,这里并没有直接回归深度值,而是对每个像素点预测一系列的离散深度值的概率(文中是1-50m),概率最大的深度值即为估计结果。如下图所示:
转换示例
此时我们可以得到深度分布特征α和图像特征c,将二者做外积,可以得到一个视锥特征(frustum-shaped point cloud),如下图左二所示(因为近大远小的特点)。这一步作者称为lift。
LSS框架
得到多视角的视锥特征后,可以通过外参将视锥投影到bev平面。在bev平面下,每个存在高度信息的像素称为体素(voxel),具有无限高度的voxel称为pillar[2]。我们将每个视锥的每个点分配给最近的pillar,再执行sum pooling,得到CxHxW的bev特征。作者采用cumsum trick来提升sum pooling 效率,并把这一过程称为splat.
[2]Pointpillars: Fast encoders for object detection from point clouds[3]
有了bev特征后,就可以很方便的进行3D检测、语义分割、预测和规划等一系列任务,作者把这个过程称为shoot。LSS方法可以得到稠密的bev特征,缺点是由于每个像素都预测了一系列深度概率值,计算量相对较大。LSS方法为bev感知提供了一种重要的思路。
05
自底向上的BEV检测思路BEVDET[2]和感知预测一体框架BEVerse[3](鉴智机器人,2022)
[2]BEVDet: High-Performance Multi-Camera 3D Object Detection in Bird-Eye-View[4]
[3]BEVerse: Unified Perception and Prediction in Birds-Eye-View for Vision-Centric Autonomous Driving[5]
BEVdet是近期出现的基于LSS的自底向上建立BEV的方法。如下图所示,先对多视角图像进行特征提取(Image-view Encoder),再通过基于LSS的视角转换(View Transformer)将多视角特征投影到bev空间下,再用和第一步类似的backbone对bev特征进行编码,最后进行目标检测。这种方法虽然在LSS这一步存在不少冗余的计算,但好处是得到了显式的bev特征,可以做bev视角下的特征提取和数据增强,并且可以使用任意的目标检测头。
BEVDet
在真值匹配和后处理上,BEVdet也偏向传统,使用了NMS,但提出了scale-NMS,即对不同类别的目标进行不同尺度的缩放,来做更符合客观场景的目标框过滤,如下图所示。
scale-NMS
鉴智的另一篇工作是BEVerse,加入时序序列构建了感知预测一体的框架。基本思路是对于一个长度为N的时序序列,每一帧分别做特征提取和基于LSS的视角转换,再经过BEV时空编码器融合空间域和时域的多种特征,最后经过多任务解码器做目标检测、建图和运动预测等下游任务。
BEVerse
感知预测一提的框架最初是从Wayve的Fiery[11]发展而来,同样是基于LSS视角转换。Fiery主要步骤如下:
[4]FIERY: Future Instance Prediction in Bird’s-Eye View from Surround Monocular Cameras[6]
代码:FIERY: Future Instance Prediction in Bird’s-Eye View from Surround Monocular Cameras[7]
从1到t时刻,参照LSS思路预测每个点的深度分布并投影到bev空间
根据ego-motion将1……t-1时刻特征都转换到t时刻(Spatial Transformer module S)
用3D卷积学习时序特征
根据未来的标签y,预测当前和未来的特征分布
支撑未来的实例分割和预测任务
Fiery框架
BEVerse改善了Fiery的内存消耗,提出了高效生成未来状态的迭代流。因为博主对轨迹预测的研究不是很深就不详述了,具体可参照黄浴大佬的博客:
黄浴:BEVerse:自动驾驶视觉为中心的BEV统一感知和预测框架[8]
06
自顶向下稀疏bev 3D检测范式:从DETR[5]到DETR3D[6](麻省理工、丰田、理想、清华等,2021)
[5]End-to-End Object Detection with Transformers[9]
[6]DETR3D: 3D Object Detection from Multi-view Images via 3D-to-2D Queries[10]
代码:GitHub - WangYueFt/detr3d[11]
LSS方法进行透视视角到bev视角转换是非常直接的,但会带来较高的计算复杂度。而且仅从目标检测这个任务来说,稠密的特征表达其实是非必要的,因为最终目标是得到少量的target bbox。又因为我们有transformer这个大杀器,让自顶向下的稀疏bev表示成为可能。DETR3D便是在bev空间中使用transformer进行自顶向下特征提取的新范式。
介绍DETR3D之前先要介绍DETR[5](facebook,2020)和deformable DETR[7](商汤科技,2021)。
[7]Deformable DETR: Deformable Transformers for End-to-End Object Detection[12]
DETR是vision transformer用在目标检测的开山之作,首先应用在2D检测。它将目标检测任务视为一个图像到集合的问题,即给定一张图像,模型的预测结果是一个包含了所有目标的无序集合。这打破了以faster-rcnn为代表的anchors和非极大值抑制NMS机制,大大简化了目标检测pipeline。
[8]Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks[13]
DETR
如上图所示,DETR的主要框架是首先经过CNN提取特征,再通过transformer encoder进行全局特征编码,得到K和V再通过预设的object queries,与上一步获取的K和V做cross-attention,更新object queries,再经过FFN(feed forward network)得到目标分类和bbox回归结果。这里的object queries代表每一个潜在的目标检测框,个数即为最大支持的检测数目,省去了预设大量anchors的步骤。作者使用的初始化方式是先进行全0初始化,再加上位置编码,也就是只保留位置信息,与检测框的物理意义一致。
DETR另一个创新之处就是用匈牙利匹配算法(Hungarian algorithm)代替NMS机制,在训练阶段计算损失函数之前,先得到一对一的最大匹配,而不是一对多的冗余匹配,在推理阶段也直接得到最终结果,不需要执行NMS,实现了真正的端到端检测,显著提高了效率。
Deformable DETR是针对DETR计算量大、收敛较慢、难以作用于高分辨率图像等问题,基于可变卷积[9]思想提出了一种可变注意力机制(deformable attention ):
原生注意力机制
可变注意力机制
[9] Deformable convolutional networks[14]
可变注意力机制避免了原生注意力机制中每个query和所有图像特征之间的交互计算,而是引入了参考点(reference points)和采样点(sampling points),每个object query对应一个参考点,代表目标的初始位置,它只和K个采样点做交互计算,大大节省了计算量,其中参考点和采样点的位置同样是可学习的,推理的结果不是bbox的绝对坐标,而是与参考点坐标的offset,使推理结果与decoder attention直接相关,有利于模型加速收敛。另外,deformable DETR还使用cross attention进行多尺度特征之间的信息交互,不需要FPN,并用scale-level embedding来区分不同尺度,对于小目标的检测效果提升显著。deformable DETR后续也成为一种重要的范式。
DETR
本节要介绍的DETR3D即是建立在DETR和deformable DETR的基础上,将2D检测推广到bev 3D检测的经典模型。
由于bev特征需要从多视角图像特征融合得到,所以需要先对多视角图像提取特征,文中用的是Resnet+FPN(没有transformer encoder模块)。Decoder模块参照deformable DETR的思路,在bev空间预设多个3D的object queries,并从object queries经线性映射得到3D的参考点(reference points)。下一步是3D的参考点如何与2D的特征做交互,文中利用了内外参的先验信息,将3D reference points投影到各个视角的图片上。由于多相机之间存在共视区域和盲区问题,一个参考点可能投影到多个视角,也可能一个视角也投不到,所以作者加了一个二进制的mask代表当前视角是否被投影成功。
接下来是做cross-attention,看代码后发现,DETR3D的做法与DETR和deformable DETR都有一些不同,object queries不是和DETR那样与全图交互,也不是和deformable DETR那样先从object queries预测一些参考点,再预测一些以参考点为基准的采样点,然后和采样点的特征交互,而是直接和3D参考点投影的2D参考点处的特征交互(经过双线性插值),相当于交互的特征个数=object queries个数,比deformable DETR还要少(每个object query预测K个采样点,默认是4个),应该说是更稀疏的deformable DETR了。后面bbox推理值和真值的匹配和损失函数的计算和DETR是一样的。
比较三者的代码还会发现,DETR的transformer阶段是标准的attention计算方式,包含Q,K,V的计算,而deformable DETR和DETR3D的K和V是合二为一的,与Q进行交互。这里可能也是为了节省计算量,或者因为已经进行了特征筛选,不需要再做多维度的特征提取。
07
DETR3D引入3D位置编码:PETR[10]和PETRv2[11](旷世科技,2022)
[10]PETR: Position Embedding Transformation for Multi-View 3D Object Detection[15]
[11]PETRv2: A Unified Framework for 3D Perception from Multi-Camera Images[16]
代码:GitHub - megvii-research/PETR: [ECCV2022] PETR: Position Embedding Transformation for Multi-View 3D Object Detection[17]
PETR论文指出,DETR3D虽然可以得到比较好的性能,但是存在三个问题:
1.bev空间与多视图之间的信息交互依赖于3D参考点估计的准确性,如果估计不准,可能无法投影到有效区域内,无法与2D图像进行交互;
2.只进行了object queries与3D参考点投影的2D点的特征之间的信息交互(前文提到),没有学习到全局信息;
3.由于需要采样和投影,DETR3D的pipeline相对复杂,影响推理的效率。
所以,PETR摒弃了采样和投影,直接计算2D多视图对应的3D位置编码,并加到2D图像特征中,再和3D的object queries进行交互,直接对3D object queries进行更新,大大简化了pipeline。DETR/DETR3D/PETR的对比图和PETR结构图如下所示:
PETR
这里3D特征编码借鉴了DSGN[12],即将图像的视锥空间坐标(h, w, d)转到3D空间坐标(x, y, z),再进行embedding,其中d代表均匀分布的深度,从预先设定的深度范围和间隔得到。这里的3D空间指车身的bev空间,所以需要同时使用内参和外参进行转换。因为每个视角对应的视锥空间坐标都相同(只有内外参不同),所以只需要计算一次,省去了DETR对参考点的多次投影过程。
[12]Dsgn: Deep stereo geometry network for 3d object detection.[18]
得到3D特征编码后,与2D特征相加(代码中还加入了2D的正弦编码),然后与object queries做cross-attention。这里没有采样,使用的是全局attention。detection head部分与DETR相似。
PETRv2是在PETR的基础上进一步使用了时序特征、特征引导的3D位置编码和语义分割query,也是孙剑大佬离世前的项目(忧伤)。
PETRv2
在此之前,BEVformer(下文会提到)提出了使用时序bev进行特征增强和bev视角下语义分割的方案,PETRv2基于PETR的3D特征编码框架对此进行了进一步的探索。首先是增加了时序输入(如上图所示),将t-1帧的特征经过坐标转换后与t帧对齐(如图a左所示),并在batch维度与t帧拼接后输入编码器。其次,3D位置编码使用了特征引导的位置编码(FPE)(如图a右所示),而不是单纯依赖于3D空间坐标,这样可以提供深度信息。最后,增加了语义分割分支,将图像分割为一系列patch,编码得到segmentation queries,再与FPE得到的K,V进行交互,经过分割头得到分割结果(如图b所示)。PETRv2的时空特征融合框架实现了目前最好的目标检测和语义分割性能。
a 左:t-1帧到t帧的坐标转换 右:特征引导的位置编码器(FPE)
b 语义分割分支框架
08
自顶向下稠密的BEV特征建模:BEVFormer[13] (上海AI Lab,2022)和BEVSegformer[14](纽劢科技,2022)
以上介绍的模型主要分两类,一种是自底向上(LSS为代表)的稠密BEV特征建模,一种是自顶向下(DETR3D为代表)的稀疏BEV特征建模,还有一类是自顶向下的稠密BEV特征建模,比较有代表性的是BEVFormer和BEVSegformer。
[13]BEVFormer: Learning Bird’s-Eye-View Representation from Multi-Camera Images via Spatiotemporal Transformers[19]
代码:BEVSegFormer: Bird’s Eye View Semantic Segmentation From Arbitrary Camera Rigs[20]
[14]BEVSegFormer: Bird’s Eye View Semantic Segmentation From Arbitrary Camera Rigs[21]
BEVFormer框架
BEVformer框架也是从DETR3D发展而来,也是从bev空间的3D query出发,得到参考点和采样点,再通过多相机的内外参投影到多视角2D图片上,和相应特征进行交互。但DETR3D的object queries是稀疏的,每个query代表一个可能的目标框,而Bevformer的bev queries是稠密的,大小为HWC,H,W为设定的bev特征尺度,每个query代表一个网格(grid)的查询,这样可以得到稠密的bev特征。
看代码会发现,BEVFormer的参考点和采样点的获取方式也和DETR3D有很大的不同,由于BEVFormer是稠密的,不需要额外去预测一些备选参考点,而是直接得到固定的H*W*Z个参考点坐标(Z代表每个bev pillar中设定的不同高度的参考点个数),再将所有参考点投影到N个2D视图中,得到N*H*W*Z个2D参考点,而采样点(与2D参考点的offset)是通过bev queries去预测的,每个bev query预测NZK个采样点,也就是直接从3D的query预测每个2D视图的offset。DETR3D就简单的多,直接从object queries预测N个参考点,再做多视图投影,并与多视图的2D参考点处的特征做交互,没有引入采样点。
Bevformer另一个创新之处是时序特征融合(temporal self-attention),即用前一帧和当前帧的bev特征进行交互,获取当前帧缺失的时序特征,用来解决当前帧目标遮挡或者不稳定的问题,如下图所示。这里前一帧的特征根据已知的ego-motion转换为与当前帧的特征点位置对齐,但由于存在动态目标,难以建立前后两帧之间动态目标的特征联系,所以本模块采用的deformable attention中采样点的坐标偏移∆p与原生的deformable attention略有不同,是将query和上一帧的bev特征B'拼接后再进行采样点的预测。
BEVFormer效果示意
加入时序信息的deformable attention
上文的PETRv2也利用了时序特征,与BEVformer对比可参考PETR与DETR3D的对比,都是使用较固定的3D位置编码(PETRv2采用特征引导的位置编码)代替了内外参投影,在效率上有一定的提升,但PETRv2仍然没做稠密的bev特征建模,而是针对目标检测和语义分割单独设置不同的queries。另外参照BEVDet(自底向上的稠密bev特征建模)的优点,稠密的bev特征可以进一步进行特征提取和数据增强,而且更容易支持多种检测、分割、预测头,但损失一定的开销,所以各有优劣。
另一个相似的模型是BEVSegformer,也是通过bev空间稠密的bev queries与多视角2D图像特征进行信息交互,但主要的不同点在于,BEVformer是通过固定的3D 参考点经过内外参投影到各个相机视角,而BEVSegformer不依赖于3D坐标先验和多相机的内外参,直接从bev query得到多视角的2D参考点和采样点,多视角时间参数不共享,也就是说BEVSegformer整个pipeline都是可学习的,没有内外参投影过程,可以作用于任意相机。整体框架和解码器可以参见下图。
BEVSegformer框架
09
BEV多模态特征融合大杀器:BEVFusion[15](MIT,2022)和FUTR3D[16](复旦、MIT、理想、清华等)
由于任何传感器都具有局限性,所以目前自动驾驶到落地量产阶段必须要做的就是多传感器融合。对于激光雷达和摄像头两种重要的传感器来说,传统的特征融合方法主要有两种:Lidar-to-camera和Camera-to-lidar。然而,前者损失了lidar的几何结构信息,难以用于3D目标检测等任务,后者损失了camera的语义信息,难以用于语义分割等任务,如下如所示。经过本文的介绍大家可以想到,将多种传感器都投影到bev空间是一个有效的特征融合方式,可以同时保留lidar的几何结构信息和camera的语义信息。BEVFusion[15]即是一种有效的多模态特征融合框架。
特征融合方式对比
[15]BEVFusion: Multi-Task Multi-Sensor Fusion with Unified Bird’s-Eye View Representation[22]
代码:GitHub - mit-han-lab/bevfusion: BEVFusion: Multi-Task Multi-Sensor Fusion with Unified Bird's-Eye View Representation[23]
BEVFusion框架非常直观,照相机和激光点云数据经过各自的encoder进行特征编码后,camera特征采用LSS的自底向上的方法进行bev视角转换,lidar特征直接沿着z轴展平即得到bev特征,再将二者特征拼接后输入BEV encoder进行BEV特征编码,即得到融合后的BEV特征,来支持下游多任务。
BEVFusion框架
作者还做了效率的提升,提出由于camera产生的稠密伪点云规模较大(经lift处理后规模远远大于lidar特征),原始Bev pooling操作耗时占整个推理耗时的80%,所以采用预计算和GPU并行化提高bev pooling效率,实现bev转换时延从500ms减少到12ms(仅占整个推理过程的10%)。预计算指的是由于只要相机内外参一定,产生的3D伪点云坐标就是一定的,所以可以一次计算好并保存下来,不需要多次计算。GPU并行化简单地说是为每个bev grid开启一个线程进行并行处理。
另一个BEV特征融合框架FUTR3D[16]是从DETR3D发展而来的(同一批作者),采用自顶向下的方式进行特征融合。
[16]FUTR3D: A Unified Sensor Fusion Framework for 3D Detection[24]
FUTR3D
FUTR3D可以支持任意传感器,如2D摄像机、3D激光雷达、3D雷达和4D成像雷达等,只需要对不同的传感器配置不同的特征提取backbone即可。整体框架参照DETR3D,通过object queries得到3D reference points,再与多个传感器特征进行交互,最后同样适用匈牙利匹配的方式计算损失。感慨BEV的各种框架让原本很复杂的多视角图像特征融合、多传感器特征融合变得如此容易!
10
多种BEV框架的简单总结
由于本文介绍的多个BEV框架细节各不相同,难以区分,所以最后做一个简要的总结。
模型对比
来源:青稞智驾
精品活动推荐
更多文章
关于涉嫌仿冒AutoSec会议品牌的律师声明
一文带你了解智能汽车车载网络通信安全架构
网络安全:TARA方法、工具与案例
汽车数据安全合规重点分析
浅析汽车芯片信息安全之安全启动
域集中式架构的汽车车载通信安全方案探究
系统安全架构之车辆网络安全架构
车联网中的隐私保护问题
智能网联汽车网络安全技术研究
AUTOSAR 信息安全框架和关键技术分析
AUTOSAR 信息安全机制有哪些?
信息安全的底层机制
汽车网络安全
Autosar硬件安全模块HSM的使用
首发!小米雷军两会上就汽车数据安全问题建言:关于构建完善汽车数据安全管理体系的建议