你刚搬进一间新租的房子,映入眼帘的是空荡荡的客厅。你想知道:沙发能不能靠墙放?床底能不能塞行李箱?衣柜后面还有多少空隙?光靠站在门口看几眼,永远无法知道家具背后藏着什么。于是你拿出方格纸,把房间画成一个个小格子,从不同角度拍几张照片,然后开始猜测:这个格子有东西,那个格子空着。 这就是 3D 占据网络(Occupancy Network)要做的事:把物理空间切成密密麻麻的小格子(体素),让 AI 回答——“这个位置,到底有没有被东西占据?”TPVFormer 像一个拿着三台相机从俯视、前视、侧视三个方向拍摄的“空间摄影师”,OccNet 则像一位经验丰富的“空间盘点员”,根据照片迅速在每个格子上盖章:占、空、占、空。这篇内容,就是带你亲手搭建这套“空间盘点系统”。

岗位关联

对 AI 从业者而言,占据网络是自动驾驶与具身智能的底层感知能力之一。掌握它,等于拿到了 3D 视觉领域“高薪岗位”的入场券。

目录
  1. 可视化演示
  2. 1. 盘点需求与体素:为什么要把世界切成格子
  3. 2. 体素空间表示:把世界切成标准积木
  4. 3. 隐式占据函数:用函数回答“这里有没有东西”
  5. 4. TPVFormer:三视图编码如何构建 3D 特征
  6. 5. OccNet 解码器:从特征到占据概率
  7. 6. 损失与训练:教练是怎么给盘点员打分的
  8. 7. 评估与优化:怎么判断盘点师水平高不高
  9. 8. 实战与落地:从论文走向自动驾驶
  10. AI 应用场景
  11. Python 演示
  12. 常见误区
  13. 面试题

可视化演示

展示3D体素占据预测、TPVFormer三视角表示与评估指标应用,交互切换理解占据网络核心技术。

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

'+modeData.voxel.caption+'

1. 盘点需求与体素:为什么要把世界切成格子

想象你在规划新家的家具摆放。如果只靠“沙发大约在客厅中间”这种模糊描述,你根本没法决定茶几和电视柜的距离。你需要的是一张带坐标的平面图。占据网络诞生前的 3D 感知,就像只说“那有个沙发”——它给物体套一个边界框,也就是一个规规矩矩的长方体。可现实世界里有斜停的车、伸展的树枝、弯曲的人行道护栏,长方体永远“套不准”。

于是工程师们换了个思路:不再找物体在哪里,而是把整个空间铺满细小格子,然后逐个回答“这个格子被占了吗”。每一个三维小格子,就叫一个体素,它是“三维像素”的简称。整片空间的体素集合构成了一张“占据图纸”,每个格子上的值就是占据概率,0 表示确定空闲,1 表示确定被占。

这个转变的本质,是把“识别物体”变成了“逐格分类”。就像你不再问“沙发长什么样”,而是拿一支笔在图纸上把沙发占过的格子全部涂黑。无论物体形状多不规则,只要格子够小,图纸就能精确还原它。

回到搬家的比喻:体素网格就是那张方格纸,占据概率就是你在每个格子上画的铅笔记号。记号越黑,代表你越确定那里有家具。整张纸填满,房间的空间规划就一目了然了。

Voccupancy  =  { vi,j,k∈[0,1]  ∣  1≤i≤W,  1≤j≤H,  1≤k≤D }\displaystyle V_{\text{occupancy}} \;=\; \{\, v_{i,j,k} \in [0, 1] \;\mid\; 1 \le i \le W,\; 1 \le j \le H,\; 1 \le k \le D \,\}
占用网格 V 就是一个三维数组,其中每个体素是一个 0 到 1 之间的概率值。
  1. 占据体素集合$V_{\text{occupancy}}$ 表示整个空间占据状态的离散化结果。
    VoccupancyV_{\text{occupancy}}
  2. 单个体素值$v_{i,j,k}$ 是坐标 $(i,j,k)$ 处格子被占据的概率,越接近 1 越确信有物体。
    vi,j,k∈[0,1]v_{i,j,k} \in [0,1]
  3. 三个维度$W, H, D$ 分别对应空间的宽、高、深三个方向的体素数量。
    1≤i≤W,  1≤j≤H,  1≤k≤D1 \le i \le W,\; 1 \le j \le H,\; 1 \le k \le D

