本文工作:提出BEVDepth
在这项研究中,我们提出了一种新的三维物体检测器,它具有可靠的深度估计,称为BEVDepth,用于基于摄像机的鸟瞰(camera-based BEV)三维物体检测。
现有方法: 深度信息是隐式学习的
通过对现有方法的深入分析,我们发现深度估计是在没有摄像机信息的情况下隐式学习的,使得它在创建伪点云时实际上采用的是假深度。
BEVDepth介绍:提出矫正深度子网络和快速视图变换操作。
BEVDepth利用编码的内在和外在参数获得显式的深度监督。
(1) 引入深度校正子网络(depth correction sub-network)
来抵消投影引起的深度ground truth扰动。
(2) 为了突破利用估计深度将特征从图像视图投影到BEV中的速度瓶颈,还提出了一种快速的视图变换操作(a quick view-transform operation)
。 此外,BEVdepth可以很容易地扩展与多帧输入。
实验结果:高准确度和高效率
BevDepth在具有挑战性的Nuscenes测试集上实现了新的最先进的60.0%NDS,同时保持了高效率。 相机与激光雷达的性能差距首次大幅缩小在10%NDS以内。
研究现状:基于图像的像素级深度估计
基于摄像头的3D物体检测由于其高效率和丰富的语义信息,引起了人们的极大兴趣,特别是在自动驾驶领域。最近的基于视觉的技术(Bevdet, CaDDN,LSS)主要依赖于给定来自众多相机的图像的像素级深度估计。然后添加视图转换子网(view-transform sub-network),通过利用相机的内参和外参,将特征从基于Image视图投影到基于BEV的视图中。尽管这些基于深度的3D探测器很受欢迎,但很自然地会问:这些探测器内深度估计的质量和效率如何?它是否满足精确有效的3D物体检测的要求?
本文工作:把预测深度替换成由点云生成的ground-truth的深度
在本文中,我们首先提供了深度估计的定量和定性分析。BEVDet 的实际深度和预测深度之间的相关性如图 1(a) 所示。虽然3D检测的结果是可观的,但我们发现深度估计的准确性令人惊讶地不足。这种较差的深度感知激发了我们研究更好的深度对3D检测的影响。因此,我们将视图转换期间BEVDet中的预测深度替换为点云生成的深度地面实况。图1(c)中的结果表明,采用地面实况深度可使mAP和NDS分别提高18.8%和18.2%。此外,转换误差从 0.750 大大减少到 0.393。这种现象揭示了中等深度的质量是提高多视角三维物体检测的关键。
图1和图2分别表示的是BEVDet和BEVDepth在预测深度和真实深度之间的相关性。图3表示的是性能提升的效果图
经验:隐式深度监督的准确度低,且基于深度的检测器检测速度更慢。
基于深度的3D探测器的回忆(Bevdet, CaDDN,LSS),我们有以下经验知识:
基于视觉的三维检测的目标是预测物体的三维包围盒。 这是一个不适定的问题,因为从单目图像中估计物体的深度具有内在的模糊性。 即使多视点摄像机可用,在没有重叠视点的区域估计深度仍然是一个挑战。 因此,深度建模是基于视觉的三维检测的关键组成部分。
研究的一个分支直接从2D图像特征预测3D检测框。 二维探测器,如CenterNet,可用于
对检测头进行微小改动的3D检测。 M3D-RPN提出了深度感知卷积层来增强空间感知。D4LCN使用深度映射来指导动态核学习。 通过将三维目标转换到图像域,FCOS3D预测对象的2D和3D属性。 此外,PGD呈现几何形状关系图,以促进三维目标检测的深度估计。 DD3D表明深度预训练可以显著改善端到端的三维检测。
另一项工作是预测三维空间中的对象。 将2D图像特征转换到3D空间的方法有很多。 一种典型
的方法是将基于图像的深度图转换成伪激光雷达来模拟激光雷达信号。 图像特征也可用于生成3D体素或正交特征图(orthographic feature map)。 LSS提出了一种显式预测深度分布并将图像特征投影到鸟瞰视图(BEV)上的视图变换方法,该方法已被证明适用于三维目标检测。 Bevformer使用局部关注和网格形状的BEV查询执行2D到3D转换。 继DETR, DETR3D使用变形金刚和对象查询检测3D对象,以及Petr通过引入3D位置感知表示进一步提高性能。
由于深度估计的准确性,基于激光雷达的三维检测方法经常被应用于自动驾驶感知任务中。
Voxelnet对点云进行体素化,将其从稀疏体素转换为密集体素,然后在密集空间中提出包围盒来帮助卷积时的索引。 SECOND提高KITTI数据集的性能通过引入一种更有效的结构和基于Voxelnet的GT抽样技术。 稀疏卷积也用于SECOND加快速度。 PointPillars使用Pillars而不是3D卷积过程编码点云,使其快速但保持良好的性能。 CenterPoint提出了一扩展CenterNet。在Nuscenes数据集上实现了高性能和Waymo开放数据集。PointRCNN不同于上面讨论的基于网格的方法,它直接从点云创建建议。 然后利用激光雷达分割来识别建议的前景点,并在第二阶段产生包围盒。使用Hough投票收集点特征,然后从簇中提出包围盒。 基于网格的方法由于其密集的特征表示,速度较快,但丢失了原始点云的信息;而基于点的方法可以连接原始点云,但在定位每个点的邻居时效率较低。 PV-RCNN是Shi等人提出的。 为了保持效率,同时允许点特征的可调接受野。
深度预测是单目图像解译的关键。采用一种回归方法,利用扩展卷积和场景理解模块来预测图像的深度。 单深度利用视差和重建预测无监督深度。MonodePth2使用深度估计和位姿估计网络的组合来在单个帧中预测深度。一些方法通过构造成本-体积来预测深度。MVSNET第一次将成本-体积法引入深度估算领域。 基MVSNET[34], RMVSNet使用GRU来降低内存开销36]添加CRF模块,级联MVSNET将MVSNET更改为级联结构。 采用多尺度融合生成深度预测,并引入自适应模块,在提高性能的同时降低内存消耗。 将单视角图像与多视角图像融合,并引入深度采样以降低计算量。
BEVDepth的两大工作:
(1) 提出了鲁棒的 Explicit Depth Supervision
(显式的深度监督) :通过深度矫正和基于摄像机感知的深度预测。
(2)提出了Efficient Voxel Pooling
(高效的体素池化) 去进一步提高BEVDepth的速度。
BEVDepth的框架图如下:
总体框架(Overall Architecture):
BEVDepth 把LLS中的用于分割的检测头,替换成CenterPoint中用于3D目标检测的检测头。主要包括了4个部分:
1) Image Encoder: 从多张图片中提取2D的特征 F 2 d F^{2d} F2d
图像编码器采用的是ResNet。
提取出的2D特征表示: F 2 d = { F i 2 d ∈ R C F × H × W , i = 1 , 2 , … , N } F^{2 d}=\left\{F_i^{2 d} \in \mathbb{R}^{C_F \times H \times W}, i=1,2, \ldots, N\right\} F2d={Fi2d∈RCF×H×W,i=1,2,…,N}
其中 W , H , C F W,H, C_F W,H,CF 分别表示特征的宽、高和通道数。
2) Depth Net : 从 F 2 d F^{2d} F2d估计深度 D p r e d D^{pred} Dpred。
从 F 2 d F^{2d} F2d估计出的深度表示: D pred = { D i pred ∈ R C D × H × W , i = 1 , 2 , … , N } D^{\text {pred }}=\left\{D_i^{\text {pred }} \in \mathbb{R}^{C_D \times H \times W}, i=1,2, \ldots, N\right\} Dpred ={Dipred ∈RCD×H×W,i=1,2,…,N}
其中 C D C_D CD 表示离散的深度区间的编号。
3) View Transformer : 把2D的特征 F 2 d F^{2d} F2d映射到3D特征 F 3 d F^{3d} F3d,并进行池化操作得到基于BEV的特征 F b e v F^{bev} Fbev
4) 3D Detection Head : 预测类别,3D检测框以及其他属性信息。
显式深度监督(Explicit Depth Supervision):
R i ∈ R 3 × 3 R_i \in \mathbb{R}^{3 \times 3} Ri∈R3×3 和 t i ∈ R 3 t_i \in \mathbb{R}^3 ti∈R3 分别表示旋转和平移矩阵,把图像从自车坐标系转变成第 i i i个摄像机的坐标系下。
K i ∈ R 3 × 3 K_i \in \mathbb{R}^{3 \times 3} Ki∈R3×3 表示第 i i i 个摄像头的内参。
使用从点云数据 P P P中生成的真实值深度值 D g t D^{gt} Dgt 来监督深度预测值 D p r e d D^{pred} Dpred。
P i i m g ^ ( u d , v d , d ) = K i ( R i P + t i ) P_i^{\hat{i m g}}(u d, v d, d)=K_i\left(R_i P+\boldsymbol{t}_i\right) Piimg^(ud,vd,d)=Ki(RiP+ti)
接下来,可以进一步转换成2.5D图像下的坐标 P i i m g ( u , v , d ) P_i^{img}(u,v,d) Piimg(u,v,d), 其中 u u u和 v v v 表示的在像素坐标系下的坐标。如果某个点云在2.5D下的投影没有落在第 i i i个视图中,那么我们就直接忽视它。
为了对齐被投影的点云和预测的深度,我们对 P i i m g P_i^{img} Piimg使用min pooling 和 one hot 这两个操作。并把这两个操作统称为 ϕ \phi ϕ。因此, D i g t D^{gt}_i Digt 的生成公式如下:
D i g t = ϕ ( P i i m g ) D_i^{g t}=\phi\left(P_i^{i m g}\right) Digt=ϕ(Piimg)
我们采用Binary Cross Entropy (二元交叉熵)
深度矫正(Depth Correction):
由于自车的剧烈运动,相机的校准参数 R R R和 t t t 有时可能不准确。导致 F 2 d F^{2d} F2d和 D g t D^{gt} Dgt 在空间上无法对齐。当DepthNet的感受野受到限制时,错误对齐问题变得更加棘手。 因此,我们提出了一个深度校正模块来缓解这个问题。
Depth Corretion 通过增加DepthNet的感受野来解决错位问题,而不是根据自车扰动调整 D G T D^{GT} DGT具体来说,在DepthNet中,我们将多个残差块叠加在一起,其后连接着Deformable Conv。
受惠于感受野的改善,错位深度GT能够注意到到正确位置的特征。
Depth network 的框架图: 其中Context Feature 直接通过Image Feature中提取出来。一个类似于SE的层用来聚合image feature ,从而更好的预测深度。
相机感知深度预测(Camera-aware Depth Prediction):
摄像机感知深度预测的设计提高了模型的深度预测能力。 然而,根据经典的相机模型,估
计像素深度与相机的内参相关联,这意味着有必要将相机的内参建模到深度网络中。 当摄像机可能具有不同的FOV(例如,Nuscenes DataSet)时,这在多视图3D数据集中尤其重要)。 因此,为了提高估计深度 D p r e d D^{pred} Dpred的预测质量,我们建议利用相机内参作为DepthNet的输入之一。
具体来说,首先使用MLP层将相机内部的尺寸放大到特征的尺寸。 然后,它们被用于通过Squeeze-Excitation (SE)来重新加权图像特征 F i 2 d F_i^{2d} Fi2d。最终,我们联系相机的内参和外参来帮助DepthNet 注意到 F 2 d F^{2d} F2d 的在自车坐标系下的空间位置信息。
ψ \psi ψ 表示原有的DepthNet, 那么整体的基于相机感知的深度预测公式如下:
D i pred = ψ ( S E ( F i 2 d ∣ M L P ( ξ ( R i ) ⊕ ξ ( t i ) ⊕ ξ ( K i ) ) ) ) , D_i^{\text {pred }}=\psi\left(S E\left(F_i^{2 d} \mid M L P\left(\xi\left(R_i\right) \oplus \xi\left(\boldsymbol{t}_i\right) \oplus \xi\left(K_i\right)\right)\right)\right), Dipred =ψ(SE(Fi2d∣MLP(ξ(Ri)⊕ξ(ti)⊕ξ(Ki)))),
其中 ξ \xi ξ 表示Flatten操作。
pseudo-lidar 也使用了camera-awareness, 他们根据摄像机的内参对回归目标进行缩放,使得他们的方法很难适应具有复杂摄像机设置的自动化系统。 另一方面,我们的方法在DepthNet的内部对相机参数进行建模,以提高中间深度的质量。 受益于LSS的解耦特性[3],摄像机感知深度预测模块与检测头隔离,因此无需改变这种情况下的回归目标,从而具有更大的扩展性。
高效的体素池化(Efficient Voxel Pooling):
Voxel Pooling 用来把多视角的3D特征 F 3 d F^{3d} F3d聚合成统一的基于BEV的特征 F b e v F^{bev} Fbev。具体来说,它把ego space 均匀的划分成网格,然后落在同一个BEV特征图中网格的平截头特征累加在一起。 为了实现这个操作,LSS采用了“cumsum trick”, 先基于BEV 网络编号对所有的平截头特征进行排序,然后执行累加和操作,最后再相减。
但是这样的操作会导致额外的计算,因为需要排序大量的BEV网格。除此之外,这个方法中用到的前缀和操作是顺序进行的,非常低效。这些缺点会影响我们检测器的运行效率。有些人可能会通过并行操作来加速前缀和的计算效率,但是我们提出了一个更简单的解决方案,充分利用了GPU设备的巨大并行性,称为高效体素池(Efficient Voxel pooling)。
Efficient Voxel Pooling 图示: 对于每一个点,对应一个线程。每个线程把相关联的点特征添加到BEV特征的对应位置。
如上图所示,我们的主要思想是为每个截头体特征分配一个CUDA线程,该线程用于将该特征添加到相应的BEV网格中。
在这一节中,我们首先介绍我们的实验设置。 然后,进行了大量的实验来验证我们提出的
组件的效果。 最后与其他先进的基于相机的三维检测模型进行了比较。
数据集和度量(Dataset and Metrics)
nuscenes数据集是一个大规模的自动驾驶基准,由六个摄像头、一个激光雷达和五个雷达提供数据。 该数据集中有1000个场景,分别分为700个、150个和150个场景进行训练、验证和测试。 对于三维检测任务,我们报告了Nuscenes检测得分(NDS)、平均平均精度(MAP)以及平均平均平移误差(MATE)、平均平均尺度误差(MASE)、平均平均方位误差(MAOE)、平均平均速度误差(MAVE)、平均平均属性误差(MAE)五个真阳性(TP)指标。对于深度估计任务,我们遵循前人工作的标准评估协议报告标度不变对数误差(SILOG)、平均绝对相对误差(ABS REL)、均方相对误差(SQ REL)、平均Log10误差(LOG10)和均方根误差(RMSE)来评价我们的方法。
实现细节(Implementation Details)
实现细节除非另有说明,否则我们使用Resnet-50作为图像主干,图像大小被处理为256*704。
我们采用了图像数据的随机剪切、随机缩放、随机翻转和随机旋转等增强方法,也参考BevDet, 我们采用了BEV数据的随机缩放、随机翻转和随机旋转等增强方法。 我们使ADAMW作为优化器,学习速率设置为2e-4,批量大小设置为64。 对于消融研究,所有实验都进行24个周期的训练,而不使用CBGS策略。 与其它方法相比,BEVDepth采用CBGS进行了20个周期的训练。 摄像头感知的DepthNet被放置在功能级别,步幅为16。
显示深度监督和深度矫正(Explicit Depth Supervision and Depth Correction)
基于相机的注意力(Camera-awareness)
高效体素池化(Efficient Voxel Pooling)
多帧融合(Multi-frame Fusion)
如图所示 8给出了摄像机空间和BEV空间的结果。 从绿色矩形标记的样本中,我们可以看
到我们的BEVDepth在BEV定位比基线方法表现得更好。 此外,用红圈标记的样本没有被注释,但仍然被检测到,证明了BevDepth在远距离目标检测方面的能力。
BEVDepth 和 基准线的对比。绿色点框:标记BEVDepth生成更准确的定位信息。红色点圈:表示基线和GTl漏掉的样本,但仍然通过我们的方法可以检测到。
针对三维目标检测任务中的深度预测问题,提出了一种新的网络结构BEVDepth。 通过引入深度监控的深度校正模块,BevDepth能够感知摄像机干扰并产生鲁棒的深度预测。BEVDepth通过结合视觉属性和相机规格获得预测可信深度的能力。 此外,BEVDepth还使用了基于点的帧融合模式,通过融合前一帧的数据来丰富当前帧中的信息,这有助于预测速度和深度。 此外,我们提出了高效的体素池,完全避免了索引排序,并利用了GPU的并行性。 在NUSCENES上的实验结果表明了该方法的有效性和在实际应用中的潜力。
BEVDepth: Acquisition of Reliable Depth for Multi-view 3D Object Detection