大家还记得之前的推文《 "3Dfy" A General 2D Detector: 纯视觉 3D 检测再思考》吗?这篇文章将它的基础上,更详细地介绍我们最近被 CoRL 2021 接收的工作PGD。并在结合 motivation 的方法设计解读的同时,也希望通过更多实验细节以及尝试过程的展示,可以引发大家更多的思考。
“课前”回顾
图 1:不准确的深度阻碍了其他所有预测目标对于总体 3D 检测性能的提升。
上一回说到,对于从一个通用 2D 检测器改装成为的 3D 检测器进行系统化的上限分析,我们发现:制约当前单目 3D 目标检测准确度继续提升的瓶颈就在于深度估计的准确度无法保证。当深度估计处于当前水平时,即便其他的目标都完全准确也无济于事。因此这一任务在当前阶段可以在一定程度上退化为目标的深度估计问题。
从单目 3D 目标检测这个任务的宏观角度来看,和 2D 检测类似,它也可以被拆分为分类 (classification) 和定位 (localization),而深度估计则是定位中的一个子任务。那么之前的工作是如何解决这一子任务的呢?
早期的工作(如 ML-Fusion [1], Pseudo-LiDAR [2])会利用一个预训练的或者额外的深度估计器 (dense depth estimator) 附加到原本的检测器上来协助完成,而最近的端到端检测器(如 MonoDIS [3],M3D-RPN [4],RTM3D [5])则是将其简化为定位目标中的简单一维。
但他们都还是采用了简单的回归方式基于单个像素点来对孤立的个体目标进行深度预测,而并鲜有利用到有价值的各种几何约束。基于此,我们想要进一步挖掘不同目标之间的几何关系,并通过建模每个目标的不确定性来引导物体关系图之间深度估计的传导。
1. 局部几何约束加持
图 2:利用相对准确的 2D 检测框来限制 3D 检测框的朝向和深度估计是一个非常简单而有效的约束。
在正式开始引入我们的深度估计方法之前,我们首先将 baseline FCOS3D [6] 迁移到了 KITTI [7] 数据集上进行实验,意外(意料之外而又“情理之中”)地发现检测性能非常不理想。经过简单的可视化分析,我们发现在数据量很小的时候,越简单的方法越容易出现难以学习的问题(数据真实地喂不饱这摆烂的模型 :) ),于是我们首先加上了一个最基本的局部几何约束:即利用额外的 2D 检测框来给 3D 检测框增加一个自监督的约束。
具体实现上,我们增加了一个 2D 检测分支(遵循 FCOS [8] 的设计)作为冗余的检测目标项,并且增加了一个 GIoU loss [9] 用来衡量 2D 检测框和 3D 检测框投影外接矩形之间的一致性。这个基本的设计在 KITTI 和 nuScenes [10] 上一致地提升了我们 baseline 的性能。这里需要注意的一个细节是,在训练时我们采用 3D 框投影的外接框作为 2D 检测框的真值以保证两者的一致性,若直接采用紧密的 2D 检测框的人工标注则会失去这种一致性。
注:实际上 baseline 的训练方式,不同网络设计,不同目标的 weight 以及更多冗余任务的设计并没有经过特别多的微调,相信还有一定的空间可以进一步挖掘。
2. 具有概率性的深度
在 baseline 初步准备完毕后,我们开始考虑深度估计的方法设计。其中有两个重要的组成部分:不确定性 (uncertainty) 和几何关系 (geometry)。前者是基础,只有有了不确定性的建模,我们才能清楚地知道哪些目标是相对准确的;同时这也可以帮助我们在最后更有针对性地对预测结果进行排序。后者是目标,我们最终希望能够通过建立不同目标之间的约束关系来提升所有目标的深度估计精度。接下来,我们首先介绍如何通过概率的表达方式建模深度估计的不确定性。
考虑到深度本身之所以不好直接回归,很大一部分原因是其值域范围过大并且是一个和其他目标具有不同度量的回归目标,因此将这个连续范围离散化并通过类似于分类的方式来学习则是一个简单直接的方法(类似的思想也在 2D 目标检测(如 SABL [11], Gaussian YOLOv3 [12],HD3 [13]),深度场估计(如 DORN [14])的工作中有所体现)。更重要的是通过这种离散化后学习得到的置信度(confidence score)还可以用来衡量不确定性,这在我们的总体设计中是非常重要的一个“副产品”。具体而言,假设检测范围是 ,离散化的单元是 ,那么可以算出有 个离散点。将这些离散点作为权重向量 ,假设网络输出的深度预测概率图为 ,那么我们可以将其解码得到深度的估计值:
这等价于求解由 所构建的深度分布的期望。除了 之外,我们还可以根据这一分布得到深度估计的置信度 。在实践中,我们采用了 top-2 置信度平均值作为最终的深度估计分数。
之后,我们用一个和数据无关的可学习标量λ来整合这两种深度估计:
表示局部的深度估计,因为这里我们用到的还是局部的特征信息对于单一目标进行深度估计。至此我们已经完成了深度估计不确定性的初步建模,并为下一步建立深度传播图做好了准备。
需要注意的是,这里我们的实现方式和通常深度估计场的方法(如 DORN)中的实现有诸多不同。首先我们只是针对深度范围进行了粗略的划分(实验中以 10m 为单位)而并没有进行更细粒度的划分(如以 1m 为单位);其次,我们直接利用概率分布的期望作为深度估计值,而没有将其转换为分类问题再去预测额外的残差。这样一种设计在实验中更为简单有效,也节省了显存的消耗。
其他的不确定性表达方式?
事实上还存在很多其他的不确定性表达方式(formulation/representation),例如这一年其他的工作中几乎都采用了的 homoscedastic uncertainty(早些由一篇 multi-task learning [15] 的工作提出),这在我们最终提升 KITTI 模型的性能时也发挥了巨大的作用。
比较可惜的是当前采用的 formulation 是一个过于强的不确定性表达方式,它的区分度过于明显以至于会因此滤掉很多相对不是那么不准确的框;更何况准确与否这件事情也要和距离挂钩,对于不同距离的物体,在纯视觉这种设定下不可能奢求他们的准确标准都一样严格,将 uncertainty 和简单的 smooth L1 loss 挂钩也因此会产生期望之外的副作用。
在我们把这种方法迁移到 nuScenes 上的实验中,这会引起数个百分点的性能下降,也正印证了我们的判断。相比而言我们对于不确定性的表达方式则有更温和更稳定的作用以及更好的泛化性。
另外,ICCV 2021 的文章 Are we Missing Confidence in Pseudo-LiDAR Methods for Monocular 3D Object Detection? [16] 也探讨了 3D 置信度的重要性,并提出了两种可选的建模方式。总之,这一方面其实是和 evaluation metric 紧密联系的,也非常值得更加深入细致的探索。
其他的离散化网格学习方式?
在 CaDDN [17] 和其他深度估计的工作中,通常会采用更细粒度的网格划分,以及分类加残差回归的方式来进行深度估计。同时对于划分的方式还有更多的变体,除了我们文中用到的均匀划分 (UID),还有空间增长划分 (SID) 和线性增长划分 (LID)。我们进行了简单的尝试发现并没有更好的效果提升。由于不同的划分方式还会和置信度的设计紧密相关,这里我们没有进行更多的试验,也可留待之后进一步的探索。
3. 具有几何性的深度
拥有了单个目标的各种估计量和不确定性之后,我们可以进一步建立不同目标之间的深度传播图从而得到每个目标基于全局信息的深度估计值。接下来,我们将首先建立起两个目标之间的关系,在误差分析的基础上,进一步更合理地将多个目标之间的关系建立起来。
图 3:对于较难估计深度的物体 2 而言,通过透视几何利用物体 1,3,4 更加可信赖的深度估计可以从全局上下文增强这一推理过程。
两个物体间深度的几何关系
考虑在一个通常的相机投影关系中,投影矩阵如下:
对于一个三维空间中的点 ,用 来表示它的深度, 来表示它的投影位置,那么投影关系可以表达为:
为了简化结果,我们用 替代 ,从而使得 表示投影点到地平线的距离(图像中的相机高度)。从而我们可以得到:
类似的关系对于水平方向也同样成立。考虑到在驾驶场景下,物体都在地面上这一个约束,我们这里主要考虑竖直方向的这一关系。考虑两个物体的上述关系式,可以进而得到:
由此我们可以利用物体 1 的深度,两物体投影中心点的位置估计以及 3D 中心高度差,通过这一几何关系传导得到物体 2 的深度估计。
除此之外,我们还可以利用两物体近似在同一地面高度的条件来用物体 3D 高度差替换 3D 中心高度差(因为物体 3D 高度本就是需要预测的,无需增加新的回归目标),我们将这一近似得到的深度估计记为 。在这一关系中,当
这非常容易理解:当物体高度一致时,投影位置离地平线越近,那么其实际在三维空间中的位置离我们越远。
误差分析
这是一个非常清晰的关系式可以将不同物体的估计值联系到一起,但由于我们利用了同一地面高度的约束,这一近似关系也会产生相应的误差。假设
那么由此产生的深度估计误差为 。当 ,那么 大概为 1.5 米。尽管这对于 30 米远的物体在一定程度上是可以接受的(大概对应于 ),但我们还是需要相应的机制来尽可能减少由此产生的误差。这包括了下面即将介绍的在深度传播时对边的剪裁和开关机制,以及在融合时预测位置可知的权重。
基于图的深度传播
得到了两个目标之间的几何关系后,我们就可以根据其他目标的估计来预测任一目标的深度了。
首先在不同物体之间可以建立如图 3 所示的图 (graph),之后通过定义对于每个物体而言每条边 (edge) 的得分 来确定其在深度传播中的权重。具体实现中,除了每个目标深度估计的置信度外,我们还引入了两个目标在图像中的位置距离分数以及类别相似度(通过观察,相近的同类物体能较好地满足上述同一地面高度的约束),综合得到每条边的权重。通过选取 top-k 的边(剪裁机制)并利用对应的权重(开关机制)来利用更多较为准确的深度估计:
通过上式我们可以得到每个物体的几何深度 。需要注意的是,为了避免这一分支各种估计之间的干扰,我们切断了由此分支反向传播的计算从而更加专注于让网络学习如何整合 和 。
不同深度之间的融合
和之前整合得到 的方式有所区别,这里考虑到不同位置几何深度的可靠性有较大差别,要“因地制宜”地利用各种不同的深度估计,所以每个检测头额外学习一个位置可知的权重用于深度整合:
这里我们还可以给各个深度估计一个中间结果的监督,不过实验中这种方式可以使训练相对稳定但并没有带来额外的性能提升。
4. 实验结果
对于检测准确率的提升
我们的方法首先在 KITTI 和 nuScenes 两个数据集上进行了验证,结果在两种 setting 下,都实现了一致的明显提升:
表 1:KITTI 验证集上的 3D 检测性能对比。注:这里依然采用了 AP11 的旧标准来方便和之前方法性能的对比,AP40 的结果详见测试集上的结果和开源代码的 README 页面。
表 2:NuScenes 上的 3D 检测性能对比,可以看到 mATE (平均位移误差) 有一个明显的降低。
对于深度估计准确率的提升
由于我们直接解决的问题是降低深度估计的误差,所以我们也对比了引入方法前后 inference 过程中 top-20 输出结果和相应的真值框的深度误差,可以看到明显的下降:
表 3:KITTI 上 3D 检测框位置深度估计的误差对比。
消融实验
最后是有关每个组成部分实现细节的消融实验。首先对于概率深度,单纯地采用概率的表达方式尽管可以使得整个优化过程更加稳定,但并不能直接地提升性能。最大的提升来源于将深度分数加入到最终预测结果的排序之中。
其次对于几何深度,最初的建模也并不能带来提升,需要对于传播图加以优化降低误差,并且减少对其他分支学习的干扰才能最终带来性能的提升。
表 4:概率深度在 KITTI 上的消融实验。
表 5:几何深度在 KITTI 上的消融实验。
定性的可视化结果
最后可以从鸟瞰图的可视化结果中定性地感受一下我们的方法在 3D 框的位置估计,特别是深度估计方面的提升。
图 4:从鸟瞰图看我们的方法在目标位置估计方面,特别是深度估计方面带来的提升。
6. 番外篇
最后补充一点关于 KITTI 和 nuScenes 数据集 metric 不同对于结果影响的对比。在我们之前的文章 "3Dfy" A General 2D Detector: 纯视觉 3D 检测再思考 和之前的分析中,已经多次提到由于 KITTI 和 nuScenes 判定检测目标正样本的标准和尺度不同,同样的方法可能在两个数据集上的效果有很大的差别。
尽管我们提出的深度分数相对比较温和,但也会在一定程度上过分抑制一些位置不太准确的检测结果,下面我们简单对比引入深度分数之前和之后的 PR (precision-recall) 曲线。这里以汽车和行人的检测为例:
图 5:NuScenes 数据集的检测指标更加全面,因而除了反映出严格阈值下正样本准确率提升的同时也反映出了宽松阈值下正样本召回率下降的问题。
图中虚线和实现分别代表在 inference 时引入深度分数之前和之后的情形。可以看到对于蓝色和黄色两条线,在较为严格的阈值标准下(位置相差 0.5m 和 1.0m 内),检测准确率是有一个显著提升的,这和 KITTI 的检测准确率大幅提升是一致的。
但同样我们也看到,对于较为宽松的阈值标准(位置相差 2m 和 4m 内),检测的召回率受到了明显影响(precision 变为 0 的点明显左移)。因此综合起来这一个设计并没有在 nuScenes 的 mAP 层面带来像 KITTI 那样巨大的提升,也因此会出现更严格的不确定性度量甚至会严重影响 nuScenes 上的性能。值得注意的是,这一问题在大物体如汽车等类别上较为明显。
7. 花絮——背后的故事
这篇文章的动机起源于去年的11月,当时在 nuScenes 上踩了一遍坑刚做了 FCOS3D 的 baseline,和合作者一起讨论出了不确定性(uncertainty)和几何关系(geometry)这两个关键点。后来到 ICCV 前完成了大部分,后又花了一个多月时间踩 KITTI 上的坑以及 polish paper,最后拖延到 7月 29 日挂出来这篇工作。
有趣的是,且不论中间挂出了多少篇利用投影几何关系(还好是单目标)和之前提到的 strong uncertainty 的工作,就在挂出 paper 的当天同时挂出的还有两篇看起来异曲同工的工作(GUPNet [18] 和 MonoGeo [19]),让人难免有一种“劫后余生”的庆幸感...
另外这篇工作被接收的过程也比较戏剧化。最早时考虑将 FCOS3D 作为 baseline 的一部分整体作为一个工作投稿,后因为内容过多重点不集中,写的有很大问题,加上 KITTI performance 没有刷到位(目前这个领域内的工作确实还是以 KITTI 为主但也因此存在一定的局限性),ICCV 给出的 reivew 总体都比较负面。
后来决定将其分拆为两部分工作,FCOS3D 投稿了 ICCV 3DODI workshop 结果喜提了 best paper award,PGD 也顺利被 CoRL 接收。所以这个故事告诉我们还是要虚心且认真地提取 reviewer 们的意见,并且耐心打磨一个个工作,最终都会有一个不错的结果。
8. 后续改进
关于接下来还有哪些可进一步探索的问题,前文中也已经进行了诸多讨论。
最后补充三方面我自己觉得仍有空间的地方。
首先是关于利用地面约束的问题,这个地方确实会因此产生一些不必要的误差,一个可以尝试解决的方案是将中心之间的关系转换为两个目标的高度及其投影之间的关系,由此便可以避免地面约束这一限制。但因此会额外引入投影高度这一个回归目标,也会影响到原本模型的一些训练。我们的初步结果显示这种方式会比利用单目标投影关系效果好一些。
第二个方面是关于多个深度融合的问题,目前的整合方式并不是特别优雅,如果有一些更自然的整合方式,并且可以去掉直接回归的分支或许会更好(例如 MonoFlex [20] 直接利用 uncertainty 的方式或者设计一下分层级训练的方法)。最后就是不同目标之间的深度传播图如果可学习而不是人为设计,或许可以更加自然和高效。
代码方面,一个相对干净的初始重构版本已经开源到 MMDet3D 的 v1.0.0.dev0 分支,目前已经支持了 KITTI 和 nuScenes 上的 benchmark,欢迎大家试用。
文章来源:公众号【OpenMMLab】
2021-12-12 16:13