1、Occupancy网络基础:什么是3D Occupancy网络?为什么在自动驾驶中如此重要?与传统BEV感知的对比

1.1 从一次路测事故说起

我记得那是2021年夏天,我们团队在上海市区做路测。一辆白色SUV斜停在路口,车身有一半压在实线上。我们的BEV模型把它识别成了「静止车辆」,但实际它正在缓慢倒车——因为前方有个小孩蹲着捡球。

问题出在哪?BEV感知把世界压扁成了鸟瞰图,丢失了高度信息。那辆SUV的底盘高度、小孩的蹲姿高度,这些三维信息全没了。说白了,BEV是在二维平面上猜三维世界,天生就有信息瓶颈。

那次事故后,我开始认真研究Occupancy网络。它解决的就是这个问题——不丢失任何三维信息。

1.2 什么是3D Occupancy网络?

Occupancy网络,你可以理解成「给自动驾驶汽车装上一双能看穿遮挡的眼睛」。

它的核心思想很简单:把三维空间划分成一个个小立方体(voxel),然后判断每个小立方体是被占据还是空闲。就像用乐高积木搭出整个世界,每个积木块要么有东西,要么没有。

数学定义:

给定一个三维空间点 (x, y, z),Occupancy网络输出一个概率值 p ∈ [0, 1],表示该点被占据的可能性。

p > 0.5 → 被占据(有物体)

p ≤ 0.5 → 空闲(无物体)

嗯,这里要注意:不是简单的二分类。实际工程中,我们会输出每个voxel的语义类别——比如「这是车辆」、「这是行人」、「这是路面」。这就变成了「语义Occupancy网络」。

1.3 为什么在自动驾驶中如此重要?

我直接说结论:Occupancy网络是解决「长尾问题」的关键武器。

你想想看,自动驾驶最怕什么?不是标准场景,而是那些「没见过」的物体。比如:

  • 路上掉落的轮胎皮
  • 施工区域的水马
  • 被风吹倒的共享单车
  • 动物尸体(我在高速上真遇到过)

传统检测模型需要标注才能识别。但Occupancy网络不需要——它只判断「这里有没有东西」,不管是什么东西。这就覆盖了所有未标注的障碍物。

我的经验:

在项目中,我们曾经用Occupancy网络成功检测到一辆侧翻的三轮车。检测模型完全没认出它(训练集里没有侧翻样本),但Occupancy网络直接标记了那片区域为「被占据」,系统及时刹停了。

另外,Occupancy网络天然支持多模态融合。你可以把激光雷达的点云、相机的图像、毫米波雷达的数据都投影到同一个三维网格上。每个传感器贡献自己的证据,最后投票决定每个voxel的状态。

1.4 与传统BEV感知的对比

BEV感知这几年很火,但它的本质缺陷我一直耿耿于怀。咱们直接上对比:

对比维度 BEV感知 Occupancy网络
空间维度 2D(鸟瞰图) 3D(体素网格)
高度信息 丢失 完整保留
遮挡处理 无法处理 可推理遮挡区域
未知物体 无法检测 可检测(作为占据)
计算开销 较低 较高(需优化)
输出形式 2D bounding box 3D occupancy grid

我举个例子你就明白了。假设有个行人蹲在车后面,只露出半个头:

  • BEV感知:在鸟瞰图上,行人和车辆重叠,模型可能直接忽略行人,或者错误地把行人框到车辆框里。
  • Occupancy网络:在三维空间中,车辆占据下层voxel,行人占据上层voxel。模型能清晰区分「这是两个不同的物体」。

避坑指南:

我曾经踩过一个坑:以为Occupancy网络可以完全替代BEV。实际上,两者是互补关系。BEV在路径规划、车道线检测等任务上效率更高。我的建议是:感知层用Occupancy网络做通用障碍物检测,规划层用BEV做结构化道路理解。

1.5 核心挑战与我的思考

Occupancy网络虽好,但落地时有三座大山:

  1. 计算量爆炸:一个100m×100m×10m的空间,如果voxel大小是0.1m,那就是1亿个voxel。每个都要推理,GPU扛不住。
  2. 标注成本高:三维体素标注比2D框标注贵10倍以上。我们团队曾经花3个月才标完一个城市的数据集。
  3. 时序一致性:单帧预测容易抖动。车辆在运动,voxel的占据状态需要时序平滑。

我个人习惯的做法是:先用稀疏卷积降低计算量,再用自监督学习减少标注依赖,最后用时序融合网络保证稳定性。这些方法我会在后面的章节详细展开。

1.6 小结

Occupancy网络不是银弹,但它确实补上了自动驾驶感知的关键拼图。说白了,它让车不再「盲人摸象」——而是真正理解三维世界的全貌。

下一章,我会带你手撕Occupancy网络的代码实现。从数据预处理到模型推理,每一步我都会给出可运行的代码示例。准备好了吗?