ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

激光雷达点云道路目标分割:结构改进与无监督域适应实战

激光雷达点云道路目标分割:结构改进与无监督域适应实战

激光雷达点云的路面目标分割,一直是自动驾驶和机器人领域绕不开的基础问题。标题里藏着两个关键动作:一是对分割模型的网络结构做针对性改良,二是在没有目标域标注的前提下,用无监督域适应把模型从“源域”搬到“目标域”。这两件事分开做都有人试过,但真正把它们合到一个任务里,并且让模型在换场景后依然能稳住分割精度,才是这篇内容想要解决的问题。适合正在做LiDAR感知、点云语义分割算法落地,或者被跨场景数据折磨过的研究者和工程师看。

这类项目最反直觉的一点是:很多时候模型在训练集上mIoU已经不错了,可一旦换到新的路口、新的传感器配置,分割结果立刻变得一塌糊涂。真正难的不是把源域拟合好,而是让模型学会“适应未知环境”。所以下面我按解决思路、模型结构改动、域适配策略、训练细节到问题排查的顺序,把这套方案的所有核心环节都拆开来讲。

1. 先拆标题:三个关键词里藏着什么需求

1.1 道路目标分割到底难在哪

LiDAR点云分割和图像分割有一个本质区别:图像里每个像素都有颜色和纹理上下文,而点云是稀疏的、无序的,只有三维坐标和反射强度。道路、车辆、行人、骑行者在点云里的形态差异极大——道路是连续的地面流形,车辆是具有明显平面结构的刚体,行人则是一小簇离散点。

这种数据特性决定了通用图像分割模型不能直接拿来用。你需要处理的数据量很大(一帧通常有数万到十几万个点),同时每个点能用的特征维度却很少(可能只有x, y, z, intensity四个通道)。而且类别极不平衡:道路上绝大多数点属于“地面”和“道路”这两个背景类,真正的前景目标只占了很小比例。如果直接用交叉熵训练,模型很容易被背景类带偏,小目标的召回率会非常难看。

1.2 “无监督域适应”解决的是什么痛点

域适应可以理解成:你在A城收集了带标注的点云数据,把模型训好了;现在要部署到B城,但B城没有标注数据,传感器安装高度、激光束数目、路面植被风格、车辆外形都不同,模型直接跑过去精度会大幅掉点。

所谓无监督,指的是目标域只提供原始点云,不提供任何人工标注。这时候模型要想办法从源域带出来的经验中“自学”适应目标域的地貌和物体形态。对比有监督微调,无监督域适应成本更低,也更接近真实量产落地的场景——毕竟你不能要求每个新项目都先人工标注上万个点云帧。

1.3 改进模型结构在这条链路里的地位

如果没有一个足够稳健的分割基座,后面做域适应全是空中楼阁。结构改进的目标不是堆参数,而是让模型对目标的尺度变化更敏感、对边界细节更友好、对目标域的分布偏移有一定鲁棒性。实际工程中我们发现,光改模型结构不加域适应,跨场景掉点可能超过15个mIoU;光加域适应不改结构,源域精度又会被结构瓶颈卡住。所以标题里两件事是互为杠杆的关系。

2. 模型结构设计:怎么把点云分割网络改得更“抗造”

2.1 主干选型:稀疏卷积是绕不开的地基

处理大场景LiDAR点云,最稳的做法是先做体素化,再用稀疏卷积(Sparse Convolution)做特征提取。把点云按比如0.05米的分辨率划分到体素格子中,空白区域就不参与计算,这样几十万个点在实际计算时依然可控。

我见过不少团队一开始用PointNet++这类基于点的方法,但说实话,在道路场景这种动辄上百米范围的点云上,基于点的方法做全局上下文聚合效率偏低。稀疏卷积配合U型编码器-解码器结构,是公认的性价比方案。关键点是:编码器部分用标准稀疏卷积快速扩大感受野,解码器部分用转置稀疏卷积上采样,同时把编码器中间层的特征通过跳跃连接拼回来,恢复边界细节。

2.2 结构化改动一:多尺度空洞稀疏卷积模块

单纯堆层数能提升精度,但计算量会急剧上升。实际效果更好的做法,是在编码器的后两个stage引入多尺度空洞稀疏卷积。具体来说,对同一份特征图分别用空洞率1、2、4的稀疏卷积分支提取特征,然后拼接融合。这样模型能同时看到短距离的精细结构和长距离的上下文关系,专门针对“远处的小行人和近处的大货车”这种尺度跨度极大的道路场景。

