1. 静止目标为什么成了感知系统的"盲区"
"静止的东西,为什么自动驾驶最难识别?"这个问题我第一次被问到的时候,下意识觉得是个伪命题——静止的东西明明最好识别啊,它又不会动,位置固定,雷达一扫不就完了?但真正上手做过感知算法的人都知道,恰恰是那些"不动"的目标,才是整个感知链路里最容易出问题的地方。这不是玄学,而是传感器物理特性、算法设计逻辑和真实道路场景三者叠加之后必然产生的结果。
先把结论摆在前面:自动驾驶对静止目标的识别困难,根源不在于"静止"本身,而在于运动补偿机制、多普勒效应盲区、以及训练数据分布偏差这三座大山。任何一套感知方案,只要涉及毫米波雷达、激光雷达或纯视觉,都绕不开这几个问题。这篇文章我会从传感器原理讲到算法设计,再到实际工程中的处理策略,把这件事彻底拆开讲清楚。适合做感知算法、传感器融合、自动驾驶数据标注,或者单纯对自动驾驶技术好奇的读者。
在展开之前,先明确一个概念:自动驾驶里的"识别"不是单一动作,而是一条完整的链路——传感器采集原始信号,经过滤波、聚类、特征提取,再由算法判断"这是什么、在哪里、要往哪走"。静止目标之所以难,是因为它在这条链路的每一个环节都可能被"过滤掉"或者"误判掉"。下面逐层拆解。
2. 毫米波雷达的多普勒效应:静止目标天然被"静音"
2.1 多普勒雷达只对"相对运动"敏感
毫米波雷达测速的核心原理是多普勒效应。雷达发射电磁波,碰到目标反射回来,如果目标和雷达之间有相对运动,反射波的频率就会发生变化。频率偏移量正比于相对速度,公式是:
fd = 2 * v * cos(θ) / λ其中 fd 是多普勒频率,v 是相对速度,θ 是目标与雷达视线的夹角,λ 是波长。这个公式说明一个关键问题:当相对速度 v 接近零时,多普勒频率也接近零。而雷达信号处理中,通常会用一个高通滤波器或者多普勒域的门限来抑制杂波——静止目标的多普勒频率恰好落在被抑制的区间里。
这就是为什么很多毫米波雷达在输出目标列表时,静止目标要么直接消失,要么被标记为"杂波"丢弃。不是雷达"看不见"它,而是信号处理链路主动把它滤掉了。这个设计本身是合理的:如果不滤掉静止回波,路边的护栏、广告牌、井盖、地面金属反射全都会变成目标,雷达输出会爆炸。
2.2 实际工程中的取舍:滤多少才合适
我在实际项目里调过雷达的杂波抑制参数,这里面的取舍非常微妙。滤得太狠,前方停着的故障车、事故锥桶、掉落货物全部漏检;滤得太松,每帧输出几百个静止点,后续聚类和跟踪算法直接过载。
一个常见的做法是基于距离和RCS(雷达截面积)做分级处理。近距离、大RCS的静止目标保留,远距离、小RCS的静止目标抑制。因为近距离大目标更可能是真实障碍物,而远距离小反射更可能是地面杂波或旁瓣泄漏。
| 参数 | 保守策略 | 激进策略 | 实际推荐 |
|---|---|---|---|
| 多普勒门限 | 0.5 m/s | 0.1 m/s | 0.2-0.3 m/s |
| 静止目标保留距离 | < 30m | < 80m | < 60m |
| RCS门限 | > 5 dBsm | > -5 dBsm | > 0 dBsm |
| 输出目标数上限 | 64 | 256 | 128 |
这张表不是标准答案,而是我在几个量产项目里总结出来的经验区间。具体数值要根据雷达型号、安装高度、俯仰角和使用场景调整。比如安装在保险杠下方的雷达,地面反射更强,RCS门限就要适当提高。
2.3 4D成像雷达带来的变化
传统毫米波雷达只有距离、方位、速度三个维度,俯仰角靠多天线估计,精度有限。这几年4D成像雷达开始普及,增加了可靠的俯仰维信息,静止目标的检测能力有明显提升。因为有了高度信息,就可以区分"地面上的井盖"和"地面上的锥桶"——前者高度接近零,后者有几十厘米高度。
但4D雷达也不是万能药。它的点云密度比激光雷达还是差一个数量级,而且成本更高、数据处理量更大。我在一个项目里对比过某国产4D雷达和传统3D雷达对静止车辆的检测率,4D方案在100米处的检测率从62%提升到81%,但误报率也从每帧0.3个上升到1.2个。所以后端的聚类和分类算法必须同步升级,否则只是把问题从"漏检"变成"误检"。
3. 激光雷达的静止目标困境:点云稀疏与地面分割
3.1 点云稀疏导致远距离静止目标"消失"
激光雷达靠发射激光束测量距离,静止目标在单帧点云里就是一堆固定的点。听起来没问题,但实际问题是点云密度随距离平方衰减。一个64线激光雷达在10米处垂直分辨率大概是2厘米,到了50米就变成50厘米,到了100米可能超过2米。这意味着远处一个静止的轿车,在点云里可能只有几个点,甚至一个点都没有。
而运动目标不一样。运动目标可以通过多帧累积来增加点云密度——因为你知道它在动,可以用跟踪算法预测它的位置,把多帧点云对齐叠加。静止目标虽然位置不变,但很多算法不会对它做多帧累积,因为"它又不动,累积它干嘛"。这个思维惯性导致静止目标的点云始终稀疏。
3.2 地面分割算法的"误伤"
激光雷达处理流程里几乎必有一个环节叫地面分割,目的是把地面点和非地面点分开。常见方法有RANSAC平面拟合、栅格高度差法、法向量法等。这些方法对平坦地面效果很好,但遇到以下情况就会出问题:
- 坡道上的静止车辆:地面本身有坡度,平面拟合可能把车辆底部点云误判为地面。
- 低矮静止障碍物:比如倒地的锥桶、石块、宠物,高度只有十几厘米,很容易被地面分割算法"吃掉"。
- 路面上的金属板、井盖:这些是地面的一部分,但反射特性异常,可能被误判为非地面,造成误报。
我踩过最典型的一个坑是:在一个园区场景里,地面分割算法把一辆停着的黑色轿车整个判成了地面。原因是黑色车漆对激光反射率极低,返回的点云强度很弱,加上车辆底盘和地面之间的空隙很小,RANSAC拟合时直接把车顶当成了地面的一部分。后来我们加了强度过滤和高度直方图校验才解决。
3.3 多帧累积的正确打开方式
对静止目标做多帧累积,关键不是"累积不累积",而是"怎么累积"。直接叠加会导致点云模糊,因为车辆自身可能有微小振动,传感器也有噪声。正确的做法是:
- 用IMU和轮速计做ego-motion补偿,把多帧点云统一到同一坐标系。
- 对静止区域做体素滤波,每个体素保留一个代表点。
- 设置累积帧数上限,一般5-10帧足够,太多会引入动态物体的拖影。
这样处理之后,远处静止车辆的点云密度可以提升3-5倍,分类算法的输入质量明显改善。但代价是计算量增加,实时性会受影响。所以通常只在低速场景(比如泊车、拥堵跟车)开启多帧累积,高速场景还是单帧为主。
4. 视觉方案的静止目标难题:训练数据偏差与语义歧义
4.1 数据集的"运动偏见"
纯视觉方案依赖深度学习模型做目标检测。模型的行为高度依赖训练数据分布。而目前主流的自动驾驶数据集,比如Cityscapes、BDD100K、nuScenes,里面标注的车辆绝大多数是运动中的。静止车辆、故障车、事故车、路边长期停放的车辆,占比非常低。
这就导致模型学到一个隐含偏见:路上出现的车大概率在动。当它遇到一辆静止的车时,置信度会明显下降。我做过一个实验,用同一个模型在运动车辆和静止车辆上分别测试,运动车辆的平均检测置信度是0.87,静止车辆只有0.61。这不是模型"看不见",而是它"不确定"。
更麻烦的是,有些静止物体在视觉上和背景高度相似。比如一辆灰色轿车停在灰色墙面前,或者一辆白色货车停在白色建筑旁,边缘特征很弱,模型很容易漏检。
4.2 语义识别的边界模糊
视觉方案还要面对语义歧义。一个静止的物体,它到底是什么?是停着的车、是广告牌上的车、是墙上的车贴、还是后视镜里的车?单帧图像很难区分。运动信息在这里是一个强线索——会动的肯定是真实车辆,不动的就不好说。
这也是为什么视觉方案通常要和雷达或激光雷达融合。雷达提供运动信息,视觉提供语义信息,两者互补。但融合本身又带来新问题:如果雷达因为多普勒盲区没输出这个静止目标,视觉又因为数据偏差置信度低,融合算法该信谁?
4.3 时序信息是视觉方案的救命稻草
解决静止目标视觉检测的一个有效手段是引入时序信息。单帧看不出来,多帧就能看出来:这个物体在过去几帧里位置不变,但周围的树在动、路面的光影在变,说明它是静止的真实物体,不是背景的一部分。
具体做法有几种:
- 光流法:计算像素级运动,静止物体在光流图上表现为零运动区域,结合语义分割可以定位。
- 帧间差分:相邻帧做差,运动物体突出,静止物体消失——但这个方法对静止目标反而是反向的,需要结合背景建模。
- 时序Transformer:把多帧特征输入Transformer,让模型自己学习时序关系。这是目前比较前沿的做法,但计算量大。
我在实际项目里用得最多的是光流+语义分割的组合。先用光流找出所有静止区域,再用语义分割判断这些区域里有没有车辆、行人、障碍物类别。这个方案在低速场景下效果不错,高速场景因为光流计算误差大,效果会打折扣。
5. 传感器融合:静止目标识别的最后一道防线
5.1 前融合与后融合的取舍
传感器融合分前融合和后融合。前融合是在原始数据层面融合,比如把激光点云投影到图像上,每个像素带深度信息。后融合是在目标层面融合,各自检测完再合并。
对静止目标来说,后融合更实用。因为前融合对时间同步和标定精度要求极高,静止目标本身特征弱,前融合容易把噪声也融进去。后融合可以先让每个传感器独立输出候选目标,再用关联算法匹配。即使某个传感器漏检,其他传感器还能补上。
但后融合的难点在于关联。运动目标可以用运动状态关联,静止目标没有运动信息,只能靠位置和外观。位置关联受标定误差影响大,外观关联受光照和视角影响大。所以实际系统里通常会加一个"静止目标专用关联逻辑",放宽位置门限,同时要求至少两个传感器同时检测到才确认。
5.2 典型融合架构与静止目标处理
一个典型的融合架构是这样的:
- 雷达输出运动目标列表和静止目标列表(分开)。
- 激光雷达输出聚类后的点云簇,标记地面/非地面。
- 视觉输出2D检测框和语义分割图。
- 融合模块先做时空对齐,再做关联。
- 对静止目标,采用"雷达+激光"或"激光+视觉"的双确认机制。
- 输出最终目标列表,带置信度和类别。
这个架构里,静止目标的处理逻辑和运动目标是分开的。运动目标可以靠雷达主导,静止目标必须靠激光和视觉主导,雷达只做辅助确认。因为雷达对静止目标的输出本身就不稳定。
5.3 实际道路测试中的表现
我在一个L2+项目里做过统计,融合系统对静止车辆的检测率在白天晴天是92%,夜间是78%,雨天是71%。漏检主要集中在几个场景:远距离(>80米)、强逆光、大雨导致激光衰减、以及车辆颜色与背景接近。
提升手段包括:增加雷达静止目标保留比例、激光雷达多帧累积、视觉模型加入静止车辆专项训练数据。这三招下去,夜间检测率从78%提升到86%,雨天从71%提升到79%。但代价是误报率上升了约15%,需要后端跟踪算法做进一步过滤。
6. 工程实践中的静止目标处理清单
6.1 数据标注阶段的注意事项
静止目标的标注质量直接决定模型上限。我在标注规范里会特别强调几点:
- 静止车辆必须单独标注,不能和运动车辆混在一起。
- 远距离静止目标(>50米)如果点云或图像不清晰,标注为"忽略"而不是"困难"。
- 被遮挡的静止目标,标注可见部分,不要脑补完整框。
- 地面上的低矮障碍物(锥桶、石块、宠物)单独一类,不要归入"其他"。
这些规范看起来琐碎,但实际训练时差别很大。我对比过两版模型,一版用普通标注,一版用静止目标专项标注,后者在静止车辆上的召回率提升了11个百分点。
6.2 算法调参的实战经验
调参这件事没有银弹,但有几个方向是通用的:
- 降低静止目标的分类置信度门限:运动目标用0.5,静止目标可以用0.3,但必须配合跟踪确认。
- 增加静止目标的NMS(非极大值抑制)IoU门限:静止目标容易重叠,IoU门限从0.5提到0.6可以减少误抑制。
- 跟踪算法对静止目标用不同的生命周期管理:运动目标3帧确认,静止目标可以5帧确认,但一旦确认后不要轻易删除。
这些参数不是拍脑袋定的,都是我在实际路测里一版一版试出来的。每次调整都要跑至少500公里的测试数据,看检测率、误报率、以及最关键的——有没有导致误刹车。
6.3 常见问题排查表
| 现象 | 可能原因 | 排查方向 |
|---|---|---|
| 静止车辆漏检 | 雷达多普勒滤除 | 检查雷达静止目标输出配置 |
| 静止车辆漏检 | 激光地面分割误判 | 检查地面分割高度门限 |
| 静止车辆漏检 | 视觉置信度低 | 检查训练集静止样本比例 |
| 静止目标误报多 | 雷达杂波残留 | 提高RCS门限或距离门限 |
| 静止目标误报多 | 激光聚类过分割 | 调整聚类距离门限 |
| 静止目标位置抖动 | 标定误差 | 重新标定外参 |
| 静止目标类别错误 | 语义歧义 | 增加时序信息或融合权重 |
这张表是我在排查静止目标问题时最常用的。每次遇到问题,先对照这张表定位方向,再去查具体参数,比盲目调参效率高很多。
7. 几个容易被忽略的边界场景
7.1 上下坡与桥梁场景
在坡道上,静止目标的雷达回波和地面回波混在一起,多普勒区分度更低。桥梁场景更麻烦,桥面金属结构会产生大量静止回波,把真实静止目标淹没。这种场景下,单纯靠雷达几乎不可能解决,必须依赖激光和视觉。
7.2 隧道与地下车库
隧道内壁和车库立柱都是静止的,而且距离近、反射强。雷达输出会非常密集,后端算法容易过载。我在地下车库测试时遇到过雷达每帧输出超过300个静止点的情况,跟踪算法直接卡死。后来加了距离分区和强度过滤才稳定下来。
7.3 夜间与低光照
夜间视觉方案基本失效,激光雷达点云质量也下降(因为环境光噪声减少,但远距离回波弱)。这时候静止目标识别几乎完全依赖雷达,而雷达又有多普勒盲区。所以夜间是静止目标识别最脆弱的时段。实际系统里,夜间通常会降低车速限制,或者提高融合确认门限,宁可误报也不漏报。
8. 从算法到系统:静止目标识别的整体设计思路
8.1 分层处理架构
我比较推荐的分层架构是:
- 第一层:传感器级。雷达保留静止目标原始输出,激光做多帧累积,视觉做时序增强。
- 第二层:特征级。提取静止目标的几何特征(尺寸、高度、位置)和外观特征(颜色、纹理、语义)。
- 第三层:决策级。融合多源特征,用分类器判断是否为真实障碍物。
- 第四层:跟踪级。对确认的静止目标建立跟踪,监控其状态变化(比如突然移动)。
这个架构的好处是每一层都有明确的输入输出,便于调试和替换。哪一层出问题,就单独优化那一层,不会牵一发动全身。
8.2 评价指标的选择
评价静止目标识别效果,不能只看整体mAP。要单独看静止目标的召回率、误报率、以及首次检测距离。我通常会要求:
- 静止车辆召回率 > 90%(白天)、> 80%(夜间)
- 静止目标误报率 < 0.5个/帧
- 首次检测距离 > 60米(低速场景)、> 100米(高速场景)
这些指标比整体mAP更能反映系统在真实场景下的安全性。
8.3 持续迭代的数据闭环
静止目标的长尾问题特别严重。今天遇到一辆侧翻的货车,明天遇到一个掉落的轮胎,后天遇到一个蹲在路边的人。这些场景在训练集里可能一个都没有。所以必须建立数据闭环:路测发现问题→回传数据→标注→加入训练集→重新训练→OTA更新。这个循环越快,系统对静止目标的识别能力就越强。
我在项目里推动过一个"静止目标专项数据回传"机制,只要系统检测到置信度在0.3-0.5之间的静止目标,就自动回传数据。三个月积累了2万多帧困难样本,重新训练后静止目标召回率提升了8个百分点。这个投入产出比非常高。
9. 一些个人体会
做自动驾驶感知这些年,我最大的感受是:运动目标识别是"显学",静止目标识别是"隐学"。论文里大家都在刷运动目标的检测精度,但真正上路之后,让你出冷汗的往往是那些不动的东西——前方停着的故障车、路中间掉落的货物、突然出现在车道上的锥桶。
静止目标难,难在它挑战了传感器的物理极限,也挑战了算法的设计假设。雷达假设"动的东西才是目标",激光假设"地面可以拟合",视觉假设"车大概率在动"。这些假设在99%的场景下成立,但剩下1%的场景可能就是要命的那1%。
所以我的建议是:如果你在做自动驾驶感知,一定要把静止目标当成一个独立课题来对待,不要指望它作为运动目标识别的副产品自动解决。单独设计传感器配置、单独标注数据、单独调参、单独评价。这件事没有捷径,但每一点投入都会直接转化为系统的安全冗余。
最后分享一个我在实际项目里用的小技巧:在融合输出阶段,对静止目标加一个"保守确认"逻辑——如果雷达和激光都检测到,但视觉置信度低,仍然输出目标,但标记为"低置信度静止目标",下游规划控制模块对这个目标采取保守策略(比如轻微减速、准备接管)。这样既不漏报,也不至于因为误报导致急刹车。这个逻辑在实车上跑了一年多,效果比较稳。