想象你是一位蒙眼管家,要在堆满家具的客厅里安全穿行。你手里有一支魔法扫描笔,每挥动一下,就能把面前的空间切成一格一格的“小积木”,并告诉你每块积木里是“有东西”还是“空着”。更神奇的是,这支笔还能“猜”出被沙发挡住的角落里藏着什么。在自动驾驶的世界里,OccNet就是这支魔法扫描笔——它把相机或雷达看到的画面,变成一张三维的“占用地图”,每个小格子都标着“这里有没有障碍物”,哪怕被前车挡住,它也能推理出后方更远的路况。这篇文章就从这支笔的“为何需要、如何构造、怎样工作、能做什么”一步步展开,帮你建立对下一代自动驾驶感知技术——占用网络——的完整直觉。

岗位关联

掌握OccNet,等于给自动驾驶感知装上一副“透视眼”:不再依赖稀疏点云或二维图像,而是用体素化占用场理解整个三维空间,这是从“看得见”到“看得懂”的关键一跃,也是自动驾驶、机器人导航领域高价值岗位的核心技能。

目录
  1. 可视化演示
  2. 感知痛点:为什么传统方案不够用
  3. 体素化表示:把世界变成乐高积木
  4. 网络结构:编码器与解码器的分工
  5. 输入与输出:传感器的“翻译官”
  6. 鲁棒性优势:被挡住也能看见
  7. 应用价值:从“看见”到“行动”
  8. 未来展望:从占用网络走向世界模型
  9. AI 应用场景
  10. Python 演示
  11. 常见误区
  12. 面试题

可视化演示

动态演示OccNet占用网络的核心机制,通过全局/局部/动态/静态四种模式展示关键概念与交互流程。

本节配有交互动效(进入视口后自动加载,约 3KB)。

OccNet占用网络:占用网络 占用网络核心思想与动机 体素化表示与输入输出 核心机制可视化 OccNet占用网络整体架构与关键组件

感知痛点:为什么传统方案不够用

魔法扫描笔诞生前,自动驾驶就像一个近视眼却要高速奔跑的人。传统感知方案中,2D图像只告诉我们“哪儿有颜色”,却没有深度,像是蒙着眼睛摸象;激光雷达点云虽然给了一个个坐标点,却在远处稀疏得像夜空里的星星。BEV视角试图把世界拍扁成一张俯视图,可一旦有卡车挡住前面的小轿车,BEV就只能在图上留下一个空洞。

这些痛点催生了“占用网格”的思路:不再执着于“这个物体是什么形状”,而是直接问“这个三维小格子到底有没有东西”。过去感知系统追求“检测出一个个目标”,但现实世界连续且充满遮挡,目标检测的结果往往是碎片化的。占用网络换了一种更底层的提问方式,把三维空间均匀网格化,用概率回答每个格子的状态。

用数学语言描述这种“稀疏困境”,可以定义一个稀疏率:

所以,感知痛点的本质是“看得见的部分太少,看不见的部分全靠猜”。占用网络的目标,就是把“猜”变成“算”。

S=1−NoccupiedNtotalS = 1 - \frac{N_{\text{occupied}}}{N_{\text{total}}}
$S$ 表示三维空间中“有记录的格子”占比有多低。激光雷达在一帧里可能只照亮了千分之一的体素,剩下的都是问号。
  1. 总格子数$N_{\text{total}}$ 是把世界切成格子后所有格子的数量,相当于魔法扫描笔能检查的所有“小积木”。
    Ntotal=width×height×depthN_{\text{total}} = \text{width} \times \text{height} \times \text{depth}
  2. 有占用记录的格子$N_{\text{occupied}}$ 是传感器能明确看到有物体的格子,好比管家亲眼摸到的家具。
    Noccupied=已知有物体的格子数N_{\text{occupied}} = \text{已知有物体的格子数}
  3. 稀疏率$S$ 越大说明传感器看到的越少,留下的盲区越多,这就是传统方案最大的软肋。
    S=1−NoccupiedNtotalS = 1 - \frac{N_{\text{occupied}}}{N_{\text{total}}}

体素化表示:把世界变成乐高积木

魔法扫描笔的另一个高明之处,是把世界当成一堆乐高积木:每个格子就像一块乐高颗粒,颗粒里有没有东西,就是它的“占用状态”。在人工智能里,这种颗粒被称为体素(Voxel),也就是三维世界中的“3D像素”。

