OccNet核心术语扫盲:体素、BEV与环视相机,3D占用预测入门基础

OccNet核心术语扫盲:体素、BEV与环视相机,3D占用预测入门基础

【免费下载链接】OccNet [ICCV 2023] OccNet: Scene as Occupancy 【免费下载链接】OccNet 项目地址: https://gitcode.com/gh_mirrors/oc/OccNet

OccNet(ICCV 2023 论文 Scene as Occupancy)是一个面向自动驾驶的 3D 占用预测(3D Occupancy Prediction) 开源项目:它不再用"边界框"框住物体,而是把整个三维场景描述成"哪里被占了、占的是什么",让车辆真正理解周围空间。本文面向零基础新手,一次性扫盲 体素(Voxel)BEV 鸟瞰图环视相机 三大核心术语,帮你快速迈入 3D 占用预测的大门。

OccNet 3D占用预测体素可视化示意图

上图来自 OccNet 官方仓库(figs/occupancy.gif):上方是环视相机拍摄的真实道路场景,下方则是模型输出的 BEV 视角占用预测结果——不同颜色代表不同语义类别(车辆、道路、植被等),直观展示了"图像输入 → 体素占用输出"的全过程。

一、什么是3D占用预测?为什么比3D目标检测更先进

传统自动驾驶感知依赖 3D 目标检测:用一个个立方体边界框表示车、人、障碍物。但问题很明显——

  • 🚗 车辆形状复杂,一个框无法表达真实轮廓;
  • 🌳 背景(地面、树木、墙面)完全被忽略,模型"看不见"框以外的世界;
  • ❗ 长尾障碍物(躺倒的自行车、施工路障)难以用框描述。

3D 占用预测的思路是:把整个 3D 空间切分成无数小格子,逐一判断每个格子是否被占据、被什么占据。用论文原话说,就是 Scene as Occupancy——"场景即占用"。OccNet 基于 nuScenes 数据集构建了大规模占用基准 OpenOcc,包含 17 个语义类别(含 free 空闲类),同时估计体素的占用状态、语义类别和运动流(flow)。

二、核心术语一:体素(Voxel)——3D空间的最小单元

体素(Voxel)Volume Pixel 的缩写,相当于把 3D 空间像"乐高积木"一样切成一个个小立方体,每个格子就是一个体素,只回答两个问题:这个格子有没有东西?是什么?

在 OccNet 的配置 projects/configs/bevformer/bevformer_base_occ.py 中,你可以看到具体参数:

  • 📐 点云范围(point_cloud_range):前后左右各 40 米,高度从 -1.0 米到 5.4 米;
  • 📦 体素尺寸(voxel_size):[0.2, 0.2, 8],即水平方向 0.2 米一格;
  • 🎨 类别数(occ_class_names):车、卡车、行人、可行驶路面、植被等 17 类。

整个 3D 空间最终被离散成 200 × 200 × 16 的体素网格,每个体素都携带"占用 + 语义"标签。体素的预测在 projects/mmdet3d_plugin/bevformer/dense_heads/bevformer_occ_head.py 中完成,损失函数同时监督占用分类(CrossEntropy)和运动流回归(L1)。

三、核心术语二:BEV鸟瞰图——把三维世界"摊平"

BEV(Bird's Eye View,鸟瞰图) 就是像无人机一样从正上方俯视地面得到的视角。为什么自动驾驶偏爱 BEV?因为在这个视角下:

  • 📏 距离、尺度是真实的,不会因透视而变形;
  • 🚗 车辆之间的相对位置一目了然,便于路径规划;
  • 🧩 多个相机的信息可以在统一坐标系下融合,不再有"每个镜头各说各话"的问题。

OccNet 采用 BEVFormer 架构,在 200 × 200 的 BEV 网格(BEV Queries) 上做特征提取,相关实现位于 projects/mmdet3d_plugin/bevformer/modules/

  • spatial_cross_attention.py:空间交叉注意力,让每个 BEV 格子去环视图像上"找答案";
  • temporal_self_attention.py:时序自注意力,利用历史帧信息提升稳定性。

BEV 相当于 3D 占用预测的"中间画布":先在这张二维鸟瞰图上画好特征,再向高度方向"拉升"成体素。

四、核心术语三:环视相机——自动驾驶的"全景眼睛"

环视相机(Surround Cameras) 指布置在车身四周、覆盖 360° 视野的多路摄像头。nuScenes 数据集标配 6 路相机:前视、前左、前右、后视、后左、后右。

spatial_cross_attention.py 中可以看到 num_cams=6 的默认配置;OccNet 在推理时只使用相机(配置中 use_camera=True, use_lidar=False),不依赖激光雷达——这正是"纯视觉 3D 占用预测"的魅力:硬件成本低,且感知范围不受 LiDAR 探测距离限制。

环视相机的工作方式类似于人眼:每个 BEV 查询点会沿一条"参考射线"投射到对应相机的图像特征上采样(每根柱子上采样 8 个点),再跨相机融合。6 路图像 + BEV 网格 + 高度维度,共同构成了完整的 3D 感知输入。

五、三张王牌如何协同?OccNet的完整推理流程

把体素、BEV、环视相机串起来,OccNet 的推理链路如下:

  1. 📷 6 路环视图像输入,经 ResNet 骨干网络 + FPN 提取多尺度 2D 特征;
  2. 🗺️ BEVFormer 编码器通过空间交叉注意力,把 2D 图像特征"抬升"到 200 × 200 的 BEV 特征图上;
  3. 📊 TransformerOcc 解码器将 BEV 特征沿高度方向展开(配置中的 pillar_h=16),得到 200 × 200 × 16 的体素特征;
  4. 🎯 分类头为每个体素预测语义类别与运动流,最终输出完整的 3D 占用结果。

解码部分实现在 projects/mmdet3d_plugin/bevformer/modules/transformer_occ.py,评估指标采用论文提出的 Ray-based mIoU(沿射线投影计算交并比,而非逐体素计算),代码位于 projects/mmdet3d_plugin/datasets/ray_metrics.py

六、如何快速上手体验OccNet代码?

想亲手跑一遍?参考官方文档 docs/getting_started.md

git clone https://gitcode.com/gh_mirrors/oc/OccNet
  • 📥 下载 nuScenes 数据集与 openocc_v2.1 占用标签,按文档组织目录结构;
  • 🚀 训练:./tools/dist_train.sh projects/configs/bevformer/bevformer_base_occ.py 8
  • 🧪 测试:./tools/dist_test.sh projects/configs/bevformer/bevformer_base_occ.py work_dirs/bevformer_base_occ/epoch_24.pth 1

入门时不必读懂每一行代码,重点是对照着配置文件和三个核心模块(spatial_cross_attention.pytransformer_occ.pybevformer_occ_head.py)理解数据流的走向。

七、结语:从术语到实践的下一步

现在你已经掌握了 3D 占用预测的三大基石——体素定义了"预测什么",BEV 定义了"在哪预测",环视相机定义了"从哪看"。三者结合,就是 OccNet 实现 Scene as Occupancy 的完整逻辑。

下一步建议:用上面的一行命令把模型跑通,再尝试修改 voxel_size 或类别数观察效果变化。实践出真知,祝你在 3D 占用预测的学习路上一路畅通!🎉

【免费下载链接】OccNet [ICCV 2023] OccNet: Scene as Occupancy 【免费下载链接】OccNet 项目地址: https://gitcode.com/gh_mirrors/oc/OccNet

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值