作者 | 筱筱余歌 编辑 | 自动驾驶之心
原文链接:https://zhuanlan.zhihu.com/p/25315764268
点击下方卡片,关注“自动驾驶之心”公众号
>>点击进入→自动驾驶之心『3D目标检测』技术交流群
本文只做学术分享,如有侵权,联系删文
前言
做单目3D目标检测有2年多的时间了,最近也是处于新工作更换框架的时期,于是想浅浅聊聊目前单目3D中较为主流的两个框架:“BEV框架”和“DETR框架”。
当初推免的时候,打脸充胖子,说自己很了解目标检测,然后对大创的做的东西一顿瞎说,结果没想到导师他老人家真以为我很懂目标检测,扔给我一个3D目标检测的研究方向,当时BEV很火热,说要不你去做BEV-based 3D目标检测吧,就这样,我入了BEV+3D目标检测的超级大坑。幸亏我有先见之明把范围缩小到单目,要不然估计现在还在愁怎么毕业。额 扯远了。。
回到正题,首先介绍一下:CaDDN是第一个基于BEV的单目3D检测方法,MonoDETR是第一个将DETR拓展到单目3D检测的方法,那我们就以这俩篇为范本来做一下“BEV框架”和“DETR框架”的介绍和对比。
精力有限+才疏学浅,不到位之处还请多多指正。
基本信息
论文题目:Categorical Depth Distribution Network for Monocular 3D Object Detection
论文链接:https://arxiv.org/abs/2103.01100
代码链接:https://github.com/TRAILab/CaDDN
论文题目:MonoDETR: Depth-guided Transformer for Monocular 3D Object Detection
论文链接:https://arxiv.org/pdf/2203.13310
代码链接:https://github.com/ZrrSkywalker/MonoDETR
首先分别简要介绍一下CaDDN和MonoDETR,感兴趣的同学推荐看看原文。
单目3D目标检测——CaDDN(BEV框架)
一句话概括方法:利用相机内外参以LSS范式将单目图像特征投影至BEV空间进行3D目标检测。

CaDDN是CVPR2021的文章,在此之前,ECCV2020有篇文章:LSS (Lift, Splat, Shoot),首次提出将图像特征和深度分布通过Outer Product操作生成视锥特征,并采样(利用相机内外参)到体素空间,然后利用Voxel Pooling构建BEV特征。
CaDDN也采用了这种方式,但是CADDN的深度分布和后续的BEVDepth一样,是有监督的。CaDDN利用点云投影的稀疏深度图,经过深度补全后得到稠密的深度图,用来监督Depth Distribution Network回归的离散深度分布。
值得一提的是,CaDDN使用LID将深度范围划分为81个深度箱,来减小不准确的深度估计对于3D检测的影响,同时论文提出的“使用深度分布,而不是深度值”也是这一目的。得益于额外的深度监督和深度估计策略,CaDDN在当时直接干到了KITTI榜单单目3D检测的第一,全部三个类别(Car,Ped.,Cyc.)都是第一。
BEV框架能够让透视图像中不同尺寸的物体投影至统一尺寸表示空间(BEV空间),避免检测结构受透视关系的干扰,比如处于图像下方的车辆的像素区域比处于图像中间的车辆大,但是是否前者的实际尺寸就大于后者呢?显然不是的。实际上,BEV空间更大的作用是提供了一个共性的特征融合空间,在环视3D检测任务中,来自环视相机的不同图像由相机投影矩阵投影至同一个BEV空间进行特征融合,从而避免了视角对齐问题。单目BEV其实并没有完全发挥出BEV的优势。
当然CaDDN缺点也挺显著的:推理速度超级慢,CaDDN的backbone是deeplabv3_resnet101,超大一个,加上PV到BEV的转化和BEV的backbone,在后续与其进行对比的方法中,大部分方法都是几十毫秒,CaDDN一个明晃晃的630ms极其晃眼。
由于视锥特征和体素特征都是五维张量,这就导致基于BEV的方法很占显存,再加上现在一些新的方法喜欢用3D卷积来提取视锥或者体素的特征,对训练设备的要求会比较高,不是训练时间长就是动不动爆显存了。
再者就是BEV方法会生成空间特征:视锥空间、体素空间、BEV空间,然而大部分特征是冗余,如图所示,大部分区域的特征是不需要的,但是这些区域的特征依然参与了计算。

但是某些综述说“CaDDN不仅在训练的时候需要点云数据,并且在推理的时候仍然需要点云数据”,我寻思推理的时候不需要点云呀?训练的时候是将点云数据预先处理成稠密的深度图用来监督深度分布,推理的时候输入图像和相机参数,哪里需要输入点云数据?