2. 体素空间表示:把世界切成标准积木

有了方格纸,下一个问题是用多大比例的方格。同样一间房,用拳头大的积木拼,能看清整体布局但丢失细节;用指甲盖大的积木拼,细节丰富但拼一座“房”可能需要上万块。这个“积木大小”在占据网络中叫分辨率——体素边长越短,分辨率越高,空间刻画越精细。

分辨率会带来残酷的算力账。如果体素边长减半,那么宽、高、深三个方向各自多出一倍格子,总体积数变成原来的 8 倍。一个 200 米的自动驾驶感知范围,用 0.1 米体素需要 $200^3 = 8 \times 10^6$ 个体素,让 GPU 压力陡增。所以工程上必须在“看得清”和“算得动”之间找平衡。

除了分辨率,还有坐标系标定问题。传感器(相机、激光雷达)测到的是“物体在传感器前方多少米”,而占据网格要回答“物体在这片道路空间的哪个格子”。这中间需要把传感器坐标换算到统一的世界坐标,再换算到体素坐标,就像你把手机拍的房间照片,投影到你手绘的方格纸上一样。

这就像你用乐高积木还原房间:先统一“每块积木代表多少厘米”的约定,再计算某件家具的坐标对应底板上第几排第几列。约定越统一,拼出来的模型越准确。

(cx,cy,cz)  =  ⌊ (xw−x0,  yw−y0,  zw−z0)s ⌋\displaystyle (c_x, c_y, c_z) \;=\; \left\lfloor\, \frac{(x_w - x_0, \; y_w - y_0, \; z_w - z_0)}{s} \,\right\rfloor
世界坐标 $(x_w,y_w,z_w)$ 减去网格原点 $(x_0,y_0,z_0)$ 后除以体素边长 $s$,向下取整得到体素坐标。
  1. 体素坐标$(c_x, c_y, c_z)$ 是某个点落在第几行第几列第几层格子的编号。
    (cx,cy,cz)(c_x, c_y, c_z)
  2. 物理坐标与原点差$(x_w - x_0)$ 先算出点相对网格起点的偏移量。
    (xw−x0,  yw−y0,  zw−z0)(x_w - x_0, \; y_w - y_0, \; z_w - z_0)
  3. 除以边长并取整$s$ 是体素边长,$\lfloor \cdot \rfloor$ 表示向下取整,得到所在格子的整数编号。
    ⌊⋅s⌋\left\lfloor \frac{\cdot}{s} \right\rfloor

3. 隐式占据函数:用函数回答“这里有没有东西”

传统的 3D 重建会直接输出一个三角形网格,像用纸糊出一个雕塑表面。但纸糊的雕塑内部是空的,你不知道“桌子底下能不能塞箱子”。占据网络改用一种更聪明的表达——隐式函数:不直接给表面,而是给一个“万能查询员”,你报出任意一个空间坐标,他立刻回答这个位置被占据的概率。

这个函数的输入是两部分:一个是查询点 $p$,即你想问的空间位置;另一个是条件编码 $e_c$,可以理解为从图像或点云中提取的“房间全景印象”。函数输出就是占据概率。由于函数是连续的,你可以用任意分辨率去查询——想粗看就隔 1 米问一次,想细看就隔 1 厘米问一次,完全不需要重新训练网络。

这就好比你有了一位熟悉新家的管家。你不必把整间屋子的家具位置全部背下来,只需要问“窗台下面能放这个箱子吗”,管家结合他对房间的整体印象(条件编码),心算一下就能给出“能放,有 90% 把握空隙够”的答复。管家从不给你一张固定的家具清单,但任何位置你都能问。

这位“万能查询员”就是隐式函数的魅力:位置是连续坐标,输出是概率,空间里没有一处是他回答不了的死角。