每个体素不再是一个简单的是或否,而是一个连续的概率值。这样做的好处是:神经网络可以用可微的方式学习,还能表达“这个格子大概率空着、那个格子可能被占了一半”这样的模糊状态。占用网络通常用隐式场(Implicit Field)来表示,网络不是一个巨大的框,而是一个函数,输入坐标,输出占据概率。

体素化表示的核心公式:

乐高积木的好处是可以自由拼接。体素化表示让自动驾驶拿到了一个规整、可计算、可求导的“三维乐高地图”,这是后续所有聪明操作的基础。

O(v)=σ(f(v))=11+e−f(v)O(v) = \sigma(f(v)) = \frac{1}{1 + e^{-f(v)}}
这里 $v$ 是任意一个三维坐标点,$f(v)$ 是网络对这个点打的原始“质感分”,再用 Sigmoid 函数压成 0 到 1 之间的概率。1 表示“肯定有东西”,0 表示“肯定空着”。
  1. 坐标输入$v$ 是一个体素的三维坐标,比如 $(0.5, 0.2, 1.0)$。
    v=(x,y,z)v = (x, y, z)
  2. 特征打分$f(v)$ 是神经网络对这个坐标给出的原始分数,相当于管家摸到积木后心里估的“厚度感”。
    f(v)=MLP(v)f(v) = \mathrm{MLP}(v)
  3. 概率压缩$\sigma$ 将任意实数映射到 $[0,1]$,从而可以解释为“被占据的概率”。
    σ(z)=11+e−z\sigma(z) = \frac{1}{1 + e^{-z}}

网络结构:编码器与解码器的分工

扫描笔内部其实有两位助手:一位负责“看”,一位负责“画”。在深度学习中,“看”对应编码器(Encoder),“画”对应解码器(Decoder)。编码器把多视角相机、雷达的特征压缩成一个“记忆胶囊”式的特征表示;解码器再根据这个记忆,在每一个体素位置“画”出占用概率。

为什么需要多视角输入?因为单张相机图相当于管家只从客厅门口看了一眼,难免有盲区。多视角融合后,扫描笔能把客厅四面墙的信息都记在脑子里,再综合判断。雷达则提供精确距离,补足相机对深度的弱点。这就像管家既用眼睛看,又用手杖敲一敲地面判断远近。

网络结构可以简化为一个端到端的映射:

编码器与解码器的分工,让扫描笔既能“过目不忘”,又能“按图索骥”,最终画出整个三维世界的占用图。

G=Decoder(Encoder(Imulti))\mathcal{G} = \mathrm{Decoder}(\mathrm{Encoder}(I_{\text{multi}}))
$I_{\text{multi}}$ 是多张图像和点云特征拼接后的输入,编码器把它提炼成特征张量,解码器再把这个张量还原成每个体素是否被占用的概率场。
  1. 多传感器特征$I_{\text{multi}}$ 表示多个摄像头图像和雷达点云经特征提取后的综合输入。
    Imulti=Fusion(Cam1,Cam2,…,Lidar)I_{\text{multi}} = \mathrm{Fusion}(\mathrm{Cam}_1, \mathrm{Cam}_2, \dots, \mathrm{Lidar})
  2. 编码器提炼$\mathrm{Encoder}$ 把高维度像素特征压缩成紧凑的空间语义特征 $F$。
    F=Encoder(Imulti)F = \mathrm{Encoder}(I_{\text{multi}})
  3. 解码器重建$\mathrm{Decoder}$ 以 $F$ 为条件,对每个三维位置输出占用概率,形成完整的占用网格。
    G=Decoder(F)\mathcal{G} = \mathrm{Decoder}(F)

输入与输出:传感器的“翻译官”

魔法扫描笔要工作,需要插上各种各样的“探头”:摄像头、激光雷达、毫米波雷达。OccNet就像一个多语种翻译官,把不同传感器的“语言”统一翻译成同一种三维占用语言。

输入层的关键是数据对齐:相机的图像是二维的,激光雷达的点云是三维的,它们坐标系不同、密度不同。OccNet通过特征投影(Projection)和体素化操作,把这些不同来源的数据先投到同一个三维格子空间里,再进行融合。输出则是一个体素张量,每个体素不仅携带“被占据的概率”,还可以携带语义标签,比如“路面”“车辆”“行人”。

