万能3D高斯预训练表示!GaussianPretrain:爆拉3D检测、Occ、高精地图等四大任务!...

点击下方卡片,关注“自动驾驶之心”公众号

戳我-> 领取自动驾驶近15个方向学习路线

今天自动驾驶之心为大家分享澳门大学&北理工最新的工作—GaussianPretrain!自动驾驶的万能3D高斯表示。如果您有相关工作需要分享,请在文末联系我们!

自动驾驶课程学习与技术交流群事宜,也欢迎添加小助理微信AIDriver004做进一步咨询

>>点击进入→自动驾驶之心3DGS技术交流群

论文作者 | Shaoqing Xu等

编辑 | 自动驾驶之心

写在前面 && 笔者理解

受Tesla的技术的推动,越来越多的厂商开始走"纯视觉"的路线,多数方案还是集中在从多视图输入图像中提取鸟瞰图(BEV)特征,来解决下游目标检测、在线地图等各种应用。尽管有监督的方法还是占主导地位,但是它们非常依赖精确的GT标注,成本高、难度大往往成为一个比较显著的瓶颈。相反,大量且易于获取的未标记数据为提高性能提供了一个充满希望的途径。这就是所谓的自监督预训练技术,其核心思想是,通过利用精心设计的代理任务,从丰富的未标记数据中学习有意义的表示。然而当前的一些方案要么无法捕捉到有效的几何信息,要么无不能学习到详细的纹理信息。

3D Gaussian Splatting(3D-GS)以点云的形式表示,为场景重建提供了强大的表示,通过位置、颜色、旋转、缩放和不透明度等属性编码几何和纹理信息。正是受到3D-GS在有效场景表示和Masked autoencoders(MAE)在2D图像自监督学习中的成功的启发,作者提出了一种新颖的预训练方法GaussianPretrain,它结合了3D-GS和MAE方法,用于3D视觉学习中的预训练任务。

作者的方法包括两个关键创新:

  • LiDAR深度指导掩码生成器。为了提高效率,作者只关注从多视图图像中的有限数量的有效掩码补丁中学习高斯信息。这些补丁由MAE策略识别,并进一步过滤,只包括那些具有LiDAR深度监督的补丁。

  • 基于射线的3D高斯锚点指导策略:对于每个LiDAR投影像素,执行射线投射操作到3D空间以采样体素内的点。作者引入了一组可学习的高斯锚点来指导从3D体素中作为体积LiDAR点的高斯属性的学习,并预测相关属性(例如,深度、不透明度)。这使得模型能够通过3D Gaussian Splatting同时理解场景的几何和纹理信息。

  • 论文链接:https://arxiv.org/pdf/2411.12452

相关工作

自动驾驶中的预训练

使用对比学习和掩码信号建模来捕获语义和纹理信息,在2D图像上的预训练已经取得了巨大的成功。但是,自动驾驶的视觉预训练需要准确的几何表示。目前有的研究,比如,UniScene和OccNet利用占用预测进行预训练,而ViDAR 从历史帧图像预测未来的LiDAR数据。尽管这些方法在捕获几何信息方面是有效的,但却无法学习详细的纹理信息。相反,像Self-OCC 、UniPAD 和MIM4D 这样的方法使用NeRF 来渲染RGB图像和深度图,学习了纹理但几何信息有限。OccFeat 在占用预测期间使用知识蒸馏从图像基础模型转移纹理信息,但会产生高昂的预训练成本。相比之下,作者的工作引入了3D Gaussian Splatting进行自动驾驶的视觉预训练,有效地捕获纹理和几何信息,来解决这些限制。

从NeRF到3D-GS</

`!occ.count(s[rk + 1])` 这段代码涉及到 C++ 中的标准模板库 (STL) 的 `std::unordered_map` 或者 `std::map` 使用场景。 ### 解释: - **`occ`**:这里假设 `occ` 是一个哈希表(如 `std::unordered_map`),用于存储字符到整数的映射,通常用来统计字符串中某个字符是否出现过以及出现了多少次。 - **`.count(key)`**:这是 STL 容器(例如 map、unordered_map 等)的一个成员函数。对于给定的关键字 key,如果该关键字存在于容器内,则返回值为 1;如果不存在则返回值为 0。 因此,整个表达式 `!occ.count(s[rk + 1])` 表示的是检查当前索引位置 `(rk+1)` 所对应的字符是否存在於哈希表 `occ` 内部。这里的感叹号 (`!`) 表达了取反操作——即当结果不是存在的时候才成立。 换句话说,这个条件是用来判断 字符串s从下标 rk+1处取得的那个元素 是否尚未被记录进哈希表里: #### 示例情景 比如在滑动窗口算法解决“最长无重复子串”这类题目时可能会看到这样的结构,目的是为了保证新加入窗口内的字母之前从未遇到过。 ### 模拟解释代码片段的作用过程 假设有这样一个例子: ```cpp string s = "abcda"; int rk = 2; unordered_map<char, int> occ; // 假设已经将 'a', 'b', 'c' 加入到了 occ 中 if (!occ.count(s[rk + 1])) { // 如果 s[3] ('d') 不在 occ... } ``` 在这个条件下,“d”不在先前存入 `occ` 的那些键之中,所以会进入 if 分支处理相应的逻辑。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值