空洞卷积的核心好处是:不增加参数量,却让感受野成倍扩大。有人会问,为什么不直接用更大的卷积核?因为在稀疏卷积体系里,大卷积核会把邻近体素都激活,导致稀疏程度下降,内存和耗时同步上涨。空洞卷积则能在保持计算开销可控的前提下,换取更大的感知范围。

2.3 结构化改动二:轻量级3D注意力模块

常规做法是在解码器输出后直接接一个softmax分类头。这种方式对每个点的特征独立处理,忽略了通道之间的相关性。我在这套结构里加了两个轻量级注意力:一个是通道注意力,让网络自动去强调对当前目标更关键的feature map;另一个是空间注意力,在BEV投影后的特征上学习一个权重图,帮模型把注意力放到车辆和行人聚集的区域。

这两个模块加起来增加的参数量不到整体模型的5%,但在小目标类别上的mIoU能涨2到3个点。原因不复杂:注意力机制给解码器提供了自适应的“软选择”,让上下文信息有选择性地流向边界恢复阶段。

2.4 为什么针对结构改进本身也是个研究点

很多复现工作喜欢把结构改进和域适应分成两个独立模块来调,但从训练行为看,两者是一体的。结构改进会影响伪标签的质量,而域适应训练中反传的梯度又会反过来影响编码器的特征分布。如果编码器结构太浅、感受野不够,生成的伪标签会带着系统性偏置,比如把远处的行人错误地标成杆状物,后用再复杂的域对齐手段也纠正不回来。

所以我的建议是:先不加域适应,把源域mIoU练到满足预期的水平;再检查特定困难类别(行人、骑行者、围墙)的精度是否被结构瓶颈卡住。如果卡住了,优先调整结构而不是调域适应参数。这个顺序能大幅减少调试时的变量。

3. 无监督域适应方案:在没有标注的前提下让模型“入乡随俗”

3.1 域差异的主要来源

域差异不只是传感器型号不同这么简单,它体现在三个层面:几何分布差异(不同城市道路宽度、建筑高度不一样)、强度分布差异(不同激光雷达对同一物体的反射强度记录不同)、类别分布差异(某个地区自行车特别多,另一个地区货车比例高)。三者叠加起来,直接导致源域模型对目标域特征空间产生错位。

3.2 整体方案:伪标签自训练加对抗对齐

成熟的做法是把伪标签自训练和对抗特征对齐两套机制放在一个框架里,优势互补。伪标签方法能提供类别级别的直接监督信号,但容易受噪声影响;对抗对齐方法能隐式拉近两个域的特征分布,但不提供明确的类别边界信息。结合起来,既能利用目标域的具体结构,又能遏制伪标签噪声的传播。

训练分两个阶段推进。第一阶段,用源域数据训练一个初始分割模型,得到基础特征提取能力。第二阶段,冻结网络参数,用初始模型在目标域数据上做预测,按置信度筛选得到伪标签。随后用源域标签加目标域伪标签一起继续训练,同时加入对抗判别器做域对齐。这样的流程跑两轮,效果一般比单轮自训练高出5到8个百分点。

3.3 伪标签生成:置信度阈值是成败的关键

伪标签质量直接决定自训练的上限。我的做法是把主干网络预测出的softmax概率作为置信度,按类别分别设置阈值。比如地面和道路这类易分类别,阈值可以设低一些(0.6即可),因为它们的特征非常稳定;而行人和骑行者这类易混淆类别,阈值要提到0.9以上,宁可丢失一部分监督信号,也不要让错误的硬标签把模型带坏。

为什么按类别区分阈值?因为不同类别的分类难度差异巨大,统一设0.8会导致简单类别召回不足、困难类别噪声过大。按类别自适应设置阈值,本质上是给每个类别一个“选伪标签的准入标准”,非常有效。

3.4 对抗对齐:梯度翻转层加域判别器

对抗对齐的工程实现比较成熟:在编码器末端特征上接一个域判别器(多层感知机),目标是把特征区分成“来自源域”还是“来自目标域”。同时,在编码器的梯度回传路径中插入一个梯度翻转层,让编码器朝着“骗过判别器”的方向更新。这样编码器学习到的特征就会尽量排除域私有信息,保留域不变信息。