某些方法在写Related Work的时候也这么说,让我感到非常奇怪。
总之BEV框架缺点确实不少,现有的一些方法也在尝试解决这些问题,但是目前来看仍然没有完全解决。TPVFormer刚出来的时候倒是让我眼前一亮,因为之前思考过如何在CaDDN的基础上采用三视图的方法来减少因高度维度的flatten导致的信息丢失,结果人家采用更强的思路和方法架构做出来了,只能感叹自己还是太菜了。
单目3D目标检测——MonoDETR(DETR框架)
一句话概括方法:利用类DETR结构结合图像特征和前景深度特征直接在透视视角回归物体3D信息。

MonoDETR刚出来的时候,我不知道为什么这个方法的效果会这么好,因为在我的认知里,深度估计的准度是单目3D目标检测的核心,同时受BEV方法的影响,我认为逐像素的深度准度是很重要的,因为车体特征在体素空间的分布跟像素深度是直接挂钩的。假设一个极端情况:一辆车的所有像素点都是一个深度值,那么投影到体素的空间的对应物体就是一个片,对应BEV的特征就是一条类长尾分布的线,很容易就跟环境融为一体了。
MonoDETR的特征图大小是2480的(原始图像一般是3751242),这意味着MonoDETR是不可能得到物体表面细致的深度的。细致的深度:借用adabins的说法,物体的属性深度,DID-M3D好像也是这个说法。实质上,MonoDETR确实不需要细致的深度,在用来监督前景深度图的深度图标签中,每一个区域(物体2D框内部区域)都只有一个深度值。
MonoDETR获得的前景深度图作用更多在于确定检测物体的像素分布范围和物体3D中心的深度值(只需要一个值)。MonoDETR预先生成一系列Query,每一个Query对应着图像中的一个检测物体,这些Query经过图像特征和前景深度特征的计算,获得每个检测物体的属性,其中包含三维信息。
MonoDETR的优点十分明显:
训练时显存消耗低,1张4090(24G) bs就能调到12,而原始的CaDDN只能是2,虽说DETR架构的模型收敛速度比BEV框架慢一些,但综合来看,MonoDETR的训练耗时比CaDDN少很多。
其次,MonoDETR的深度GT来源于3D bbox标签,这意味着MonoDETR不需要额外的深度图GT或者点云数据进行监督。同时MonoDETR在检测时不需要锚点框(anchors)和非极大值抑制(NMS),“多检测出了一些框”、“贴的太近框被抑制掉了”这些情况在MonoDETR检测时几乎不会出现,而在BEV框架下经常发生:CaDDN、CMKD、OccupancyM3D等一系列BEV-based方法都存在这个现象。
要说缺点,个人认为MonoDETR(DETR框架)对于深度信息的利用上是不如CaDDN(BEV框架)显著的,导致我们针对深度的设计很难直接起到作用,这一点将在下文中分析。
BEV框架 v.s. DETR框架(针对单目)
首先从整体框架上:
两者都是2D -> 3D的方法。BEV框架,无论是LSS架构(CaDDN)的还是Transformer架构(CIE)的,都是将图像特征提取到BEV空间,再进行检测,属于是先把特征从2D图像空间提取到3D BEV空间(BEV空间的高度信息是聚合到通道C的,虽然没有显式的高度维度,但是个人认为还是有隐式高度信息的),然后在3D BEV空间找到要检测的物体并返回物体的3D参数;DETR架构,属于是先在2D的图像空间找到物体的区域,例如MonoDETR的前景深度(2D bbox所在区域)引导的图像空间的位置,然后利用物体中心点的位置回归的深度获得一个2D -> 3D的尺度。简单来说,BEV是先2D->3D,然后找物体;DETR是先找到物体,然后2D->3D。
要说优缺点,目前来看的话,后者能够避免3D空间的大量冗余信息,只注意关键的物体的3D信息就行了。反过来思考的话,如果能够将BEV空间稀疏化,让BEV空间只保留关键物体的信息,是否能够达到同样的效果,不过目前单目领域还没有出现这样的方法。(环视大领域应该有类似的方法了,毕竟大领域这么卷,肯定有人去尝试解决BEV的冗余信息问题的,稠密BEV->稀疏BEV)
然后从深度信息上:
为什么要关注这一点呢?因为单目3D检测的核心就是深度估计,单目3D检测的精度和深度估计的准度完全是正相关的。


