Scene as Occupancy

OccNet

https://github.com/OpenDriveLab/OccNet
Scene as Occupancy

  • 提出了一种新的场景表示方法, 利用环视摄像头,采用级联和时序体素编码的方式来重建三维Occ场景。
    在这里插入图片描述

Method

1)提出的OCCNet首先重建占据描述符,目标是为支持下游任务获取一个代表性的占据描述符。OCCNet采用了级联的方式(解码过程被分为多个阶段,每个阶段都负责恢复特定的信息),通过多个级联阶段的迭代,从鸟瞰图特征中解码3D占据特征。 2)使用了基于体素的时间自注意力和空间交叉注意力来恢复高度信息,并结合了可变形的3D注意力模块以提高效率。
在这里插入图片描述

  • Reconstruction of Occupancy
    OccNet使用Voxel尺度上的特征,但如果仅使用BEV特征,则无法充分恢复高度信息;但如果直接使用体素特征,则需要消耗大量算力。OccNet则在两者间寻求一个平衡点,先通过BEVFormer的encoder得到带有时序信息的BEV特征,再通过级联的decoder恢复3D占据特征。
    不同层级的decoder负责恢复不同高度尺度的信息。
    将前一帧的特征通过当前帧的参数进行变换,对于典型的自注意力机制,每一个query都需要与所有的key和value进行匹配,在3D特征下,这需要消耗大量的算力。因此,OccNet引入了可变形的3D注意力模块,从而大大降低了计算量。

  • Exploiting Occupancy on Various Tasks
    有了细粒度的3D场景表征,就可以应用于各种下游任务:

  1. 分割场景补全: 使用L1 Loss 和 Focal Loss来完成类别不平衡的场景补全任务
  2. 3D目标检测: 基于BEVFormer,将Occ重新投影到BEV视角,并使用query-based检测头进行3D目标检测
  3. BEV 语义分割: 基于ST-P3, 与三D目标检测一样,地图表征和语义分割是通过 BEV 特征预测的。BEV 分割头包括用于地图表示的可驾驶区域头和车道头,以及用于语义分割的车辆分割头和行人分割头。
  4. 运动规划:对于运动规划任务,感知结果都可以转换为BEV分割的形式,所有形式的结果都可以以0,1的形式表示。进一步就可以用于安全代价函数的计算中。

Experiment

在这里插入图片描述
在这里插入图片描述

OpenOcc

数据集真值的生成步骤:

  1. 根据带标签的物体点和部分背景点生成占位数据,其中黑点表示中间帧的未知背景点。
  2. 根据生成的占用率数据标注部分未知背景点。
  3. 去除其余被视为噪声的未知背景点。
  4. 对占用率数据进行后处理,以确保场景的完整性,如填补红色虚线框内的空洞。
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
在讨论 `NULL` 的概念及其用途之前,需先明确其定义和常见场景。以下是关于 `NULL` 的详细解析: ### 什么是 NULL? `NULL` 是一种特殊的指针值,在 C 和其他编程语言中通常用于表示“无有效地址”。它是一个宏常量,一般被定义为 `(void*)0` 或简单的整数值 `0`。 #### 在数据库中的含义 在 SQL 中,`NULL` 表示缺失的值或未知的数据状态。例如,当更新某列数据为 `NULL` 时,意味着该字段当前没有任何有效的值[^1]。这可以用来标记某些未填充或不可用的信息。 #### 在程序设计中的应用 对于指针变量而言,将其初始化为 `NULL` 可以防止野指针问题的发生。通过显式赋值为 `NULL`,开发者能够清楚知道此指针尚未指向任何实际对象或者资源已经释放完毕[^2]。 另外需要注意的是,在涉及动态内存分配以及复杂结构体操作过程中,如果希望修改外部传入参数所指向的内容,则可能需要用到双重指针技术;而为了安全起见,在函数内部处理结束后应重新将这些临时使用的单层或多层间接寻址形式下的局部副本置回至初始态即`NULL`状态以防泄漏潜在风险[^3]。 ```c #include <stdio.h> #include <stdlib.h> // Example function demonstrating use of double pointer to change original pointer value safely. void allocateMemory(int **ptr) { static int N = 5; *ptr = (int *)malloc(N * sizeof(int)); if (*ptr != NULL){ printf("Memory allocated successfully.\n"); } } int main() { int* myPtr = NULL; allocateMemory(&myPtr); free(myPtr); myPtr = NULL; return 0; } ``` 上述代码展示了如何利用双指针来更改原始指针的实际存储位置,并且强调了每次完成相应逻辑单元后的清理工作的重要性&mdash;&mdash;即将不再需要访问的对象设为空(`NULL`)从而避免悬垂引用等问题出现。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值