跳转至

第 8 章 3D 深度学习感知

第 5 章把点云讲成一种表达,本章把深度学习接到三维表达上:怎么在无序点云上做网络、怎么输出 3D 检测框与占据栅格,以及这些语义输出如何对接导航 costmap。3D 网络的训练细节(数据增广、损失、分布式)不在覆盖范围;生态包的具体可用性标「待核实」。

点云网络的两类输出去向:

flowchart LR
    pc["无序点云"] --> net["点云网络<br/>置换不变"]
    net --> det["3D 检测框"]
    net --> occ["占据栅格 / 语义体素"]
    occ --> cost["导航 costmap"]

1. 点云网络的表达难点与谱系

点云是无序集合,不能用卷积直接吃(卷积假设规则的网格邻域)。网络的应对分两族:

  • 直接集合运算:PointNet 用逐点 MLP + 对称函数(max-pool)得到对点序不变的全局特征;PointNet++ 分层局部聚解决空间细节。属"原始点进、原始点出"。
  • 规则化后卷积:把点体素化或用稀疏卷积(sparse convolution)只在占用格上算,VoteNet 在此之上做特征投票定位中心。

一句名目即可(谱系 PointNet/PointNet++、稀疏卷积、VoteNet),可用性与许可标「待核实」。选型判据:全局分类/分割用 PointNet 族够轻;3D 目标检测要位置精度用体素 + 稀疏卷积或投票式。

第三类做法是把点云投成规则图再借 2D 卷积:激光可投成距离图像(range image)、或压到 BEV 平面成高度/密度通道,RGB-D 可直接用深度图。它复用成熟的 2D 网络与预训练权重,代价是投影有损——同一像素方向上多个点被压成一个,遮挡与重叠信息丢掉。选型因此看任务:只需要平面级的检测与通行性,投影法最划算;要逐点精度或近距抓取,仍要回到原始点。

1.1 置换不变性与体素稀疏率

无序性不是口号,可直接用最小片段看:逐点线性层 + max-pool 对点序完全不变,把坐标按序拼接后过全连接则把顺序写进特征。

rng = np.random.default_rng(0)
pts = rng.random((8, 3))                      # 8 个点在单位立方体内
w, w2 = rng.normal(size=(3, 16)), rng.normal(size=(24, 16))
pool = lambda p: np.maximum(p @ w, 0).max(axis=0)   # 逐点 MLP → max-pool:对称函数,与点序无关
mix = lambda p: np.tanh(p.reshape(-1) @ w2)        # 按序拼接 → 全连接:位置与序号绑定
perm = rng.permutation(8)
## 对同一点集做置换:pool(pts) 与 pool(pts[perm]) 完全相同,mix 的结果随置换改变

规则化的代价是占用率随边长剧烈变化:1 m³ 空间按 2 cm 边长切是 125 000 格,数千个点至多占几个百分点的格;边长减半格数涨 8 倍,1 cm 边长就是 100 万格,按 32 通道特征计内存进入百 MiB 量级。判据由此定:点数远小于总格数时,体素化本身不压缩,稀疏卷积只在占用格上算才有收益;体素尺寸同时是第 5 章所说的精度天花板与内存主项。

实现侧两块。稀疏卷积后端是这个判据的落地手段,spconv 的最小形态是“坐标 + 特征 + 空间尺寸”三件套造稀疏张量:

import spconv.pytorch as spconv

# indices: (N,4) 的 [batch, z, y, x] 整数体素坐标;features: (N, C) 特征
x = spconv.SparseConvTensor(features, indices, spatial_shape, batch_size)
y = spconv.SubMConv3d(in_ch, out_ch, kernel_size=3)(x)   # 只在占用格上卷积
dense = y.dense()                                       # 需要密集输出时取回

TorchSparse 是同一角色的 CUDA 专用实现(速度取向,部署环境受限);Open3D-ML 则把 3D 模型(PointNet/RandLANet 等)、数据集与 Open3D 数据结构打包,适合在已有 Open3D 点云链上直接接一个分割/检测模型。

2. 3D 目标检测

从点云(激光或 RGB-D)输出 3D 框(中心 \(x,y,z\)、尺寸、朝向 yaw),两路输入各有脾性:

  • 激光路:真米制、稀疏、无外观,靠几何形状 + 高度分布(BEV,鸟瞰图投影把 3D 压成 2D 再检测是主流技巧)。
  • RGB-D 路:稠密带颜色,但深度噪声与空洞(第 4 章)直接进网络。

框的表达:中心 + 尺寸 + 朝向(含旋转的 OBB),或从 2D 框 + 深度反投影 3D(依赖单目深度先验,尺度歧义仍在)。朝向是点云检测的老大难——对称物体(如长方体)yaw 有 90°/180° 模糊。

训练头的两种常见形式:anchor / center 类在预定义格或中心点上回归偏移与尺寸,正负样本靠 IoU 阈值划分;朝向用角度分箱加残差回归,把 \(2\pi\) 的周期性拆成有限个箱,避开在 \(\pm\pi\) 处跳变。后处理里旋转 IoU 计算昂贵,多数实现先在 BEV 上做 NMS、再把保留的框投回 3D;对称物体还需额外的对称性处理,否则同一物体在两帧里 yaw 差 90°、下游位姿跟着跳。