o(p)  =  fθ( p,  ec ),o(p)∈[0,1]\displaystyle o(p) \;=\; f_{\theta}\big(\,p,\; e_c\,\big), \qquad o(p) \in [0,1]
占据网络 $\theta$ 定义一个映射:把空间坐标和条件特征变成 0 到 1 的占据概率。
  1. 占据概率输出$o(p)$ 表示查询点 $p$ 处被物体占据的概率。
    o(p)=fθ(p,ec)o(p) = f_{\theta}(p, e_c)
  2. 网络参数$\theta$ 是神经网络中所有可学习权重,训练过程就是不断调整 $\theta$。
    fθf_{\theta}
  3. 条件编码$e_c$ 是由图像/点云编码出的全局特征,告诉“管家”房间的大致情况。
    ece_c
  4. 概率约束输出被限制在 $[0,1]$,方便后续当作二分类概率使用。
    o(p)∈[0,1]o(p) \in [0,1]

4. TPVFormer:三视图编码如何构建 3D 特征

想让“管家”回答得准,他得先好好“看房”。但直接对整块 3D 空间做卷积,计算量像把整栋楼拆成积木逐块检查,非常昂贵。TPVFormer 想出一个聪明的折中办法:只从三个垂直方向看——俯视图(鸟瞰)、前视图、侧视图。

如果你站在房间正上方往下看,能看到家具的平面布局却看不到高度;站在正前方看,能看到面前这面墙却看不到墙后;站在侧面试试,又能补上第三个维度的信息。TPVFormer 把 3D 特征分解成三个 2D 视图平面,每个视图只负责记录两个方向的变化。这样三维卷积被分解成三个二维卷积,计算量大幅下降,却几乎不丢失空间信息。

三个视图之间还需要“对答案”。某个柱子可能在俯视图里是一个点,在前视图里是一条竖线,在侧视图里还是一条竖线。TPVFormer 用跨视图注意力让三个平面互相校准——每个平面在构建某个体素的特征时,会主动询问另外两个平面“你们在这个位置看到了什么”,然后把三方信息融合。

三位摄影师各守一方,拍摄结束后互相拼照片、对细节,最终合成一张几乎没有盲区的三维空间特征图。这就是三视图注意力协同的要义。

Attention(Q,K,V)  =  softmax ⁣(QK⊤dk)V\displaystyle \mathrm{Attention}(Q,K,V) \;=\; \mathrm{softmax}\!\left(\frac{QK^{\top}}{\sqrt{d_k}}\right) V
注意力机制让每个查询特征从键值对中按相关性加权提取信息,是跨视图融合的核心运算。
  1. 查询矩阵$Q$ 是查询方,代表当前视图想了解的某个体素特征。
    QQ
  2. 键与值$K,V$ 分别来自另外两个视图,$K$ 负责“对得上号吗”,$V$ 是真正要拿走的特征内容。
    K,VK, V
  3. 相关性打分$QK^{\top}$ 计算查询与所有键的相似度,除以 $\sqrt{d_k}$ 防止内积过大,再用 $\mathrm{softmax}$ 归一化成权重。
    softmax(QK⊤dk)\mathrm{softmax}\left(\frac{QK^{\top}}{\sqrt{d_k}}\right)
  4. 加权求和把权重乘到 $V$ 上再相加,得到融合后的特征。
    (QK⊤dk)V\left(\frac{QK^{\top}}{\sqrt{d_k}}\right) V

5. OccNet 解码器:从特征到占据概率

把空间特征准备好之后,就该轮到“盘点员”上场了。OccNet 采用经典的编码器-解码器结构:编码器部分通常是一个 2D 卷积网络,把多张图像或点云压缩成紧凑的特征向量;解码器部分则是一个小型的多层感知机(MLP),负责把前面 TPVFormer 生成的体素特征翻译成占据概率。

对空间中的任意一个查询点,OccNet 先从三视图特征中取出它对应的特征向量 $z_p$,然后送入 MLP。MLP 内部经过几层线性变换和激活函数,最后通过一个 Sigmoid 函数把输出压缩到 0 到 1 之间,作为占据概率。整个过程就像一个流水线:特征仓库(编码器)→ 特征调取(索引 $z_p$)→ 质检盖章(MLP + Sigmoid)。