我们可以看到MonoDETR模型输出的深度图和CaDDN模型输出的深度图,两者的精度完全不在一个数量级上。正如上文所说,MonoDETR的深度图尺寸是24* 80,而CaDDN深度图尺寸为94* 311,原始图像一般是375* 1242,MonoDETR的深度图是不可能那么精细化的。
我们先分析一下两个模型中深度的作用:

本质上,两者的深度都是建立图像和世界坐标的联系,CaDDN是雷达坐标系,MonoDETR是相机坐标系。
但是在方法上,CaDDN获得的是每一个图像特征对应的深度分布,会输入模型计算:将整个场景lift并投影至雷达坐标系,深度是一个显式的深度;MonoDETR获得的是关键点的深度,虽然能够输出整个场景的深度(好像也是深度分布),但是输出的深度并不会重新输入模型进行计算,输入模型进行计算的是输出深度分布前的Depth-Aware特征,属于一种隐式的深度特征,在最终的head输出每一个匹配上的物体的中心深度,属于实例深度值。
简单来说,CaDDN的深度起到的是场景3D定位的作用,相机内外参指定了投影方向,深度指定了投影距离,把整体图像特征投影到BEV空间进行检测;MonoDETR的深度起到的是2D定位+实例的3D定位作用,前者限制了图像空间中哪些区域是前景物体,哪些区域是背景,后者则将实例的特征lift到3D空间。
为什么说MonoDETR(DETR框架)对于深度信息的利用上不如CaDDN(BEV框架)显著呢?
首先BEV框架利用的是全局的深度信息,整个场景(体素空间、BEV空间)的恢复都依赖于深度信息的准确度。如果把CaDDN深度估计模块估计的深度分布替换成深度GT转化的one-hot编码形式,模型其他部分完全不变,在KITTI上的检测结果会远超单目水平(目前KITTI上单目med.类别 20+算毕竟高的水平了,加入深度GT能到60+),甚至超过双目的结果。这就意味着只要深度估计模块准度提高,就能大幅度提高3D检测的性能。
MonoDETR是做不到这个点的,即使输入深度GT也还是单目的数值水平(29、30左右)。究其原因,是深度发挥作用方式的区别。
深度在MonoDETR中,引导前景深度区域(实际上这一点很容易就被分割算法取代了,当前的SAM能够得到一个非常精确的车辆mask,一个轻量级、跟3D检测同步训练的分割模块也能得到尚可的分割效果),深度引导的前景区域实质上跟深度值并没有很大关系,区分前景和背景只需要一个相对的深度差,比如背景的深度是0左右,车的深度是4.5m还是3.5m都能区分前景和背景,只不过绝对深度也能做到这一点。简单来说,深度准度在划分前景和背景上作用不大。
更为重要的一点是:MonoDETR中深度是以隐式的方式起作用的,显式的深度GT以embedding的方式获得的深度特征和网络学习到的深度特征是有区别的,这种特征差异性也会导致MonoDETR加入深度GT依然只是单目的性能范畴。虽然原理都是上图 图像坐标到世界坐标 的投影关系,但MonoDETR隐式深度在网络中具体如何作用的很难解释,这也是一个呈待研究的问题。
结语
乱七八糟地写了这么多,总的来说,在单目3D检测方法中,“BEV框架”与“DETR框架”都有各自的特点,也有需要研究解决的问题,希望能在未来的工作中能够实际地解决一些难点吧。
自动驾驶之心
论文辅导来啦
知识星球交流社区
近4000人的交流社区,近300+自动驾驶公司与科研结构加入!涉及30+自动驾驶技术栈学习路线,从0到一带你入门自动驾驶感知(大模型、端到端自动驾驶、世界模型、仿真闭环、3D检测、车道线、BEV感知、Occupancy、多传感器融合、多传感器标定、目标跟踪)、自动驾驶定位建图(SLAM、高精地图、局部在线地图)、自动驾驶规划控制/轨迹预测等领域技术方案、大模型,更有行业动态和岗位发布!欢迎加入。
独家专业课程
端到端自动驾驶、大模型、VLA、仿真测试、自动驾驶C++、BEV感知、BEV模型部署、BEV目标跟踪、毫米波雷达视觉融合、多传感器标定、多传感器融合、多模态3D目标检测、车道线检测、轨迹预测、在线高精地图、世界模型、点云3D目标检测、目标跟踪、Occupancy、CUDA与TensorRT模型部署、大模型与自动驾驶、NeRF、语义分割、自动驾驶仿真、传感器部署、决策规划、轨迹预测等多个方向学习视频
学习官网:www.zdjszx.com