用公式表示输出维度:

这样一来,自动驾驶系统拿到的不再是零散的“检测框”,而是一整张“三维安全地图”。

Y=[O(v1),O(v2),…,O(vN)]Y = \left[ O(v_1), O(v_2), \dots, O(v_N) \right]
$Y$ 就是一组概率值,$N$ 是所有体素的数量。如果体素分辨率是 $0.4$ 米,在一百米范围内,$N$ 可以达到百万级别。
  1. 体素数量$N$ 等于区域体积除以单个体素体积,分辨率越高,$N$ 越大。
    N=V场景V体素N = \frac{V_{\text{场景}}}{V_{\text{体素}}}
  2. 逐个输出网络的最后一层对每个体素独立打分,形成并行输出。
    Yi=O(vi)Y_i = O(v_i)
  3. 组合成张量把所有体素概率排列成一个规则的张量,方便后续规划算法直接读取。
    Y=(Y1,Y2,…,YN)Y = (Y_1, Y_2, \dots, Y_N)

鲁棒性优势:被挡住也能看见

扫描笔最让管家惊喜的,是它能猜出沙发后面的东西。传统感知系统一旦物体被遮挡,往往直接“失明”;但占用网络因为学习到了场景的先验结构,可以根据周围可见的轮廓、常见的空间布局,推断出被遮挡区域的大致占用情况。

这种能力被称为遮挡推理(Occlusion Reasoning)。数学上,它是在计算一个后验概率:在已知传感器观测 $I$ 和部分已经建好的地图 $M$ 的条件下,某个体素被占用的概率。贝叶斯公式在这里派上了用场:

这种贝叶斯式的“脑补”让占用网络在遮挡、雨雪、夜间等复杂场景下,依然能给出相对完整的几何结构,比传统检测方案更稳。

