专栏名称: 极市平台
极市平台是由深圳极视角推出的专业的视觉算法开发与分发平台,为视觉开发者提供多领域实景训练数据库等开发工具和规模化销售渠道。本公众号将会分享视觉相关的技术资讯,行业动态,在线分享信息,线下活动等。 网站: http://cvmart.net/
目录
相关文章推荐
乌鸦预告片  ·  豆瓣2024最佳冷门片!9.1高分《还有明天 ... ·  昨天  
乌鸦预告片  ·  豆瓣2024最佳冷门片!9.1高分《还有明天 ... ·  昨天  
媒哥媒体招聘  ·  揽光传媒招聘! ·  3 天前  
媒哥媒体招聘  ·  事业编|上海戏剧学院招聘! ·  3 天前  
51好读  ›  专栏  ›  极市平台

ECCV 2024|SparseOcc 纯稀疏3D占用网络和 RayIoU 评估指标

极市平台  · 公众号  ·  · 2024-08-02 22:00

正文

↑ 点击 蓝字 关注极市平台
作者丨liuhs@知乎(已授权)
来源丨https://zhuanlan.zhihu.com/p/709576252
编辑丨极市平台

极市导读

本文探索了一个全新的纯稀疏的Occupancy架构,取名为SparseOcc。SparseOcc不依赖任何的dense设计,架构简洁高效,并且可以无缝迁移到全景分割。 >> 加入极市CV技术交流群,走在计算机视觉的最前沿

本文介绍我们发表在ECCV 2024的新工作:Fully Sparse 3D Occupancy Prediction

之前的3D occupancy工作,大多需要构建一个稠密的3D特征,或者依赖sparse-to-dense模块来做dense prediction,计算量大。本文中我们探索了一个全新的纯稀疏的Occupancy架构,取名为SparseOcc。SparseOcc不依赖任何的dense设计,架构简洁高效,并且可以无缝迁移到全景分割。此外,我们还深入分析了当前评测指标存在的漏洞,并提出了新的指标:RayIoU。代码已经开源在了GitHub:

https://github.com/MCG-NJU/SparseOcc

我们的论文在2023年12月就已经挂出了第一版,圈内同学大多都已经看过我们的论文。对于论文方法的介绍,这位博主已经写的比较详细了(感谢~),我们也不再赘述。想看详细的方法介绍,请直接看这位老哥的:

AIming:SparseOcc纯稀疏占用网络论文笔记(南大/上海AI LAB) https://zhuanlan.zhihu.com/p/691549750

这篇推文我们先简单介绍一下方法,然后主要聊聊大家常问的关于RayIoU的问题汇总。文末还有我对未来可做方向的思考。

重要事项

首先,我们要声明一下,市面上还有一个和我们 同名 的SparseOcc,题目是 "SparseOcc: Rethinking sparse latent representation for vision-based semantic occupancy prediction" (by Tang et al), 但内容和本文完全不同 。请大家在引用的时候 务必做好区分,以下是几个注意点:

  • 我们的题目是 Fully Sparse 3D Occupancy Prediction, 我们的题目中没有SparseOcc字样
  • 我们的arxiv ID是 2312 开头(https://arxiv.org/abs/2312.17118)

我们已经发现了超过3篇存在错误引用的文章,也已经联系他们并指出错误。他们承认了疏忽并表示已经更正。我们在此也恳请大家再三确认好, 您所引用的SparseOcc是不是您真正想引用的

如果您想在Google Scholar上搜索本文,请搜索 Fully Sparse 3D Panoptic Occupancy Prediction 。因为我们在后续的更新中,删除了题目中的 Panoptic 一词,而Google scholar的数据库还没有更新,依然显示第一版的标题。在引用时,您选择第一版还是第二版都可以,只要arxiv ID对上就行。非常抱歉带来不便!以后还是尽量不改题目了...x)

SparseOcc

SparseOcc总览

SparseOcc是一个纯稀疏的占用网络。首先,它利用Sparse voxel decoder以从粗到细的方式重建场景的稀疏几何形状。由于这一步仅对non-free区域进行建模,显着节省了计算成本。接着,一个mask transformer使用稀疏的 semantic/instance query来预测稀疏空间中每个segment的mask和label。Mask transformer不仅提高了semantic occupancy的性能,而且为panoptic occupancy铺平了道路。

Sparse voxel decoder 中的一层

具体来说,在sparse voxel decoder 的每一层中,所有query都是voxel query,他们经过self attention,sparse sampling 和 adaptive mixing (这三个模块来自SparseBEV)之后,会经过上采样和稀疏化这关键的两步。上采样就是把一个voxel分裂成8个(两倍上采样);稀疏化就是根据每个voxel的分数,决定其是否被丢弃。一种做法是卡阈值 (thresholding)。但我们这里用top-k来实现稀疏化,因为这样子样本之间的长度一致,便于多卡多batch训练。测试的时候,可以随时切换thresholding / top-k两种方式。

