YAOTU INSIGHTS

自动驾驶静止目标检测为何是感知系统的噩梦:多传感器融合与数据闭环实践

自动驾驶静止目标检测为何是感知系统的噩梦:多传感器融合与数据闭环实践
1. 一个反直觉的行业共识越安静的目标越容易从感知系统里消失如果你问一个刚入行的自动驾驶感知工程师什么目标最难检测十有八九他会回答远处的小目标或者被遮挡的行人。但真正跑过路测、处理过corner case的人会告诉你另一个答案静止的东西才是真正的噩梦。这不是玄学而是贯穿整个感知链路的结构性难题。我最早意识到这个问题是在一次封闭场地的测试中。当时车辆以40km/h巡航前方一辆故障车停在车道正中央距离大约80米。按道理说一个两米宽、一米五高的金属物体雷达反射截面RCS足够大激光雷达点云也应该清晰可见但系统直到距离缩到35米左右才触发减速。事后回放数据才发现毫米波雷达把它当成了路边的护栏杂波过滤掉了视觉模块因为缺乏时序上的运动线索把它归类成了背景。这件事让我彻底改变了对静止目标检测的认知。它不是一个单点算法问题而是传感器物理特性、数据标注策略、算法先验假设、以及工程取舍四层因素叠加的结果。这篇文章我想把这几层拆开讲清楚从雷达的多普勒效应、视觉的运动视差到数据集里那些沉默的静止样本再到实际工程中怎么用多传感器融合去兜底。适合做感知算法、传感器融合、以及自动驾驶数据闭环的同行参考也适合对自动驾驶感兴趣、想理解为什么看起来简单的事情反而做不好的读者。2. 毫米波雷达的静止盲区多普勒效应既是功臣也是枷锁2.1 多普勒测速的物理原理决定了静止目标没有信号毫米波雷达常见的是77GHz频段比如AWR2243这类芯片测速靠的是多普勒效应。当目标相对雷达有径向速度时回波频率会发生偏移这个频移量正比于径向速度。公式很简单fd 2 * v * cos(θ) / λ其中fd是多普勒频率v是目标速度θ是目标与雷达视线的夹角λ是波长。77GHz对应的波长约3.9毫米。问题就出在这里当目标静止时v0多普勒频移为零。雷达接收到的回波和发射信号频率完全一致在距离-多普勒图Range-Doppler Map上这个目标会落在零多普勒通道上。而零多普勒通道恰恰是杂波最严重的地方——路面的金属井盖、护栏、广告牌、甚至地面的强反射全都堆在这一列。我实测过一组数据在一条城市快速路上零多普勒通道的信噪比里真实静止车辆的回波强度和路边金属护栏的回波强度差距可能只有3到6个dB。这意味着你没法用一个简单的阈值把车和护栏分开。2.2 为什么不能把零多普勒通道全留下有人会想那我把零多普勒通道的目标都保留不就行了理论上可以但工程上会炸。因为一旦保留所有静止回波你的雷达每帧会多出几百个虚假目标天桥、路牌、隧道壁、甚至地面的接缝都会冒出来。后端的聚类和跟踪模块会被淹没算力扛不住误刹率也会飙升。所以主流做法是用自车运动信息做补偿。车辆自身的速度是已知的来自轮速计或IMU把自车运动带来的多普勒分量从回波里减掉那么真正静止的目标就会在补偿后的多普勒维度上呈现出与自车速度相反的特征。这一步叫静止杂波抑制或者ego-motion compensation。但这里有个坑自车速度估计本身有误差。轮速计在打滑、急加速、轮胎气压变化时会有偏差IMU有零偏。当自车速度估计误差达到0.5m/s时一个真正静止的目标在补偿后可能被误判为以0.5m/s移动从而被运动目标滤波器放行或者被静止滤波器误杀。这就是为什么很多雷达在低速蠕行时对静止目标特别不敏感。2.3 雷达距离方程告诉你静止目标的回波强度还受角度影响再补一个容易被忽略的点。雷达距离方程Pr (Pt * G^2 * λ^2 * σ) / ((4π)^3 * R^4)接收功率Pr与目标RCSσ成正比与距离四次方成反比。静止车辆的RCS通常在10到20平方米取决于照射角度但如果你是从侧面照射一辆车RCS可能掉到1到3平方米。更麻烦的是很多静止目标比如锥桶、故障车的朝向是随机的RCS波动很大。我在处理AWR2243的原始数据时发现同一个锥桶正面照射和斜45度照射回波强度能差10dB以上。这就导致基于固定阈值的检测在角度变化时极不稳定。实操心得做雷达静止目标检测时不要只依赖单一帧的强度阈值。建议引入多帧累积比如3到5帧的非相干积累利用目标在空间上的持续性来对抗RCS波动。代价是会增加约100到150毫秒的延迟需要根据场景权衡。3. 视觉的困境没有运动就没有显著性3.1 光流和运动视差是视觉判断这是不是障碍物的核心线索人类开车时判断前方有个静止障碍物靠的不只是看到它而是它相对于背景没有移动但背景在移动。这个线索叫运动视差motion parallax。视觉算法里对应的概念是光流optical flow。当自车前进时路面、护栏、远处建筑都会在图像上产生光流而一个静止的障碍物比如停在路中间的车在图像上的光流模式会和背景不同——它不随路面一起流动。算法通过这种差异把它分割出来。但问题在于当自车也接近静止时光流整体趋近于零这个线索就消失了。这就是为什么在堵车蠕行、红绿灯起步这些低速场景下视觉对静止目标的检测能力急剧下降。我见过太多demo在高速上跑得很漂亮一到地库入口或者收费站排队就各种漏检。3.2 单目视觉的尺度模糊让静止目标可大可小单目视觉还有一个根本性问题尺度不确定性。一个远处的大卡车和一个近处的小轿车在图像上可能占据同样大小的像素区域。如果这个目标在运动你可以通过它随时间的尺度变化来推断距离但如果它是静止的且自车也在低速移动尺度变化极小你就没法可靠地估计它的真实尺寸和距离。双目视觉或者激光雷达能解决这个问题但成本和标定复杂度上去了。这也是为什么很多L2级方案在静止目标上表现不稳定——它们依赖单目毫米波而这两者在静止场景下都有短板。3.3 语义识别的先验偏差训练数据里静止的车太少了这一点是我在做数据闭环时最深的体会。公开数据集比如一些主流的自动驾驶数据集里绝大多数车辆样本都是行驶中的车因为采集车大部分时间在正常交通流里跑。真正停在车道中间的车、侧翻的货车、掉落的货物这些静止异常目标占比可能不到千分之一。神经网络是有惰性的。当训练集中99.9%的车辆样本都带有运动特征比如车尾灯亮着、有运动模糊、在车道线内正常行驶模型会学到车运动物体这个先验。遇到一个静止的车它的特征分布落在训练分布的边缘置信度就会偏低容易被后处理阈值滤掉。我做过一个对比实验在同一个检测模型上对行驶中的车辆召回率能到98%但对静止车辆尤其是停在非标准位置的召回率只有82%左右。补了大约5000个静止车辆样本重新训练后静止召回率提升到93%但行驶车辆的召回率掉了0.5个百分点。这就是典型的数据分布权衡。注意补静止样本时不要只补停在车位里的车那和行驶车辆的特征差异不够大。要重点补停在车道中间、斜停在路边、部分遮挡的静止车这些真正困难的样本。4. 多传感器融合用冗余对抗盲区但融合本身也有坑4.1 雷达视觉的前融合与后融合在静止目标上表现完全不同后融合决策级融合是各自检测、各自输出目标框然后在目标级做关联。这种方案在静止目标上问题很大雷达因为杂波抑制可能没输出视觉因为缺乏运动线索置信度低两个都半死不活的目标做关联很容易被双双丢弃。前融合数据级或特征级融合是把雷达点云和图像特征在早期就对齐融合。这样即使雷达的静止目标置信度不高视觉的纹理信息比如车尾的红色反光、车牌也能提供补充证据。但前融合对时空同步要求极高雷达和相机的时间戳偏差超过20毫秒在高速场景下就会导致空间对齐错误。我实际项目里的经验是在静止目标检测这个特定任务上前融合的收益明显大于后融合。但前提是标定要准时间同步要做到硬触发或者PTP精密时钟同步。4.2 激光雷达不是万能药但它在静止目标上有天然优势激光雷达直接测距不依赖多普勒也不依赖运动视差。一个静止的物体只要在视场角内、没有被完全遮挡就会产生点云。这是它在静止目标检测上的核心优势。但激光雷达也有自己的问题。第一是稀疏性64线雷达在50米外的点云已经比较稀疏一个锥桶可能只有几个点聚类算法容易把它当噪声滤掉。第二是反射率黑色车辆、脏污的锥桶反射率低点云强度弱。第三是雨雾天气激光衰减严重。我在用nav2导航配合3D雷达做机器人避障时发现对于低矮的静止障碍物比如倒地的锥桶激光雷达的检测高度如果设得不对点云会直接穿过目标打到地面导致漏检。解决办法是调整安装高度和俯仰角或者用多雷达拼接补盲。4.3 融合策略的工程取舍宁可误刹不可漏刹在静止目标这件事上工程上有一个残酷的取舍误刹率和漏检率不可能同时最优。你把静止目标检测的灵敏度调高误刹就多比如把天桥阴影、路面反光当成障碍物调低漏检就多。我参与过的一个项目最终采用的策略是分层处理场景策略目标高速巡航60km/h保守检测只对高置信度静止目标响应控制误刹避免高速急刹追尾城市中低速20-60km/h中等灵敏度融合雷达视觉激光平衡低速蠕行/泊车20km/h高灵敏度允许一定误刹优先保证不碰撞这个分层策略的核心逻辑是高速下误刹的代价被追尾可能比漏检还大而低速下漏检的代价撞上静止障碍物更严重。所以灵敏度要随速度动态调整。5. 数据闭环静止目标的长尾只能靠真实数据喂出来5.1 公开数据集里静止目标的分布偏差前面提到训练数据的问题这里展开说。主流自动驾驶数据集在采集时车辆大部分时间处于正常行驶状态静止目标尤其是异常静止目标天然稀少。这就导致一个悖论你最需要模型学会的场景恰恰是数据里最少的。我统计过一批公开数据里车辆类别的标注其中停在车道内、非停车位的车辆占比不到0.3%。而这类场景在真实道路上的出现频率虽然也低但一旦出现就是高风险。这就是典型的长尾问题。5.2 用影子模式挖掘静止目标corner case解决思路之一是影子模式shadow mode。让量产车在后台跑感知模型但不参与控制只记录模型输出和真实场景的差异。当模型对某个静止目标置信度低、但人类驾驶员做了避让动作时这个片段就被标记为corner case回传到云端。我在做数据闭环时筛选条件一般设这几条自车减速度超过2m/s²但感知系统没有输出对应障碍物雷达在零多普勒通道有持续回波但视觉没有对应检测激光雷达点云聚类出一个静止簇但融合后目标被丢弃这三条能捞出一批高质量的静止目标漏检样本。捞回来之后人工标注再加入训练集迭代几轮静止召回率会有明显提升。5.3 合成数据能补一部分但别指望它解决全部问题现在很多团队用仿真生成静止目标数据。好处是可控、量大、标注免费。但仿真数据的域差距domain gap在静止目标上特别明显仿真的车辆纹理、光照、雷达RCS模型都和真实有差距。我试过纯用仿真数据训练静止目标检测在真实数据上测试召回率提升只有真实数据的一半左右。比较务实的做法是仿真数据用来做预训练和增广真实corner case数据用来做微调。比例大概是3:1到5:1。6. 几个容易踩的坑和我的处理经验6.1 时间同步没做好融合等于白做这个坑我踩过两次。一次是雷达和相机的时间戳来自不同时钟源偏差在30到50毫秒波动。在静止目标上因为目标不动空间对齐误差看起来不大但一旦自车在动雷达坐标系和图像坐标系的对应关系就错了。表现就是融合后的目标框位置飘忽跟踪ID频繁切换。解决办法用PTP精密时间协议做硬件级时间同步或者至少用同一个触发源给所有传感器打时间戳。软件层面做时间对齐时插值不要超过一个传感器周期。6.2 标定漂移在静止目标上更难发现外参标定如果有一两度的偏差在运动目标上可能只是精度下降但在静止目标上可能导致雷达点云和图像目标完全对不上。因为静止目标没有运动线索来纠正这种偏差。我的做法是每次数据采集前用一个已知尺寸的标定板在车辆前方不同距离和角度做一次快速校验。如果发现偏差超过阈值先重新标定再采集。6.3 别忽略静止的定义本身最后说一个哲学层面的坑静止是相对的。一个目标相对地面静止但相对自车可能在运动自车在动。一个目标相对自车静止但相对地面在动比如同速行驶的前车。感知系统要区分的是相对地面的静止还是相对自车的静止这两个概念在算法处理上完全不同。我见过有团队把相对自车静止的目标当成静止目标处理结果在跟车场景下把前车误判为静止障碍物触发了不必要的急刹。这个bug查了很久才定位到。实操建议在代码里明确定义静止的参考系。一般用相对地面静止作为静止目标的定义通过自车运动补偿来实现。跟车场景下的前车应该归类为运动目标即使相对自车静止。7. 写在最后的一点个人体会静止目标检测这件事本质上是在对抗感知系统的运动偏见。雷达靠多普勒、视觉靠光流、甚至神经网络都倾向于关注运动的东西因为运动意味着变化变化意味着信息。但现实世界里最危险的东西往往是安静的——停在路中间的车、掉落的货物、蹲在路边的人。我做了几年感知最大的感受是不要指望某一个传感器或者某一个算法能解决静止目标问题。它是一个系统工程需要雷达做好ego-motion补偿、视觉补足静止样本、激光雷达提供冗余、融合策略做好分层取舍、数据闭环持续喂养corner case。任何一环掉链子静止目标就会从系统里消失。如果你正在做相关的工作我的建议是先把数据闭环搭起来让真实道路上的静止目标漏检能被系统性地捞出来。算法可以慢慢调但没有数据调无可调。