因为 MLP 接受的是连续坐标对应的连续特征,OccNet 天然支持连续场重建。测试时想用 $0.2$ 米的体素还是 $0.05$ 米的体素,只需改变查询点的采样密度,网络无需任何改动。这就像同一台打印机,你可以用 300dpi 打印海报,也能用 1200dpi 打印照片,墨水配方完全不用换。

盘点员不关心整间屋子长什么样,他只专注一件事:给我这个格子的特征,我告诉你它被占的把握有多大。

o(p)  =  σ ⁣( MLP(zp) ),σ(x)=11+e−x\displaystyle o(p) \;=\; \sigma\!\left(\,\mathrm{MLP}\big(z_p\big)\,\right), \qquad \sigma(x) = \frac{1}{1 + e^{-x}}
体素特征 $z_p$ 经 MLP 映射后,再经过 Sigmoid 激活,输出即为占据概率。
  1. 体素特征$z_p$ 是查询点 $p$ 对应位置的融合特征向量。
    zpz_p
  2. 多层感知机$\mathrm{MLP}(\cdot)$ 是一串全连接层加非线性激活,负责特征到分数的映射。
    MLP(zp)\mathrm{MLP}(z_p)
  3. Sigmoid 压缩$\sigma(x)$ 把任意实数压到 0 和 1 之间,便于解释成概率。
    σ(x)=11+e−x\sigma(x) = \frac{1}{1 + e^{-x}}

6. 损失与训练:教练是怎么给盘点员打分的

训练占据网络,就像教练训练新来的盘点员。教练手里有一份标准答案——真值体素网格,它告诉我们每个格子实际是占还是空。盘点员每报一个概率,教练就按“错得越离谱,扣分越狠”的原则打分,这个评分公式就是交叉熵损失。

真实场景通常有个棘手问题:自由空间永远比障碍物多得多。一整条街的体素里,可能 95% 都是空的,只有 5% 被汽车、行人、路灯占据。如果教练对所有格子一视同仁,盘点员很快学会“偷懒”——干脆全部报“空”,反正大部分是对的。为了治这种病,工程师会加大“占据格子”的惩罚权重,或使用 Focal Loss 这类变体,让模型把注意力集中在少数难分类的占据格子上。

训练时的优化器策略也有讲究。Adam 优化器是默认选择,配合学习率衰减——训练初期用较大步长快速下降,后期缩小步长精细打磨,就像先粗线条临摹、再精修细节。整个过程反复迭代数万步,直到盘点员在训练集上的“错误扣分”稳定收敛。

教练的打分表越合理,盘点员成长就越快。交叉熵配合权重调节,让模型在每个格子上都不敢敷衍。

LBCE  =  − 1N∑n=1N[ ynlog⁡on  +  (1−yn)log⁡(1−on) ]\displaystyle \mathcal{L}_{\mathrm{BCE}} \;=\; -\, \frac{1}{N} \sum_{n=1}^{N} \Big[\, y_n \log o_n \;+\; (1 - y_n) \log (1 - o_n) \,\Big]
二值交叉熵损失逐格计算预测概率与真值标签的差异,再对所有格子取平均。
  1. 样本总数$N$ 是一次训练中参与计算的体素数量。
    NN
  2. 真值标签$y_n$ 是第 $n$ 个格子的真实占据标签,$y_n=1$ 表示被占,$y_n=0$ 表示空闲。
    yn∈{0,1}y_n \in \{0, 1\}
  3. 预测概率$o_n$ 是模型对第 $n$ 个格子的预测占据概率。
    on=o(pn)o_n = o(p_n)
  4. 两类对数惩罚$y_n \log o_n$ 惩罚“真占据却预测偏低”,$(1-y_n)\log(1-o_n)$ 惩罚“真空闲却预测偏高”。
    ynlog⁡on+(1−yn)log⁡(1−on)y_n \log o_n + (1-y_n)\log(1-o_n)
  5. 平均化最外层 $-\frac{1}{N}\sum$ 把所有格子的惩罚取平均,得到最终损失。
    LBCE\mathcal{L}_{\mathrm{BCE}}

7. 评估与优化:怎么判断盘点师水平高不高

盘点师训练完毕,要上岗了。怎么考核他的水平?如果只看“报对的格子数”,因为空格占大多数,一个无脑报“全空”的模型也能拿高分。所以行业标准用 IoU(交并比) 指标:预测为占据的格子集合,和真实占据的格子集合,两者交集的大小除以并集的大小。