Mask transformer部分主要就是把原先的cross attention换成了稀疏采样,因为cross attention需要和image中的每一个location交互,属于dense操作。换成稀疏采样之后,我们进一步设计了mask-guided策略,让采样点的生成会依照predicted mask的指导。在此不再赘述。

RayIoU

目前市面上最主流的数据集是Occ3D-nuScenes,它的评估指标是voxel-level的mIoU。并且,他们还提供了一个visible mask,在评测时,只有visible mask=true的区域会被纳入评估。后来,大家发现在训练的时候,用上这个visible mask可以大幅涨点。举个例子,BEVFormer用上visible mask之后,mIoU从24涨到了39,足足15个点。这个现象也在BEVDet-Occ,FB-Occ等等方法中出现。那么自然而然我们就有了疑惑: 这真的是来自于性能提升吗?

于是,我们拿BEVFormer开刀,train了两个版本,分别是用/不用visible mask。如上图所示,出乎意料的是,用了visible mask之后,我们并没有发现性能有什么真正提升,无非就是墙变厚了,甚至prediction还更加noisy了。然而,Occ3D的mIoU指标却显示有15个点的巨大提升。

究其原因,我们发现,是现在的这个评估指标存在漏洞。简单地说, 只要你预测一个厚表面(把墙后面看不见的区域全部填满),你就能轻松获得很高的指标 。下图是一个例子:

想象我们面前有一堵墙,它到我们的GT距离为 d,且GT的厚度为 dv(这里的dv往往都很小,因为GT是根据LiDAR做的,所有表面都是薄薄的一层)。

当我们预测的墙壁很厚,其 dp ≫ dv 时,我们会遇到深度上的不一致惩罚。具体而言,如果预测的距离比GT更远(总距离为 d + dv,最左边的例子),其 IoU 将为零。相反,如果预测的墙比地面真实值更近(总距离为 d - dv,最右边的例子),IoU 依然会有 0.5。这是因为表面后面的所有体素都被重复填充,并且现在的评估指标会忽略GT之后的区域。类似地,当预测的深度为 d - 2dv 时,得到的 IoU 为 1/3,以此类推。

综上,现在的mIoU指标存在以下几个问题:

  1. 如果模型填充了表面后面的所有区域,沿着深度方向的惩罚是不一致的。 通过填充表面后面的所有区域,并预测一个更近的深度,模型可以轻松获得更高的 IoU。这种厚表面的现象,在那些使用visible mask或2D监督(比如RenderOcc)训练的模型中非常常见。这会导致和薄表面的方法的对比不公平。
  2. 如果预测的占用表示一个薄表面,惩罚会变得过于严格。 即使只有一个voxel的偏差,IoU 也会变为零。
  3. Visible mask仅考虑当前时刻的可见区域,将occupancy简化为深度估计任务 ,忽视了场景补全能力。

于是,我们提出了一个新的评估指标,叫RayIoU(也就是CVPR 2024 自动驾驶挑战赛 Occuapncy 赛道所使用的评估指标)。不同于之前的voxel-level mIoU,我们的RayIoU的基本元素是Ray,也就是光线。我们模拟LiDAR,将Query ray投射到预测的3D occupancy。对于每个查询光线,我们计算它在与任何表面相交之前所经过的距离,并拿到相应的类别标签。一个query ray只有在其类别预测是对的,并且深度的预测误差在一定阈值之内,才算True Positive(TP)。

此外,我们还可以控制query ray的分布。直接模拟LiDAR会导致远近不均匀,所以我们重新平衡了一下光线分布。并且,query ray还可以从过去、未来时刻的ego位置出发,从而 更好地评估补全能力 。大家可能也发现了,今年挑战赛里,时序建模的涨点会非常多,因为它让补全性能更好了。

FAQ