这里有个工程细节值得注意:梯度翻转的权重不能一直保持恒定。训练初期用较小的翻转系数,避免源域分割精度被对抗训练冲击;训练中期逐步加大,让域对齐在模型已经稳定的基础上进行;后期适度衰减,防止模型在目标域上过拟合到某些伪标签错误上。这个系数曲线需要用两三个实验才能确定,但对最终精度影响非常大。

3.5 损失函数设计:谁该占据主导地位

整体损失由三部分构成:源域的有监督分割损失,目标域伪标签上的分割损失,以及域判别器的对抗损失。分割损失我推荐使用带类别权重的交叉熵加上Lovász Softmax损失。前者提供全局的梯度信号,后者针对mIoU指标做直接优化,两者配合在类不平衡时非常实用。对抗损失权重一般控制在0.01到0.1之间,太高会干扰分割分支的收敛,太低又起不到域对齐效果。

伪标签损失和源域损失的权重配比需要动态调整。训练刚开始时,伪标签噪声大,源域损失权重应该更高;随着训练进行,模型在目标域上的预测越来越自信,再逐步增加伪标签损失的权重。我习惯用简单的线性升温策略,从0.1升到0.5,实测下来比固定0.5更稳。

4. 训练落地:从数据预处理到调参的完整细节

4.1 点云预处理流程

在送入模型之前,必须对原始点云做标准化处理。第一步是按距离裁剪,把超过70米的点去掉,因为远处的点过于稀疏且标注质量参差不齐。第二步是降采样,在固定体素内保留一个点,或者用体素平均强度作为代表点,控制每帧点数在合理范围内。第三步是强度归一化,不同传感器的强度范围不一致,通常要把强度压到0到1之间再做后续计算。

4.2 体素分辨率选型

体素分辨率直接决定精度和显存消耗的取舍。常用的是0.05米,对近距离目标的结构刻画比较好;但如果目标域场景范围很大,0.05米会导致体素数量爆炸,把显存占满。这时候可以把体素分辨率放宽到0.1米,全局精度会掉1到2个点,但训练速度和显存占用会显著改善。建议做法是:训练时用0.05米硬扛,推理部署时再按设备性能调整到0.1米甚至0.15米,配合后续的轻量化在校准精度上的损失。

4.3 两阶段训练的配置参考

第一阶段(源域预训练):学习率用余弦退火从1e-2降到1e-4,经验上要比一上来就训练完整模型稳定得多。第二阶段(域适应自训练):学习率降到1e-3再到1e-4,并且给编码器部分使用较小的学习率,解码器和域判别器使用较大的学习率。原因很简单:编码器在源域已经学到了较多通用特征,不宜大改;解码器和判别器需要快速适配目标域信息,需要更高的更新幅度。

阶段学习率伪标签置信度对抗损失权重训练轮数
源域预训练1e-2 -> 1e-4不使用030
域适应自训练1e-3 -> 1e-40.6-0.9(按类别)0.0520

4.4 数据增强与防止过拟合

点云特有的增强手段包括:全局随机旋转(尤其在BEV视角内的水平旋转)、随机缩放、随机翻转、全局点云dropout。增强变换必须保持点云语义不变,所以不能像图像那样随意做拉伸扭曲。另一个容易被忽略的点是:域适应训练中,源域和目标域数据要按合理比例混批,而不是先训完源域再只训目标域伪标签。混批能避免模型在源域上灾难性遗忘,同时保持两个域的特征对齐。

4.5 显存控制与分布式训练经验

这种两阶段的训练方式显存压力不小。实际工程中最有效的办法是限制训练时输入的点云帧点数,比如锚定在每帧6万点以内,超出部分随机丢弃或按体素采样降密度。分布式训练时,BatchNorm的统计量需要跨卡同步,否则单卡Batch Size太小会导致域适应训练不稳定。如果条件不允许同步BN,替代方案是用GroupNorm替代所有BN层,收敛会慢一些但跨卡结果一致性更好。

5. 踩坑实录:常见问题与排查方法

5.1 目标域精度不升反降

这是域适应训练中最常见的灾难。我遇到的情况中,八成是因为伪标签噪声太大,模型被错误监督信号带偏。排查思路是:把伪标签渲染出来逐帧检查。如果车辆轮廓残缺、行人数量明显少,大概率是置信度阈值过低;如果伪标签里出现大量雪花状噪点,说明源域模型对目标域完全不适应,需要先调结构或加一轮基础域对齐。整体升级路径是:先提高置信度阈值,再降低对抗损失权重,最后检查梯度翻转系数是否过大。

5.2 训练损失震荡不收敛