IoU 越高,说明预测的占据区域和真实占据区域重叠越多。它只在乎占据格子,所以“报全空”的偷懒方案得分为 0。团队还会在部署时做推理优化。一个常见技巧是“粗到细”:先用大格子快速扫描一遍全图,锁定几个“可能被占据”的候选区域,再在这些区域用细格子精查。就像找钥匙先扫一眼房间确定几个可疑角落,再蹲下来仔细翻每个角落,而不是趴在地上把整间房一寸寸摸过去。

此外还有稀疏化加速:连续空间里大量格子是空闲的,可以跳过不计算;知识蒸馏则让一个大而准的教师网络教一个小而快的学生网络,把知识压缩进更小的模型里,方便部署在车端芯片上。

考核标准定了,干活技巧也有了。盘点师学会了先看全局、再抠细节,用最少的力气把房间摸得最清楚。

IoU  =  TPTP+FP+FN\displaystyle \mathrm{IoU} \;=\; \frac{\mathrm{TP}}{\mathrm{TP} + \mathrm{FP} + \mathrm{FN}}
IoU 用真正例除以真正例加假正例加假负例,衡量预测占据区域与真实占据区域的重叠程度。
  1. 真正例$\mathrm{TP}$(True Positive)是预测被占、真实也被占的格子数。
    TP\mathrm{TP}
  2. 假正例$\mathrm{FP}$(False Positive)是预测被占、实际却空闲的格子数。
    FP\mathrm{FP}
  3. 假负例$\mathrm{FN}$(False Negative)是预测空闲、实际却被占的格子数。
    FN\mathrm{FN}
  4. 重叠率$\mathrm{TP} / (\mathrm{TP}+\mathrm{FP}+\mathrm{FN})$ 表示“正确命中的占据”在所有预测占据与实际占据总和里的占比。
    TPTP+FP+FN\frac{\mathrm{TP}}{\mathrm{TP} + \mathrm{FP} + \mathrm{FN}}

8. 实战与落地:从论文走向自动驾驶

一切理论最终要开上马路。在自动驾驶领域,占据网络正成为视觉感知的“地基”。传统目标检测只能告诉你“前方 30 米有一辆车”,而占据网络能告诉你“这辆车的右后方有个正在靠近的骑行者,虽然他被车挡住了一半”。这对于城市 NOA(领航辅助驾驶)来说,是决定刹车还是绕行的关键信息。

工程落地时,团队要面对真实数据的“脏乱差”。常用数据集如 nuScenes 提供了多相机、激光雷达与毫米波雷达的同步数据,而 Occ3D 这类基准则专门评估占据预测的精度。真值标签是通过累计多帧激光雷达点云、分割背景并人工修正得到的,成本高昂——这就像给盘点师出考卷,每道题的“标准答案”都要老师亲手反复校对。

机器人和具身智能同样受益。扫地机器人用占据网络判断床底深处能不能钻进去;仓储机器人靠它规划货架间的通行路线;甚至 AR 设备也能在扫描房间时“脑补”被家具遮挡的墙面,把虚拟物体稳稳地“放”在真实空间里。占据网络从一篇论文,成长为连接感知与决策的通用空间语言。

从方格纸上的手动标记,到马路上毫秒级实时盘点的 AI 系统,占据网络让机器拥有了“即使看不见,也能推断出来”的空间直觉。这,就是未来智能体理解三维世界的通用语言。

Nvoxels  =  (Ls)3\displaystyle N_{\text{voxels}} \;=\; \left(\frac{L}{s}\right)^{3}
边长为 $L$ 的立方体空间,用边长 $s$ 的体素填充时,所需体素数量与 $s$ 的三次方成反比。
  1. 空间边长$L$ 是感知范围(如车辆前方 50 米)的边长。
    LL
  2. 体素边长$s$ 是单个体素的尺寸,单位与 $L$ 保持一致。
    ss
  3. 数量爆炸$\left(\frac{L}{s}\right)^{3}$ 说明体素数量随分辨率提升按三次方暴涨,这也是工程优化的主要原因。
    (Ls)3\left(\frac{L}{s}\right)^{3}