RayIoU作为今年挑战赛的指标,自问世之后就得到了不少好评。同时,也有一些同行提出了疑问,我们在此收集记录一下:

  1. 为什么训练时使用visible mask会导致厚表面? 这是因为表面之后的区域不会受到监督,模型就倾向于将这个区域用重复的prediction填满,造成厚墙壁的效果。
  2. RenderOcc 没有使用visible mask,为什么它的预测的表面也很厚? 这是因为它用的渲染loss,2D监督,这种loss本身就不监督表面后面的区域,原理和visible mask差不多。
  3. 为什么SparseOcc不能利用老指标的漏洞? 由于 SparseOcc 采用完全稀疏架构,因此它始终会预测一个薄表面。因此,想要公平对比只有两种办法:(a)使用旧指标,但所有方法都必须预测薄表面,这意味着它们在训练期间不能使用visible mask;(b)使用 RayIoU,因为它更合理,可以公平地比较厚或薄表面。我们的方法在这两种情况下都实现了 SOTA 性能。
  4. RayIoU 是否忽略了物体内部的重建? 首先,我们无法获得物体内部occupancy的GT。这是因为GT是通过体素化 LiDAR 点云得出的,而 LiDAR 只能扫描物体的薄表面。其次,RayIoU 中的ray可以来自场景中的任何位置(见上图)。这使得它能够评估整体重建性能,而不像深度估计。我们要指出,RayIoU 的评估逻辑与GT生成过程一致。
  5. 那么以后在训练时应不应该用visible mask呢? 好问题,我觉得有利有弊。利处是:它解决了LiDAR unscanned区域的歧义问题。毕竟有很多区域只是LiDAR没扫到,并不是真的free,用visible mask能很好解决这个问题。弊处是:它会让深度估计不准。具体可以看我们最新版arxiv文章的More Studies (sec 5.4)一节。因此,我的建议是:用,但是要解决掉它让深度不准的问题。如果仅仅是墙后的区域不监督了,模型自然倾向于预测一个深度更近的表面以达到更低的loss。这一块可以留作future work。
  6. 对于较远处的地面,如果Prediction相比于GT只是高了一层voxel(0.4m),那么在经过ray casting之后是否会导致较大的depth error? 是的,并且这也是合理的。预测一个准确的地面至关重要,因为occupancy的主要应用价值就是处理不规则物体(包括地面的坑洞,凸起)等。对于模型来说,这可能难了一点,但这不是RayIoU的问题,这是现在的 voxel 表达形式太粗糙(只有0.4m的精度)的问题。未来可以采用更细粒度的voxel(小米都用0.1m了),或者用点云来表示occupancy(下面会介绍),或者用连续曲面来建模地面。
  7. 为什么要逐光线算L1误差,而不是对打完光线得到的点云直接算Chamfer distance? 因为我们当时还要办比赛。办比赛的时候有一个硬件限制,就是服务器上只有CPU,没有GPU。算chamfer distance的复杂度太高了,评测一次就要10个小时,到时候大家又要骂街了。无奈采用了L1误差,并且还要求了大家在本地打完光线再提交:) 我们也觉得chamfer distance是更合理的,未来大家可以自行修改尝试。

Limitations

  1. 累积误差。 在sparse voxel decoder中,早期被丢掉的voxel再也回不来了。
  2. 部署问题。 由于网络中存在一些自定义算子(稀疏采样等),因此目前部署还存在难题。对于工业界的同学,我更推荐另一个同期工作 FlashOcc Austin:FlashOCC - 仅用Conv2d实现了SOTA的Occpanucy预测(https://zhuanlan.zhihu.com/p/670961634) 和最近新出的 Panoptic FlashOcc Austin:Panoptic-FlashOcc:目前速度和精度最优的全景占用预测网络(https://zhuanlan.zhihu.com/p/709393871)

Future Work

SparseOcc 作为第一个纯稀疏框架,未来还有很多进步空间。在此列举一些:

  1. 解决累积误差问题。 现版本最大的问题应该就是累计误差,早期被丢掉的voxel再也回不来了。因此可以设计一种growing机制,或者仿照gaussian splatting的density control机制,来解决这个问题。
  2. 换掉voxel的表达形式。 抛弃离散,voxel那一套东西, 用点云表示occupancy 。点云的坐标是连续的浮点数,然后通过预测一个offset来移动点云(就像DETR系列一样)。监督就用chamfer distance,更加soft。最后这个预测出来的点云还可以转成mesh,非常灵活。相比于voxel,纯点云的粒度可以做的无限细。难点在于点云密度很高,两两做self attention代价昂贵。而且,如何解决unscanned区域的歧义也是个问题。voxel方法可以通过visible mask解决,但是point-based方法就不好说了。本来在2023年12月挂出第一版之后就想做这个方案的,但后来发现评估指标才是目前最大的痛点。这个方案也就搁置了。
  3. 用RayIoU实现跨数据集评测。 现在市面上一大堆基于nuscenes的occupancy数据集,比如Occ3d, OpenOcc, OpenOccupancy, SurroundOcc等等,讲道理他们都区别不大。后来,有的方法它在A数据集上做的,有的方法又是在B数据集做的,没法公平对比,很烦人。但现在,我们可以通过RayIoU来实现跨数据集统一评测。只要改一处地方:每根光线,打到predicted occupancy上拿到距离之后 直接和raw LiDAR measurements去比 ,这样就不需要GT occupancy了。这样依然可以从过去和未来的时刻去打光线,但必须得模拟LiDAR,不能自定义光线分布(我觉得问题不大)。于是,不管这个模型是用什么数据集训的,只要它是基于nuScenes的,全都可以统一评测,公平对比。此外,这个指标 还可以评测GT occupancy制作的好坏 ,比如我想评估Occ3D和OpenOcc这两个数据集谁更好更准,我也可以用这个指标直接去和LiDAR比。这样Occupancy这个领域在评估指标这方面就可以迎来大一统,避免大家在各自的数据集上各玩各的。






请到「今天看啥」查看全文