P(O∣I,M)=P(I,M∣O) P(O)P(I,M)P(O \mid I, M) = \frac{P(I, M \mid O) \, P(O)}{P(I, M)}
$O$ 表示“这一格被占用”,$P(O)$ 是“对历史数据的先验估计”。当传感器没看到这格时,后验概率会倾向于用先验和周围环境来补齐,而不是简单当作空。
  1. 先验概率$P(O)$ 是看到当前传感器数据之前,根据日常驾驶经验估计该格子被占用的概率。
    P(O)=先验分布P(O) = \text{先验分布}
  2. 似然函数$P(I, M \mid O)$ 表示“如果这一格真有东西,那么看到当前传感器图像和地图的可能性有多大”。
    P(I,M∣O)=传感器观测模型P(I, M \mid O) = \text{传感器观测模型}
  3. 归一化证据分母 $P(I, M)$ 是所有可能情况的总和,相当于把所有假设放在一起比较后归一化。
    P(I,M)=∑O′P(I,M∣O′)P(O′)P(I, M) = \sum_{O'} P(I, M \mid O') P(O')
  4. 后验概率最终的 $P(O \mid I, M)$ 就是综合“我看到的”和“我猜的”之后的最佳估计。
    P(O∣I,M)=P(I,M∣O)P(O)P(I,M)P(O \mid I, M) = \frac{P(I, M \mid O)P(O)}{P(I, M)}

应用价值:从“看见”到“行动”

扫描笔最终的目的是让管家安全地走到目的地。对自动驾驶而言,“看见”三维占用网格只是开始,真正的价值在于它能直接帮助车辆做规划与决策。

有了占用网格,规划模块可以像“走迷宫”一样,在已知空着的格子里找一条安全路径。任何被占用的格子都相当于墙,车轮不能压过去。同时,因为网格是连续的、可微的,规划算法可以更好地预判未来几秒的运动空间。安全距离的计算也变得更直观:

占用网络让“看见的世界”和“可行动的世界”打通了:一个格子的有无直接决定方向盘和刹车的控制,这正是它从论文走向量产的根本原因。

dsafe=v×treact+dbraked_{\text{safe}} = v \times t_{\text{react}} + d_{\text{brake}}
$v$ 是当前车速,$t_{\text{react}}$ 是系统反应时间,$d_{\text{brake}}$ 是刹车距离。占用网格能提前告诉车辆哪些区域绝对不可进入,把车速和路径限制在安全范围内。
  1. 反应距离$v \times t_{\text{react}}$ 表示从发现危险到开始刹车这段反应时间内车走过的距离。
    v×treact=车速×反应时间v \times t_{\text{react}} = \text{车速} \times \text{反应时间}
  2. 刹车距离$d_{\text{brake}}$ 是制动系统从踩下刹车到完全停下需要的距离。
    dbrake=v22amax⁡d_{\text{brake}} = \frac{v^2}{2a_{\max}}
  3. 最小安全距离两者相加就是车辆在任何时刻至少应保持的纵向安全距离。
    dsafe=v×treact+dbraked_{\text{safe}} = v \times t_{\text{react}} + d_{\text{brake}}

未来展望:从占用网络走向世界模型

魔法扫描笔还会不断升级。现在它只能回答“这里有没有东西”,未来它会回答“这里将发生什么”。占用网络与时间维度结合,就能预测下一帧的占用状态,从而让自动驾驶拥有“预知”能力。

这种趋势正在和端到端自动驾驶、大模型融合。占用网络可以被当作一种“世界模型”的基础表示——车辆不仅理解当前三维结构,还学会了世界如何演变。同时,为了上车,模型轻量化、算力优化、传感器标准统一都是必经之路。未来占用网格的分辨率会更高、更新会更快、语义会更丰富。

可以用一个算力公式来理解分辨率的影响:

未来,占用网络会从“感知模块”演变为“可预测的世界模型”,成为自动驾驶通往更高阶智能的关键基石。

C=k×R3C = k \times R^3
$C$ 是计算量,$R$ 是网格在每个方向上的分辨率。分辨率翻一倍,计算量会变成原来的八倍,所以工程上需要在精度和实时性之间做平衡。
  1. 基础系数$k$ 是网络实现的效率系数,相当于扫描笔扫描每个格子的耗时。
    k=单格子平均计算开销k = \text{单格子平均计算开销}
  2. 分辨率$R$ 表示单方向上体素的数量,分辨率越高,体素越小,细节越丰富。
    R=场景长度单个体素边长R = \frac{\text{场景长度}}{\text{单个体素边长}}
  3. 立方爆炸三维空间中体素总数与 $R$ 的三次方成正比,因此计算量随分辨率急剧上升。
    C=k×R3C = k \times R^3

AI 应用场景

自动驾驶乘用车

阶段:感知融合与规划决策

解决的问题:传统感知方案在遮挡、切出场景下容易漏检,比如前车突然急刹,后方车辆被挡住。占用网络通过补全被遮挡区域,提前预警,缩短系统反应时间。

具体案例:某品牌城市NOA系统在通过路口时,用占用网络补全了左侧大车遮挡区域内的行人轨迹,车辆可以提前减速避让,安全通过复杂路口。

矿区与园区无人运输

阶段:高精地图构建与环境理解

解决的问题:矿区粉尘大、雷达噪声多,传统点云分割很不稳定。占用网络天然对噪声鲁棒,能输出完整的几何占用场,为无人矿卡提供可靠的可行驶区域。

具体案例:某矿区无人驾驶方案用占用网络生成动态障碍物地图,遇到堆料区边缘也能精准停靠,减少了对高精地图的依赖。

智能座舱与车内感知

阶段:多传感器融合与场景补全

解决的问题:座舱内摄像头会被座椅、乘员遮挡,导致儿童遗留检测失效。占用网络可以利用多摄像头+毫米波重建座舱三维占用场,识别被毯子盖住的儿童体态。

具体案例:某车企的儿童遗留检测系统利用占用网络补全被覆盖区域,一旦检测到类似儿童体积的占用体素,立即触发报警并自动通风。

Python 演示

python56 行
import numpy as np class OccGrid:    def __init__(self, width, height, cell_size):        self.cell_size = cell_size        self.nx = int(width / cell_size)        self.ny = int(height / cell_size)        self.grid = np.zeros((self.nx, self.ny))     def simulate_scan(self, obstacles):        # 模拟从左侧射出的扫描线,只有未被遮挡的最前侧障碍会被观测到        for ix in range(self.nx):            x = (ix + 0.5) * self.cell_size            for iy in range(self.ny):                y = (iy + 0.5) * self.cell_size                for ox, oy, ow, oh in obstacles:                    if ox <= x <= ox + ow and oy <= y <= oy + oh:                        self.grid[ix, iy] = 1.0                        break     def complete_occlusion(self, obstacles):        # 用已知障碍物先验补全被遮挡的格子        for ix in range(self.nx):            x = (ix + 0.5) * self.cell_size            for iy in range(self.ny):                y = (iy + 0.5) * self.cell_size                if self.grid[ix, iy] < 0.5:                    for ox, oy, ow, oh in obstacles:                        if ox <= x <= ox + ow and oy <= y <= oy + oh:                            self.grid[ix, iy] = 0.7                            break     def accuracy(self, ground_truth):        pred = self.grid > 0.5        gt = ground_truth > 0.5        return float(np.mean(pred == gt)) def main():    width, height = 100, 50    grid = OccGrid(width, height, cell_size=5)    obstacles = [(30, 10, 20, 25), (45, 10, 15, 15)]    grid.simulate_scan(obstacles)    grid.complete_occlusion(obstacles)    ground_truth = np.zeros((grid.nx, grid.ny))    for ix in range(grid.nx):        for iy in range(grid.ny):            x = (ix + 0.5) * grid.cell_size            y = (iy + 0.5) * grid.cell_size            for ox, oy, ow, oh in obstacles:                if ox <= x <= ox + ow and oy <= y <= oy + oh:                    ground_truth[ix, iy] = 1.0    print('占用网格准确率:', round(grid.accuracy(ground_truth), 3))    print('补全后占用格子数:', int((grid.grid > 0.5).sum())) if __name__ == '__main__':    main()
目的:演示占用网络最核心的“部分观测 + 遮挡补全”思想,用体素网格模拟激光扫描,再用先验知识补全被遮挡区域,最后对比真值计算准确率。
  1. class OccGrid定义一个二维占据网格,相当于文章里说的体素化世界。
  2. simulate_scan(obstacles)模拟传感器从左侧扫描,只有第一个碰到的障碍物会被记录。
  3. complete_occlusion(obstacles)基于障碍物位置先验,把未观测到但有障碍的格子补上概率 0.7。
  4. self.grid存储每个格子的占据概率,0 表示空,1 表示确定被占。
  5. accuracy(ground_truth)用预测与真值之间的平均一致性,评估补全效果。

常见误区

误区很多人觉得占用网络输出的网格地图就是高精地图,车辆可以直接拿来当导航地图用。

正解占用网络是感知结果,反映的是“当前时刻、传感器能感知到的区域”的占用情况;而高精地图是预先制作的全局静态地图。两者一个像管家用扫描笔“实时看附近”,一个像客厅的装修图纸。占用网络可以用来更新高精地图,但不能替代它。

为何常见:因为两者都呈现网格状的道路结构,且都能指导驾驶,容易混淆“感知”和“先验地图”的界限。

误区新手常认为体素越小、网格越细,占用网络效果越好,于是盲目追求高分辨率。

正解分辨率翻倍,计算量变成八倍,对显存和实时性压力巨大。真实产品需要在“足够感知”和“算力可承受”之间取平衡,通常选择 0.2~0.5 米的体素尺寸。

为何常见:人类直觉会觉得像素高图片更清晰,但三维体素的算力爆炸式增长是反直觉的。

误区以为占用网络只是替代目标检测的“升级版感知器”,和规划无关。

正解占用网络输出的场景表征天生适合规划模块。它能提供连续的自由空间和碰撞风险约束,还能预测未来占用状态,是连接感知与决策的桥梁。

为何常见:因为大多数教程只讲物体检测,容易把感知限定在一个框内,忽略了输出表征对下游任务的重大价值。

误区认为激光雷达能精确扫描三维空间,遮挡区域反正扫不到,占用网络补全只是锦上添花。

正解雷达点云同样存在稀疏、远距低分辨率、恶劣天气衰减问题。占用网络的补全能力可以在雷达盲区提供概率性预测,还能与摄像头语义融合,显著提升极端场景下的安全冗余。

为何常见:因为大家默认雷达“看得远、测得准”,忽视了它在真实道路环境中的物理限制。

面试题

Q1. 占用网络输出的是什么?

单选题 · easy

  • A.一系列物体检测框
  • B.每个三维体素的占据概率← 正确答案
  • C.二维语义分割图
  • D.车辆行驶轨迹点

答案:B。占用网络的核心输出是体素网格中每个格子被占据的概率,而不是检测框或轨迹。选项 A 是目标检测,C 是图像分割,D 是规划模块输出,都不符合占用网络的定义。

Q2. 体素(Voxel)可以理解为?

单选题 · easy

  • A.二维图像中的像素
  • B.三维空间中的小立方体← 正确答案
  • C.一条传感器的扫描线
  • D.一种神经网络层

答案:B。体素就是“3D 像素”,把三维空间离散成一个个小立方体。A 说的是像素,C 是雷达扫描方式,D 是网络结构术语,都不对。

Q3. 为什么占用网络比点云检测在遮挡场景更鲁棒?

单选题 · mid

  • A.它的输入包含更多高精度雷达点
  • B.它用贝叶斯推理和先验补全被遮挡区域← 正确答案
  • C.它不需要任何传感器数据
  • D.它可以自动生成真实的高精地图

答案:B。占用网络通过后验概率融合先验知识,能在遮挡区域给出概率性推理补全。A 只是输入质量,C 不现实,D 高精地图是离线制作,不是传感器感知的产物。

Q4. 占用网络中的“Sigmoid 函数”作用是什么?

单选题 · mid

  • A.增加网络深度
  • B.把分数压缩到 0 到 1 之间← 正确答案
  • C.提升图像分辨率
  • D.实现多传感器同步

答案:B。Sigmoid 把任意实数映射到 (0,1),从而可以作为占据概率。A、C、D 都是错误理解,Sigmoid 不改变网络结构,也不负责传感器融合。

Q5. 哪些是占用网络的典型输入?

多选题 · mid

  • A.多相机图像← 正确答案
  • B.激光雷达点云← 正确答案
  • C.车辆油门踏板位置
  • D.毫米波雷达数据← 正确答案

答案:ABD。占用网络的输入来自环境感知传感器,包括相机、激光雷达和毫米波雷达。油门踏板是车身控制状态,不是环境感知输入。

Q6. 分辨率从 0.5m 提高到 0.25m,占用网络体素数量变为原来的多少倍?

单选题 · hard

  • A.2 倍
  • B.4 倍
  • C.8 倍← 正确答案
  • D.16 倍

答案:C。体素数量与分辨率的倒数立方成正比。0.5m 到 0.25m,每个方向细分数加倍,三维空间总体素变成 $2^3=8$ 倍,因此计算量骤增。

Q7. 占用网络的实际应用价值包括?

多选题 · mid

  • A.为规划决策提供安全空间← 正确答案
  • B.感知被遮挡区域← 正确答案
  • C.替代刹车系统硬件
  • D.支持无地图环境下的复杂道路行驶← 正确答案

答案:ABD。占用网络给规划提供自由空间约束,能补全遮挡区域,还能在无高精地图场景下感知路况。但替代刹车硬件不属于感知算法范畴。

Q8. 在占用网络输出中加入语义标签,主要为了解决什么问题?

单选题 · hard

  • A.让格子更美观
  • B.区分“可压过”和“不可压过”的占用物← 正确答案
  • C.增加运算速度
  • D.代替目标检测中的分类头

答案:B。纯几何占用只能知道“有东西”,无法判断是马路牙子还是行人。语义标签让规划模块区分可通行与不可通行物体,例如路沿可以压过,行人绝对不行。

Q9. 关于占用网络的鲁棒性,下列说法正确的有?

多选题 · hard

  • A.对点云稀疏性更敏感
  • B.能通过先验推理遮挡区域← 正确答案
  • C.可以输出连续可微的场景表征← 正确答案
  • D.对雨雪天气反而更差

答案:BC。占用网络比传统方法对点云稀疏更鲁棒,因为它不依赖完整点云,还能用先验补全;输出是连续概率场,可微可用于规划;雨雪天气的影响需要通过传感器融合缓解,而不是更差,因此 A、D 错误。

Q10. 占用网络中的“BEV”指的是什么?

单选题 · easy

  • A.Bird's Eye View,鸟瞰图视角← 正确答案
  • B.一种神经网络激活函数
  • C.一种激光雷达型号
  • D.一种高精地图格式

答案:A。BEV 是鸟瞰视角,是把三维世界投影到二维俯视图。占用网络虽然经常结合 BEV 特征,但它本身输出的是三维体素占用场,比 BEV 多了高度信息。