AI 应用场景

自动驾驶城市 NOA

阶段:推理部署与在线感知

解决的问题:传统目标检测受限于训练集里的物体类别,遇到“路上横着一根施工围挡”“卡车背后突然蹿出行人”等情况容易漏检。占据网络不依赖具体类别,只回答“这个格子有没有东西”,能在遮挡场景下提前察觉异常。

具体案例:某头部车企的城市辅助驾驶系统接入占据网络后,车辆在通过十字路口时能“透视”对向车流,预测其后方是否存在横穿的行人轨迹。系统在 30 毫秒内完成 200 米范围内的体素占据推理,将鬼探头场景的误刹车率降低了约 40%。

服务机器人室内导航

阶段:离线训练与在线建图

解决的问题:扫地机器人靠碰撞传感器摸索房间,成本低但效率差。借助占据网络,机器人可以从单目相机画面即时推断家具底部、沙发背后等不可见区域的占据情况,避免反复碰撞试探。

具体案例:某家用清洁机器人采用轻量化 OccNet 变体,在 1W 级嵌入式芯片上以每帧 200ms 的速度更新房间占据图。机器人第一次进入客厅就能绕开茶几腿和电视柜底部,清扫覆盖率提升了 25%。

AR 空间实时重建

阶段:在线预测与实时渲染

解决的问题:手机 AR 应用需要把虚拟物体“放置”在真实空间里,但相机只能拍到可见表面。占据网络能预测被遮挡区域的结构,让虚拟物体与真实家具产生正确的遮挡关系。

具体案例:一款家装 App 扫描房间时,用占据网络预测了床底和墙角的结构。用户把虚拟衣柜拖到床边时,衣柜能与床沿产生真实遮挡,而非简单悬浮在半空,下单转化率因此提升约 15%。

Python 演示

python55 行
import numpy as npimport torchimport torch.nn as nn # 1. 合成数据:两个立方块看作“房间里的障碍物”rng = np.random.default_rng(0)boxes = [(0.35, 0.30, 0.35), (0.20, 0.65, 0.70)] def inside(pos):    for (cx, cy, cz) in boxes:        if (abs(pos[0] - cx) < 0.18 and abs(pos[1] - cy) < 0.18                and abs(pos[2] - cz) < 0.18):            return 1.0    return 0.0 N = 4096pts = rng.random((N, 3)).astype(np.float32)labels = np.array([inside(p) for p in pts], dtype=np.float32) # 2. 定义一个微型 OccNet:MLP + Sigmoid 输出占据概率class OccNet(nn.Module):    def __init__(self):        super().__init__()        self.net = nn.Sequential(            nn.Linear(3, 64), nn.ReLU(),            nn.Linear(64, 64), nn.ReLU(),            nn.Linear(64, 1))     def forward(self, x):        return torch.sigmoid(self.net(x)) model = OccNet()opt = torch.optim.Adam(model.parameters(), lr=1e-3)loss_fn = nn.BCELoss() # 3. 训练:用随机采样点拟合占据函数X = torch.from_numpy(pts)y = torch.from_numpy(labels).unsqueeze(1)model.train()for epoch in range(300):    opt.zero_grad()    loss = loss_fn(model(X), y)    loss.backward()    opt.step()    if epoch % 60 == 0:        print("epoch", epoch, "loss", round(float(loss.item()), 4)) # 4. 推理:在 20x20x20 体素网格上逐点查询model.eval()grid = np.stack(np.meshgrid(    np.linspace(0, 1, 20), np.linspace(0, 1, 20),    np.linspace(0, 1, 20)), -1).reshape(-1, 3).astype(np.float32)with torch.no_grad():    occ = model(torch.from_numpy(grid)).numpy().reshape(20, 20, 20)print("predicted occupied voxels:", int((occ > 0.5).sum()))
目的:用 PyTorch 实现一个极简版占据网络,让神经网络学会从随机点坐标预测空间占据概率,完整走通“隐式函数表达 + 点查询 + 二分类输出”的流程。
  1. boxes = [(0.35, 0.30, 0.35), (0.20, 0.65, 0.70)]定义两个立方体当作房间里的“真实障碍物”,构成真值占据来源。
  2. def inside(pos):模拟占据查询函数:给定任意坐标,返回该点是否被障碍物占据。
  3. class OccNet(nn.Module):定义占据网络模型,与论文中的隐式函数结构对应。
  4. self.net = nn.Sequential(...)用三层 MLP 作为解码器,把坐标映射为占据分数。
  5. torch.sigmoid(self.net(x))最终激活函数把分数压缩到 0~1,输出占据概率。
  6. loss_fn = nn.BCELoss()二值交叉熵损失,对应真实 OccNet 训练时的分类损失。

