1. Occupancy网络概述

各位同学好,我是你们的老朋友。今天咱们聊聊Occupancy网络——这个在自动驾驶圈子里越来越火的技术。

说实话,我第一次接触这个概念时,也觉得它跟传统3D检测差不多。但真正在项目里跑了一遍后,才发现两者差别太大了。嗯,咱们慢慢聊。

什么是Occupancy网络?

Occupancy网络,说白了就是回答一个问题:空间里的每个点,到底有没有东西?

它把三维空间划分成一个个小格子(体素),然后判断每个格子是被占据还是空闲。你想想看,这就像把整个世界切成无数个小方块,然后给每个方块打标签——有人、有车、有树,或者空着。

我习惯用一个比喻来理解:
传统3D检测像在找「物体」,比如「那里有一辆车」。
Occupancy网络像在描述「空间」,比如「这个格子被占了,那个格子空着」。

核心概念:Occupancy网络输出的是一个密集的3D占用网格,而不是稀疏的物体框。每个体素都有一个占用概率值。

与传统3D检测的区别

这里我重点说说两者的差异。我在项目里踩过不少坑,所以印象特别深。

对比维度 传统3D检测 Occupancy网络
输出形式 3D边界框(位置+尺寸+朝向) 密集占用网格(每个体素的占用状态)
目标类型 只能检测预定义类别(车、人、自行车等) 可检测任意形状的障碍物(包括未知物体)
空间分辨率 稀疏,只关注物体位置 密集,覆盖整个场景
对不规则物体 难以处理(比如倒下的树枝、散落的石块) 天然适合(体素级描述)
计算量 相对较小 较大(需要处理大量体素)

为什么会这样?我举个例子你就明白了。

传统3D检测就像用「矩形框」去套物体。你看到一辆车,框出来就行。但路上有个倒下的树干,形状不规则,你没法用一个标准的框去描述它。我曾经在项目里遇到过这种情况——激光雷达扫到一堆散落的建筑垃圾,3D检测器直接懵了,要么漏检,要么框得乱七八糟。

Occupancy网络就不一样。它不管物体是什么形状,只管每个格子有没有东西。树干也好,石块也好,只要占了空间,就能被检测到。

我的经验:如果你做的是封闭场景(比如园区、停车场),传统3D检测够用。但如果是开放道路,尤其是复杂场景,Occupancy网络的优势就体现出来了。

在自动驾驶中的应用场景

说到应用场景,我把它分成三类,每一类我都亲手调过模型。

1. 通用障碍物检测

这是最直接的应用。路上什么都有可能遇到——掉落的轮胎、施工锥桶、甚至一只流浪猫。传统检测器如果没训练过这些类别,基本就废了。Occupancy网络不管这些,它只判断「有没有东西」。我在实际路测中遇到过一只突然窜出来的狗,3D检测器没识别出来,但Occupancy网络成功标记了那个区域。

2. 可行驶区域判断

自动驾驶最怕什么?不是撞到车,而是开到不该开的地方。Occupancy网络能给出非常精细的可行驶区域。每个体素的占用状态,其实就是一张「能不能走」的地图。我习惯把占用概率低于某个阈值的区域标为绿色,告诉规划模块:这里安全,放心走。

3. 动态物体跟踪

Occupancy网络天然支持时序信息。你把连续几帧的占用网格叠在一起,就能看出哪些格子从「空闲」变成「占用」——这就是运动物体。我曾经用这种方法做简单的运动检测,效果出奇的好,而且不需要任何标注数据。

注意:Occupancy网络的计算量确实大。我在Jetson Orin上跑过,体素分辨率设到0.2米时,单帧推理时间接近80ms。部署时一定要做量化剪枝,不然帧率上不去。

小结

Occupancy网络不是要取代3D检测,而是补充。它擅长处理传统方法搞不定的场景——不规则物体、未知类别、精细空间描述。如果你正在做自动驾驶的感知模块,我建议你把两者结合起来用。

下一章,咱们聊聊Occupancy网络的模型结构,看看它到底是怎么把点云变成占用网格的。到时候我会拿出我实际部署过的代码,一步步拆解。