评测在 3D 上还多一层 2D 没有的歧义:BEV IoU 丢掉高度。杯子摆在盘子上、箱子叠在箱子上时,两物体在鸟瞰图上完全重叠,按 BEV IoU 划分正负样本会把下面那个判成上面那个的重复框。堆叠场景必须用真 3D IoU 或加高度相关的判别分支;只有高度上天然可分的对象(路面上的锥桶、地面上的车)才适合拿 BEV IoU 当代理。同理,下游抓取要的不只是框,还有可用面的法向与接近方向,这些量网络不给,得从框内局部点云现算。

3. 占据栅格与语义体素

机器人下游最常吃的不是框,而是占据表达:

  • 占据栅格(occupancy grid):2D 平面每格一个占据概率/三值(free/occupied/unknown),与导航 costmap 同构——第 5 章说它是体素的 2D 降维版,这里闭合到工程:语义分割 + 深度反投影 → 逐格投票 → 语义 costmap,把"可通行"从纯几何占据升级成"能踩但可能是草地/禁区"的语义层。直接对接 ROS2-note 第 10 章 costmap 与 robot_localization。
  • 3D 占据(voxel occupancy):立方体每格占据概率,适合无人机/机械臂的体积规划。
  • 语义场景图(semantic scene graph):把物体节点 + 空间/功能关系边组成图,供任务级推理("把桌上的杯子放进水槽"),属研究前沿。

体素尺寸是精度的天花板(第 5 章量化误差 \(v/2\)),也是内存主项(\(\propto 1/v^3\));占据概率用贝叶斯更新累积多次观测(呼应第 6 章 TSDF 加权融合)。

栅格构建有三处容易出错:必须做射线投射——沿传感器到端点连线把中间格标 free、端点格标 occupied,否则只有端点有值、自由空间全是未知;未知区与空闲区要分开,导航里二者代价完全不同;膨胀半径要与机器人外接半径和栅格分辨率匹配,半径小于半格时等于没膨胀。语义叠加时几何与语义的更新要保持独立——几何被新观测推翻时,旧语义不能跟着留下。

4. 开放词汇 3D 感知

把 2D 基础模型的语义搬到 3D:用第 7 章的 CLIP/SAM 在多图 RGB-D 上得 2D 语义掩膜,再靠深度反投影 + 多视图投票把"红色可抓物"这个开放词汇标签抬到 3D 点/体素(概念上即"3D 高斯泼溅/体素 + 2D 特征场",如 feature-atlas / Language-3D 一类)。概览级,具体方法名目与可用性标待核实;判据:需要零样本语义且能容忍语义-几何对齐误差时才上,固定类别直接用第 2 节训练好的 3D 检测器更稳更省。

投票的可靠性可以事先估算:语义对而几何偏时,反投影点落错位置但标签仍对;外参一旦有偏,各视图投出的点云整体错位,投票反而把错误标签固化成多数。因此输出应带支持计数——该体素被几个视图投中、各视图的深度是否有效——并在支持数低于阈值时退回 2D 掩膜,而不是给出一个看似确定的 3D 标签。误差量级同样能先算:深度噪声随 \(Z^2\) 放大(第 4 章),外参角度误差乘上距离就是位置偏差,两者相加即为投票半径的合理取值。

5. 训练数据与自监督边界

一句边界:3D 感知卡在有标注点云稀缺——真值 3D 框标注昂贵、跨域(室内/室外、不同传感器)泛化差。两条缓解:仿真合成数据(第 9 章 Isaac / mujoco-textbook 域随机化 sim-to-real 语境)与自监督预训练(点云 masked autoencoder 类)。调用现成权重、不复现训练全流程,这里只点到"数据从哪来"这一工程约束。

仿真数据的边界在"看起来像不像"之外:真正决定迁移效果的是噪声与缺陷是否也被建模——深度空洞、强度随反射率变化、运动畸变、以及安装高度不同带来的视场差。只做外观随机化、传感器模型仍取理想值,训出来的网络在真机上会先栽在噪声统计上。自监督预训练能缓解标注稀缺,但它学到的表征与检测任务弱相关,仍需少量标注做对齐。

6. 要点

  • 点云无序,网络两族:直接集合运算(PointNet 系)与规则化后稀疏卷积/投票(体素、VoteNet)。
  • 3D 检测两路输入(激光几何 / RGB-D 稠密带噪);框用中心+尺寸+yaw,朝向受对称模糊困扰,BEV 投影是常用技巧。
  • 占据表达最贴下游:语义 + 深度反投影 → 语义 costmap,直接接 ROS 第 10 章;体素尺寸是精度天花板也是内存主项。
  • 开放词汇 3D 感知靠 2D 基础模型语义抬到 3D,仅在需零样本且容忍对齐误差时用。
  • 3D 感知的瓶颈是有标注数据;训练全流程不属这一层,只点数据从哪来的工程约束。

参考文献与延伸阅读

  • Qi, C. R., Su, H., Mo, K., & Guibas, L. J. PointNet: Deep Learning on Point Sets for 3D Classification and Segmentation. CVPR, 2017. arXiv
  • Qi, C. R., Yi, L., Su, H., & Guibas, L. J. PointNet++: Deep Hierarchical Feature Learning on Point Sets in a Metric Space. NeurIPS, 2017. arXiv
  • Zhou, Y., & Krähenbühl, P. Deep Hough Voting for 3D Object Detection in Point Clouds. ICCV, 2019. arXiv
  • Graham, B., Engelcke, M., & van der Maaten, L. 3D Semantic Segmentation with Submanifold Sparse Convolutional Networks. CVPR, 2018. arXiv