常见误区

误区“训练完 OccNet 之后,模型会直接输出一个建好的三维网格模型,就像 3D 建模软件导出的 OBJ 文件一样。”很多初学者以为占据网络和传统三维重建一样,输出的是显式的表面网格。

正解占据网络输出的本质是一个隐式函数,而不是网格。它只能回答“你问的这个坐标点,被占的概率是多少”。要得到网格,你需要自己按一定的分辨率去密集采样查询点,然后根据概率阈值提取等值面。就像你请的管家不会直接给你一张家具清单,而是你问一个位置、他答一个概率。

为何常见:因为大多数 3D 感知教程都会展示“输入图像 → 输出三维重建图”的成品示意图,导致学习者误以为网格是网络的直接产物,忽略了中间的查询采样过程。

误区“自动驾驶不是都用鸟瞰图(BEV)吗?直接俯视所有物体就够了,为什么要搞三视图那么麻烦?”初学者看到 BEV 感知方案很流行,认为 TPVFormer 的三视图是冗余设计。

正解BEV 只编码了 x-y 平面的布局,高度信息被压缩掉了。立交桥上方有车、隧道上方有横梁、行人身高差异这些信息,在 BEV 里会混成一团。TPVFormer 增加前视和侧视两个平面,正是为了把高度方向的信息补回来。三个视图互相补充,才能让每个体素的特征中没有盲区。

为何常见:因为很多公开的 BEV 可视化图片看起来已经“足够完整”,初学者没有意识到那些可视化其实是融合了多传感器和多帧信息后的结果,并非单靠 BEV 就能获得。

误区“既然格子越小越精细,那把分辨率调到 1 厘米不就能把世界恢复得和真的一样吗?”初学者常把分辨率当成免费午餐。

正解体素数量随分辨率按三次方增长。分辨率翻一倍,计算量翻 8 倍;翻五倍,就是 125 倍。即使是顶级 GPU 也难以实时处理超高分表率。工程上普遍采用“粗到细”的策略:先低分辨率锁区域,再高分辨率细查局部,而不是全图用最高精度。

为何常见:因为直观上“细节 = 质量”,初学者容易忽略硬件算力与实时性约束。就像学生以为“笔记记得越详细越好”,却忘了考试时间有限。

误区“激光雷达已经给了 3D 点云,给每个点标上'车/人/路'不就知道空间了吗?占据网络是不是多此一举?”初学者容易把语义分割与占据预测混为一谈。

正解点云分割只能处理“传感器已经采到”的稀疏点,两点之间的空间一概不知。而占据网络回答的是连续空间中任意位置的占据情况,包括没有点云的区域;它还可以融合相机图像信息,在纯视觉下重建完整几何。语义分割是“给已知的点贴标签”,占据网络是“猜测没被看到的区域”,两者解决的是不同问题。

为何常见:因为视觉上两者都输出彩色/标记的三维空间,结果看起来相似。但输入密度、推理方式、输出含义都有本质区别。

面试题

Q1. 在占据网络中,“体素”最准确的通俗理解是?

单选题 · easy

  • A.三维空间里的一个小格子← 正确答案
  • B.一张二维图像的最小单元
  • C.点云中的一个激光反射点
  • D.神经网络中的一个隐藏节点

答案:A。体素是“体积像素”(Voxel),就是把三维空间切成的立方体小格子。它对应二维图像中像素(Pixel)的概念,而不是点云中的点或网络节点。

Q2. 占据网络的输出本质上是什么?