对抗训练本质上是一个极小极大博弈过程,震荡是常态。如果震荡幅度太大,可以优先降低判别器的学习率,或者给判别器参数做梯度裁剪。另一个有效做法是引入值域截断:对判别器的输出做sigmoid后用标签平滑(正样本标签从1降到0.9,负样本标签从0升到0.1),这种平滑方式能让对抗信号变得更温和,显著改善训练稳定性。

5.3 小目标类别(行人、骑行者)丢失

根本原因是这类目标在点云中占据的体素数量太少了,即使加了类别权重,也难以抵抗背景类别的梯度淹没。我试过三种有效手段:第一,提高小目标类别在损失函数中的权重到背景类的5到10倍;第二,在数据预处理阶段做目标级别的过采样,把包含行人和骑行者的帧重复采样几次,相当于不生成额外数据就让网络多看几遍少数类;第三,在后处理阶段配合连通域分析和形态学膨胀,把不完整的小目标预测补全。三管齐下之后,这类目标的mIoU能提升到接近正常水平。

5.4 代码里的细节坑:体素坐标越界和稀疏张量内存泄漏

写实现的时候最容易出问题的地方是体素坐标计算。点云范围必须和体素网格的长宽高严格匹配,一旦有个别点超出预设范围,稀疏卷积库会直接报错或者静默丢点。稳妥做法是在所有涉及范围操作的环节复用同一个配置文件,避免不同模块各算各的。另一个坑是稀疏张量在循环训练时如果反复创建会导致显存碎片化,解决办法是使用可复用的缓冲池,并且定期释放不再引用的中间变量。

5.5 推理部署时的速度优化

模型练好了不代表能上车跑。稀疏卷积虽然计算量低,但在通用深度学习框架上的算子效率通常一般。我测试过的部署路径是把预先训练好的模型导出为即时编译格式,并在推理阶段设置合适的体素化参数和点云范围。进一步优化可以用半精度推理,精度损失在0.5个mIoU以内,速度能提升近一倍。实测一套5层大小的稀疏卷积主干在单卡上能达到接近实时的处理速度,基本满足在线感知需求。

6. 性能评估与后续演进方向

6.1 评估指标怎么选

道路目标分割的标准指标是mIoU,但对工程落地来说,只报一个mIoU远远不够。我会额外记录每一类的IoU以及耗时的95分位数。如果发现地面和道路的IoU很高而行人和骑行者的IoU明显偏低,说明模型存在类别间不均衡问题,需要回到损失权重做调整。此外,评估时要把场景按距离段拆分。远处目标的IoU普遍低,但如果连近处的IoU也低,那就是模型结构本身的问题,不是数据分布的问题。

6.2 消融实验如何设计

如果你要验证整套方案的有效性,建议按四个步骤做消融:基线模型(无结构改进无域适应)、加结构改进(观察源域和目标域各自提升多少)、加伪标签自训练但去掉对抗对齐(观察对抗对齐的实际增益)、完整方案。顺序不能乱,因为结构改进和伪标签策略之间存在交互。我的经验是把这些结果画成一个表格,每一项都标注清楚配置细节,方便后续调参对照。

6.3 后续可以拓展的三个方向

第一,时序信息融合。单帧分割的稳定性始终有上限,引入连续几帧点云做时序聚合,能显著提升远处小目标的召回率。第二,多模态融合。如果系统同时搭载了视觉相机,可以在域适应阶段加入跨模态监督,用图像的语义信息来辅助校准激光雷达的特征空间。第三,不断迭代伪标签的自训练循环。每轮自训练结束后重新生成伪标签,再次清洗过滤,然后接着训练,一般三轮之后收益会递减,但第一轮和第二轮的提升都很可观。

这套方案虽然脱胎于点云道路目标分割,但里面的思路可以平移到其他3D感知任务上,比如地面分割、障碍物检测,甚至多传感器标定的后处理。关键是记住:结构改进是抬高能力上限,域适应是保住部署下限,两者缺一不可。

最后分享一点个人体会:这类项目最忌一支独秀式调参。源域指标涨得再漂亮,也要时刻盯着目标域的表现;伪标签质量再高,也要定期人工抽查。我现在每次跑完一轮训练,一定会随机抽帧渲染分割结果,用眼睛确认模型“看到”的物体形状是否符合直觉。数据驱动模型有时候会作弊,它记住了源域的纹理模式,到了目标域就失效。人脑校验这一步,目前任何自动指标都替代不了。

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进