做自动驾驶感知的同学都知道激光雷达这套东西前几章还在讲坐标变换、点云滤波、地面分割这些“热身”内容到了第4章才算真正进入感知的核心区从原始点云里把目标“挖”出来。这一章我花的时间比前三章加起来都多踩的坑也最多。如果你正卡在“点云能显示但模型不出效果”这个阶段这篇内容应该能帮你少折腾两周。这章的核心是基于点云的目标检测与分割算法往下我会把整体设计思路、关键模块的细节取舍、完整实操流程和排障经验一次讲透。不管你是刚转入这个方向还是已经被各种网络结构绕晕了按这个思路走一遍整个激光雷达感知链路会清晰很多。1. 整体设计思路与算法选型1.1 从三维空间到结构化特征的本质转变激光雷达每帧输出的是几万到十几万个点每个点带着xyz坐标和反射强度有的还带时间戳和物体ID。这个数据形态和图像有本质区别无序、稀疏、密度随距离衰减。你不可能像CNN处理图像那样直接把它喂进卷积网络因为同一组点换个顺序矩阵就变了但物理意义完全没变。所以第4章所有算法的根本出发点就是把无序点云变成有序结构。主流有三条技术路线路线代表思路优点缺点2D投影法鸟瞰图BEV、前视图Range View可直接用成熟2D网络投影过程丢失细节近处远处分辨率不均体素法Voxel-based如体素特征提取保留三维结构适合稀疏数据空体素多算力浪费分辨率受限原始点法PointNet系列、PointPillars变体保留原始几何信息邻域搜索耗时工程复杂度高我当时调研了几个方案最后选了2D投影法中的BEV视角作为主链路。原因很实际整车的规划模块最终需要的是目标在水平面上的位置和速度BEV视角拿到的就是俯视图目标框天然带朝向角省去大量坐标换算而且鸟瞰图里目标尺寸不会因距离产生透视畸变远处的车不会像前视图那样缩成一团。这个选择背后有个关键原则感知算法的选型不是越复杂越好而是要看下游任务饿不饿。如果你的下游只是AEB紧急制动前视图快速检测可能就够如果要走城市NOA全场景BEV几乎是绕不开的。第4章的“详解”如果只在某个单点算法上钻牛角尖对整体项目推进其实帮助有限。1.2 主干网络与任务头的配合逻辑确定了BEV路线之后流程是三段式点云预处理 → 特征提取网络 → 任务头输出。预处理负责把点云栅格化成固定尺寸的BEV图每个网格统计点云的高度最大值、强度均值、密度等特征相当于把三维空间“压扁”成多通道的二维图像。特征提取网络这块我当时用的是一套轻量级卷积主干没有直接堆ResNet这种重网络因为BEV图本身分辨率不高一般是0.1m到0.2m的网格太深的网络反而容易过拟合。任务头分两个分支一个走目标检测输出3D框的中心点、长宽高和朝向角另一个走语义分割给每个网格标注是地面、车辆、行人还是障碍物。这里有个很多新手会忽略的点检测和分割不要做成两个完全独立的网络共享特征能显著降低算力开销。我在实际项目里让两个任务头共享前四层卷积特征后面的层才分开训练时联合loss推理时两个头同时出结果。这样做的直接好处是分割分支能帮检测分支把边界框的角点修得更准检测的置信度也能反过来剔除分割的误检。1.3 为什么第4章要卡在“检测分割”这个位置回顾整套激光雷达算法体系的排布第1章是传感器标定第2章是点云预处理第3章是定位与构图到了第4章才轮到感知目标提取其实是有内在逻辑的检测和分割要用的干净点云全靠前几章铺垫而第4章检测/分割出来的目标又是后续第5章目标跟踪、第6章行为预测的直接输入。如果你跳着学先跑通检测再回去补预处理后面会反复回来改数据流的接口返工成本非常高。这一点也是我想对自学的人强调的每一个章节的算法都对上一个环节的输出质量有硬性假设。比如预处理环节的地面分割如果做不干净第4章的检测器会把地面点当成障碍物出现大量虚警反过来如果检测框输出抖动太大第5章跟踪滤波怎么调参数都压不住。算法链路的依赖性比想象中强得多。2. 核心模块解析与实现要点2.1 点云预处理栅格化特征到底怎么选BEV栅格化不是把点扔进网格就完事。每个网格内部往往有多个点你需要用统计量来刻画这个网格的内容。以0.15m的栅格尺寸为例一个64线激光雷达近处一个网格可能扫到七八个点远处可能一个点都没有。网格特征选取直接影响上层网络能不能学到判别性信息。我常用的特征通道有这么几个高度最大值区分地面点和物体点的最强特征。一辆SUV车顶高度在1.7m左右地面接近0这个特征一拉就开。高度方差同一网格内点云高度差大说明这里有立体结构一片平的网格方差接近零。反射强度均值路肩、车道线、金属护栏的反射强度和柏油路差异明显这对分割帮助巨大。点云密度/归一化点数物体表面点云密度通常高于地面但也受距离影响需要按距离做归一化。选好特征后有个细节要特别当心不同特征通道的量纲差异极大。高度值通常是米强度是0到255的整数密度是点数。如果不做归一化网络训练时梯度会被高量纲的特征主导。我建议每个通道单独做一次均值和方差的统计然后归一化到零均值单位方差保存下来作为训练集的统计量推理时直接用同一组参数。2.2 目标框回归与朝向角处理的几个关键细节3D目标检测的输出比2D检测多一个维度多了朝向角但问题也出在这个朝向角上。这里有个非常经典的工程坑朝向角存在周期性角度0度和360度表达的是同一个方向如果网络直接回归角度数值loss在周期边界处会异常跳变。比如真实值是5度模型预测355度差的绝对值只有10度但直接算loss却是350度。解法常见有两种简单的是把角度拆成sin和cos两个值回归复杂一点的是引入方向分类头先判断大致朝向再回归残差角度。我的经验是只用sin/cos回归还不够因为当目标出现在图像边缘时朝向角的观测本身就模糊需要靠跟踪模块的平滑来修正。第4章阶段更重要的是把框的尺寸和中心点回归准朝向角允许存在小误差等第5章卡尔曼滤波会把这些误差吃掉。如果你在做第4章时盯着朝向角精度死磕反而会忽略更核心的中心点偏移问题。中心点偏移是另一个容易被低估的细节。BEV俯视图里一个目标通常只占十几个网格如果目标中心恰好在两个网格的交界处任何基于网格的检测头都会面临量化误差。我们的做法是在网格内部加一个小的offset回归头让网络输出中心点在网格内的亚网格坐标。这一步不要省直接决定了最终检测框在连续帧之间的平滑度。2.3 数据增强与正负样本分配的独家经验点云数据的增强和图像数据不太一样图像随便平移旋转都合理点云平移旋转要考虑传感器坐标系的物理约束。我常用且验证有效的几种全局旋转绕Z轴随机旋转5到10度相当于模拟车辆航向角变化。这能提升模型对场景朝向的泛化能力。全局平移小幅度随机平移模拟车辆在同一车道的横向抖动。GT采样增强从其他帧复制真实目标点云粘贴到当前帧的空旷区域。这招对提升稀疏目标如远处行人的召回特别有用。强度扰动给反射强度通道加高斯噪声提升对传感器老化或天气衰减的鲁棒性。正负样本分配这块我踩过最深的坑是用2D检测的IoU阈值思路来划分3D正负样本直接跑偏。BEV里一个目标占的像素本来就少按IoU 0.5划分正样本很多真值框一个正样本都匹配不上。正确做法是中心点距离匹配比如真值框中心点附近1.5m范围内的网格都算正样本然后用高斯核给不同距离的网格分配不同的回归权重。这相当于告诉模型离中心越近的网格对回归结果的贡献越大。实测下来这个改动比换更强的backbone提升还大。3. 完整实操流程与参数配置3.1 数据准备与标注格式处理第4章算法的训练数据一般来自自采数据或开源数据集。如果是自采标注格式基本都会转成统一的框体格式例如中心点坐标(cx, cy, cz)尺寸(length, width, height)以及绕Z轴的偏航角yaw。实操时第一件事就是做数据体检别直接开训我整理过一个检查清单标注框的尺寸是否有异常值比如小于0.3m的“车”或者长宽比超过5的“行人”多半是标注错框。各类别样本数量极不均衡时要么做类别重采样要么在loss里给稀有类别加权。同一个真值框附近是否有大量重复标注数据合并时经常出现会严重干扰正样本分配。传感器外参的时间戳对没对齐外参标定差了2cm栅格化后特征倒不会崩但框的精度上限会被框死。把数据体检通过后再按8:1:1划分训练、验证、测试集。划分要按场景而不是按帧否则同一段路前后几帧既在训练集又在验证集精度指标会虚高得没法看。这也是很多人模型验证集指标很漂亮、上线一测就现原形的主要原因之一。3.2 模型训练配置与loss函数设计网络结构选定后训练配置里最重要的三块学习率、batch size、loss权重。我的基线配置供参考优化器用AdamW初始学习率1e-3配合余弦退火调度器总训练epoch数70。batch size能多大就多大我是8卡并行跑的单卡batch要足够覆盖各类别通常单卡batch至少8。loss包含三部分检测框的SmoothL1回归loss、目标分类的focal loss、分割分支的交叉熵loss权重比例接近1:0.5:1。这里有个特别要提醒的细节focal loss在点云检测里的作用被高估了。图像检测里正负样本极不平衡负样本占绝大多数focal loss很关键但BEV已经做过栅格化近处目标区域占网格数比例没那么悬殊我在实际对比中focal loss相比交叉熵提升不到1个点AP反而增加了调参难度。如果你时间紧张先用普通交叉熵把整个链路跑通后面再回头优化。训练过程中必须盯的三个指标训练loss的下降曲线要能看到阶段性台阶验证集AP要按IoU阈值0.5和0.7分别统计0.5代表“大致框住了”0.7代表“框得很准”两者差距过大说明边界框回归不稳分割的IoU指标要单独看因为它直接影响后续的自由空间规划。3.3 模型导出与端上部署的量化细节训练完模型不代表第4章结束还差最后一步部署到车端设备上。我用的平台算力有限需要做两件事用TensorRT做fp16量化加速以及把预处理和后处理逻辑写进推理管线。量化这一步的坑主要出在BEV栅格化里大量用到的动态shape。不同帧点云数量不一样如果你的网络输入是固定分辨率要保证栅格化输出尺寸恒定不要让网络跟着点云数量动态变。如果网络里有动态shape的算子TensorRT要么不支持要么优化效果奇差。后处理部分我用的是基于置信度阈值的NMS阈值一般设在0.4到0.5之间。逐帧NMS有个隐患同一个目标在连续帧里被抑制的情况会波动所以我会额外把上一帧的高置信度检测框作为先验参与当前帧的后处理。这个技巧没有写进任何标准教程里但对消除检测结果闪烁非常有效。第4章的落地点就是让这个模型能稳定输出而不是只在服务器上看着指标好看。4. 常见问题排查与独家避坑经验4.1 模型训练不收敛或Loss爆炸的排查思路现象一loss下降很快但验证集AP一直很低。这几乎可以断定是数据泄漏或特征标准化出错优先检查验证集里有没有训练集的场景帧其次检查验证时用的归一化参数是不是训练集的。如果用的是累积的全局统计量而不是训练集的模型在验证时等于看到了未来信息AP虚高到了真实验证环境立刻打回原形。现象二loss降到一定程度后开始震荡同时验证集指标下降。大概率是学习率过大导致loss在最优值附近来回弹把余弦退火的末段最低学习率调低十倍试一下。点云检测任务的收敛曲线比图像任务更尖锐对学习率更敏感。现象三loss完全不变。检查一下是不是栅格化的尺度参数写反了。我做BEV时用的是0.15m的分辨率有人写成了1.5m每个网格塞进大量点特征全被平均掉网络学不到任何东西。我列一个排查优先级表直接照着查就行优先级检查项判断方法1输入特征是否有明显区分性可视化BEV图看车辆和地面是否有对比2正负样本是否过少统计每帧正样本网格数少于100个就要调匹配半径3学习率和batch size是否匹配打印每一层的梯度范数看是否消失或爆炸4损失函数权重是否失衡分别记录每个loss分项看是否某一项主导5模型结构是否有瓶颈用单帧过拟合测试如果连训练集都拟合不了就是结构问题4.2 点云目标检测的精度瓶颈与实战优化清单如果你已经能训练、能出框但精度达不到预期我会按以下顺序排查这条线我实际走过收益递减时间顺序就是优先级首先加更大范围的数据增强。GT采样增强对远距离小目标尤其有效性能提升最直接。其次调匹配半径和正样本权重把中心点匹配半径从1.5m缩到1.0m或放大到2.0m都试一下这个超参对AP的影响比网络宽度还大。半径过大正样本里混入过多背景网格检测框会偏大过小正样本太少召回率上不去。然后考虑提升输入分辨率。0.15m还是0.2m网格直接影响远处小目标的可分性。分辨率翻倍意味着计算量翻四倍所以要结合算力权衡。如果算力有余量分辨率收益是最稳定的。最后才换更强的backbone。轻量网络换到中等网络AP大概能涨2-3个点但推理延迟可能翻倍。第4章阶段我更推荐先榨干前面几个环节的收益再动网络结构。4.3 部署后检测结果实际路测的诡异问题仿真里跑得好好的上路就翻车这种情况我见得太多了。两个高频问题一个是车辆静止时周围的点云会出现“重影”。这不是算法问题是激光雷达的运动畸变没消除干净。如果第4章的输入没有做去畸变车辆振动和扫描延迟会让同一目标的点云在空间上拉出拖尾检测框自然不稳定。回到第2章检查去畸变参数而不是在检测网络里硬扛。另一个是雨雾天气下的检测框收缩。雨雾会衰减激光强度并产生噪点点云密度整体下降栅格化特征里强度均值偏低模型倾向把目标边缘像素误判为背景。我在训练时给强度通道做随机遮挡增强把一部分点云的强度随机置零模拟雨天信号丢失这招比单纯加噪点有用。还有一个看起来离谱但真实发生的事模型部署到另一台算力更高的设备上效果反而变差了。查到最后是浮点精度问题高算力设备默认跑fp32训练时也是fp32但预处理环节的归一化系数被转成半精度后精度损失被放大。解决方式是全程统一推理精度所有预处理算子在量化前先在目标精度下跑一遍对比输出。5. 从第4章往后看目标跟踪与感知融合的衔接点第4章收尾时你会拿到每帧的检测框和分割掩码但这些都是独立帧的结果。真实场景里车辆连续运动你需要知道这个框是同一辆车还是新出现的车于是下一章目标跟踪就会把第4章的检测输出作为观测值输入。这里我提前说一个非常重要的接口设计第4章的检测输出不要只存框和类别尽量保存一个对象级特征向量。这个特征向量在后续跟踪匹配时可以用来做外观关联能明显降低ID Switch的次数。如果你现在在第4章就预留这个输出位到第5章会非常省事。我习惯在检测模型的特征图顶端接一个额外的embedding分支输出一个128维向量用triplet loss做训练让同一目标的特征向量距离近、不同目标的距离远。在当时训练时这部分会稍微拖慢收敛速度但对整个感知系统的价值在后面几章会完全体现出来。做第4章最大的体会是点云感知算法不是一个独立模型的事而是一整套数据预处理、模型设计、训练调参、工程部署的系统工程。我见过不少人在网络结构上刷各种新SOTA但最后卡在上线的是预处理不稳定、后处理闪烁、精度溢出这些“低级”问题上。建议你也按这个顺序来先跑通整条链路再逐个环节打磨最后再回头用更优的算法替换。这样每一章都能为后面打好基础而不是推翻重来。最后分享一个我每次做新模型都会留的小工具做一个自动记录每次实验的训练配置和指标日志。一开始看起来麻烦等到在多个方案之间对比、要回滚某个参数的时候你会发现它是整个项目里最值得投入的一个习惯。第4章要学的东西很多但把这些工程习惯跟算法一起搭起来后面几章你会轻松很多。
阅读完成 · 觉得有帮助?