单选题 · easy

  • A.空间中任意坐标点被占据的概率← 正确答案
  • B.一组物体检测框的坐标列表
  • C.输入图像的语义分割掩码
  • D.相机与激光雷达的外参标定结果

答案:A。占据网络学习一个隐式函数,输入空间坐标(加上条件特征),输出 0~1 的占据概率。它不是输出的框、掩码或标定参数。

Q3. TPVFormer 的“三视图”指的是哪三个平面?

单选题 · mid

  • A.俯视、前视、侧视三个正交平面← 正确答案
  • B.左视、右视、后视三个方向视图
  • C.彩色、深度、红外三个通道图像
  • D.远、中、近三个距离的深度切片

答案:A。TPVFormer 用三个互相垂直的投影平面——俯视、前视、侧视——把 3D 特征分解成三个 2D 平面,再用跨视图注意力融合,兼顾效率与精度。

Q4. 训练占据网络时,交叉熵损失主要惩罚什么?

单选题 · mid

  • A.预测占据概率与真实占据标签的差异← 正确答案
  • B.网络参数数值过大导致过拟合
  • C.输入图像分辨率过低导致模糊
  • D.传感器标定误差引起的偏差

答案:A。交叉熵损失逐格比较预测概率与真值标签(占/空)的偏离程度,偏离越远惩罚越大。它不直接惩罚参数大小,也不处理图像分辨率或标定误差。

Q5. 与固定分辨率体素网格相比,隐式占据函数的最大优势是?

单选题 · extreme

  • A.支持任意分辨率下的连续查询← 正确答案
  • B.完全不需要真值标注数据
  • C.训练时不需要设计损失函数
  • D.推理时不需要做任何计算

答案:A。隐式函数把占据状态建模为连续函数,测试时可以用任意采样密度查询空间。它仍然需要标注和损失函数,推理也必须经过网络前向计算。

Q6. IoU 指标中的"FP"指的是什么?

单选题 · mid

  • A.预测被占据但真实是空闲的格子← 正确答案
  • B.预测空闲但真实被占据的格子
  • C.预测正确且真实被占的格子数
  • D.真值标注中存在争议的格子

答案:A。FP(False Positive)是模型“虚报”的格子:它说这里有东西,实际上没有。IoU 同时惩罚 FP 和 FN,防止模型靠无脑报占据刷分。

Q7. 占据栅格的精细程度主要由什么决定?

单选题 · easy

  • A.体素分辨率(边长大小)← 正确答案
  • B.训练数据集的样本总数
  • C.神经网络的隐藏层数量
  • D.显卡的显存品牌型号

答案:A。体素边长越小,空间划分越细,占据图越精细。数据量、网络深度和显存只是影响能不能跑得动,不直接决定栅格精细度。

Q8. 以下哪些可以作为占据网络的输入来源?

多选题 · mid

  • A.多相机的二维图像← 正确答案
  • B.激光雷达三维点云← 正确答案
  • C.毫米波雷达原始数据← 正确答案
  • D.真值语义分割标签

答案:ABC。占据网络是传感器融合架构,图像、激光雷达点云、毫米波雷达都可以作为输入。真值语义分割标签是训练时的监督信号,不是推理输入。

Q9. “粗到细”多分辨率推理策略的优点包括哪些?

多选题 · hard

  • A.大幅减少计算与显存占用← 正确答案
  • B.让模型精度直接达到世界最优
  • C.缓解训练样本类别不平衡问题
  • D.先捕捉大结构再逐步细化局部← 正确答案

答案:AD。粗到细先用大格子快速锁定候选区域,再用小格子精查局部,减少了无效计算。它优化的是推理效率与细节平衡,不保证 SOTA,也不解决样本不平衡。

Q10. 关于 TPVFormer 三视图融合,下列说法正确的是?

多选题 · mid

  • A.三视图与稠密体素特征性能接近且更省显存← 正确答案
  • B.只用俯视图就能完整重建三维空间结构
  • C.跨视图注意力能聚合三个方向的特征信息← 正确答案
  • D.三视图方案完全无法表达不规则物体形状

答案:AC。三视图把 3D 空间压缩到三个 2D 平面,显著降低开销,并通过跨视图注意力互补信息。只用俯视图会丢失高度信息,三视图同样能表达不规则形状。